Sprint 4 — Rayza

Rayza Arasj M.
Energizer AAA
Published in
6 min readApr 17, 2019
Source: https://www.123rf.com/photo_42897394_young-american-man-lying-in-bed-at-hospital-room-sick-or-ill-but-giving-thumbs-up-smiling-happy-and-.html

“The most important thing when ill, is to never lose heart.” — Lenin (Vladimir Ulyanov)

Halo, di sprint ini gua merasa banyak waktu kerja gua yang kebuang karena kondisi gua yang sakit. Namun gua tetep mau berbagi beberapa hal di sprint ini, yaitu:

  • New GIT Flow di ConnectDot and Git Rebase Interactive
  • Refactoring & Design Pattern
  • Automatic Data Seeding / Migration

New GIT Flow di ConnectDot and Git Rebase Interactive

“Git a Life”

— Anonymous

Pada sprint 1 gua udah bercerita sedikit mengenai apa itu git dan beberapa command yang sering dipakai. Gua juga bercerita sedikit mengenai implementasi git di pengerjaan ConnectDot ini. Namun, ternyata masih ada yang kurang dari implementasi awal kami, dimana kami masih memisahkan branch berdasarkan task. Setelah sprint 2, kami sudah menggunakan pemisahan branch berdasarkan PBI sehingga branch kami adalah sebagai berikut :

US/<nomor_PBI>/<nama PBI>/<‘frontend’/’backend’/’auth’>

contoh :

US/22/employee-login-and-register/auth

Ada satu menarik yang pengen gua ceritain tentang git nih, yaitu Git Rebase Interactive. Gunanya buat apa sih? ini waktu itu gua gunakan untuk mengganti commit message yang salah gua tulis. Gimana sih caranya? Gampang, waktu itu gua ingin mengganti commit message 2 commit sebelumnya, oleh karena itu gua gunakan command

$ git rebase -i HEAD~2

Dengan menggunakan command itu akan menampilkan 2 commit terkahir dikarenakn bagian ~2 . Command tersebut akan menampilkan pesan sebagai berikut.

pick f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame

# Rebase 710f0f8..a5f4a0d onto 710f0f8
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

Nah untuk mengubah commit message-nya gua mengubah pick pada commit yang gua inginkan menjadi reword untuk mengubah commit message pada commit tersebut. Setelah gua save dan keluar dari pesan tersebut, gua diminta untuk mengganti commit messagenya, dan Selesai!

Namun tidak hanya untuk mengubah commit message, command $ git rebase -i dapat digunakan untuk banyak hal seperti mengubah urutan commit, mengubah commit, me-squash commit, dll.

Refactoring & Design Pattern

“Code First, Tweak Later”

— R. Azka Ali F. (Yuk-Recycle)

Refactoring adalah aktifitas dimana programmer memperbaiki code yang sudah dibuat, baik secara struktur ataupun secara tulisan code-nya tanpa mengubah fungsionalitas yang sudah ada sebelumnya. Refactoring pasti dilakukan oleh setiap programmer baik amatir maupun profesional.

Buat apa sih refactor? ada beberapa contoh tujuan dari refactoring. Pertama adalah memperbaiki desain dari program. Seiring berjalannya pengembangan perangkat lunak, desain yang dilakukan di awal pasti akan terjadi perubahan. Dikarenakan proses pengembangan yang agile pula, programmer harus dapat beradaptasi dengan perubahan desain yang ada. Oleh karena itu diperlukan refactoring desain program di tengah masa pengembangan perangkat lunak. Kedua adalah memperbaiki code agar lebih mudah dibaca. Selama pengembangan perangkat lunak pasti kita akan melakukan kesalaahn dalam menamakan fungsi atau variable kita dengan menggunakan kata yang kurang mendefinisikan atau ambigu. Oleh karena itu refactoring diperlukan agar beberapa kesalahan penulisan code kita dapat diperbaiki.

Berikut adalah beberapa contoh refactoring yang sudah gua lakuin di pengembangan ConnectDot:

Refactoring penggunaan library agar lebih efisien

Pada refactoring di atas, gua mengganti implementasi cara mengetahui apakah suatu login_id exists. Pada awalnya gua menggunakan count dan melihat jika lebih dari satu maka login_id sudah ada. Lalu setelah disarankan oleh Hasan untuk menggunakan exists dan juga melalui link ini ( https://stackoverflow.com/questions/6868939/in-django-what-is-the-most-efficient-way-to-check-for-an-empty-query-set) gua baru tahu kalau akan lebih efisien jika menggunakan .exists dibandingan menggunakan .count. Menurut gua refactoring in termasuk ke katagori perubaha algoritma ( https://refactoring.com/catalog/substituteAlgorithm.html)

Refactoring kesalahan penggunaan nama variable

Refactoring tersebut merupakan contoh refactoring yang cukup simple. Pad refactoring tersebut gua hanya mengganti nama variable pada payload yang nantinya gua akan berikan. Gua melakukan ini karena pada awal kesepakatan nama variable yang digunakan adalah username, namun kesepakatan tersebut berubah sehingga gua ganti menjadi loginId. Refactoring ini termasuk ke kategori refactor nama variable ( https://refactoring.com/catalog/renameVariable.html)

Design Pattern adalah cara-cara penyelesaian masalah untuk masalah-masalah umum yang terjadi pada perancanaan program. Design Pattern berperan sebagai blueprint yang dapat kita contoh dalam penulisan code yang kita miliki. Berikut adalah catalog dari design pattern:

  • Creational Patterns : Factory Method, Abstract Method, Builder, Prototype, Singleton
  • Structural Patterns : Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy
  • Behavioral Patterns : Chain of Responsibility, Command, Iterator, Mediator, Memento, Observer, State, Strategy, Template Method, Visitor

Pada pengembangan ConnectDot kami pasti memanfaatkan Design Patter, beberapa contoh yang ingin gua ceritakan adalah penggunaan Singleton dan Decorator.

Singleton adalah suatu design pattern dimana memastikan hanya ada satu instance dari suatu object. Design Pattern ini kami gunakan pada Object FirebaseService kami. Kenapa harus singleton? karena pada object FirebaseService ini sudah dimasukkan informasi mengenai app Firebase yang digunakan oleh ConnectDot sehingga kami ingin hanya ada satu instance saja yang akan berkomunikasi dengan app Firebase. Berikut Code dari FirebaseService:

Decorator adalah design pattern dimana kita dapat menambahkan suatu behaviour baru terhadap object / fungsi yang sudah ada. Design Pattern ini kami gunakan dalam bentuk Auth Decorator, dimana dengan menggunakan Auth Decorator terhadap suatu fungsi, diperlukan authroization/authentication terlebih dahulu. Berikut adalah code Decorator kami.

Automatic Data Seeding / Migration

“If you want a database, you don’t go out and say you’re going to write it.”

— Parker Harris

Dengan menggunakan Django, table pada database diwakilkan dengan Model pada django. Model ini nantinya akan dijadikan DB Migration oleh Django. DB Migration berguna agar database dapat bersifat reversible. Dengan menggunakan Django terdapat dua command yang dapat digunakan untuk DB Migration, yaitu:

python3 manage.py makemigrations && python3 manage.py migrate
  • python3 manage.py makemigrations : Berguna untuk mengubah perubahan yang terjadi pada Model Django menjadi script python untuk mengubah database berdasarkan perubahan model tersebut
  • python3 manage.py migrate : Berguna untuk mengimplementasikan migrasi yang sudah ada ke database
Contoh migrasi yang dibuat oleh Django

Terdapat suatu masalah pada file migrasi ini. Masalah tersebut adalah setiap developer diharuskan memiliki urutan dan isi file yang sama persis, oleh karena itu ketika seorang developer melakukan command makemigrations , code migrasi harus langsung di commit dan di push untuk file migrasi developer lain.

Data seeding adalah ̵m̵e̵̶̵n̵̶̵a̵̶̵n̵̶̵a̵̶̵m̵̶̵ ̵̶̵d̵̶̵a̵̶̵t̵̶̵a̵̶̵ ̵̶̵a̵̶̵g̵̶̵a̵̶̵r̵̶̵ ̵̶̵d̵̶̵a̵̶̵p̵̶̵a̵̶̵t̵̶̵ ̵̶̵d̵̶̵i̵̶̵p̵̶̵a̵̶̵n̵̶̵e̵̶̵n̵̶̵ mengisi database dengan data awal agar dalam pengembangan aplikasi backend maupun frontend dapat memanfaatkan data yang sudah ada di database. Pada Django tidak disediakan automatic data seeding, sehingga kami harus membuat data seeding sendiri. Ide dari data seeding yang kami gunakan mirip dengan ide pengisian database pada saat testing, yang dilakukan setiap awal test dengan membersihkan database terlebih dahulu. Script data seeding kami sekarang adalah sebagai berikut.

Dapat dilihat dari script tersebut kami terlebih dahulu menghapus data yang sudah ada di database, lalu mengisi database dengan data seed yang kami inginkan. Agar script tersebut dapat dijalankan seperti script python lainnya (contoh : makemigrations, migrate, shell, dll) script tersebut perlu disimpan di folder app/management/command/seed.py dengan meng-inherit Command class pada django seperti berikut.

Setelah memindahkan script dan menambahkan Command pada script, script dapat dijalankan dengan command berikut

$ python3 manage.py seed

Cukup sekian hal-hal yang mau gua ceritain di blog ini, Thaanks! :)

--

--