Refactor VacancyViewSet
Issue yang Terdapat pada VacancyViewSet
VacancyViewSet adalah sebuah class yang terdapat pada file core/views/vacancies.py
. Class tersebut bertanggungjawab dalam menangani business logic untuk lowongan dalam perusahaan. Dua contoh fungsi yang terdapat pada classVacancyViewSet
adalah create()
dan partial_update()
. Berikut ini adalah isi dari salah satu fungsi, yaitu fungsi create()
.
Dapat dilihat fungsi tersebut memiliki salah satu code smell yaitu long method. Salah satu penyebab fungsi tersebut sangat panjang adalah karena berusaha untuk menangani lebih dari satu tugas seperti contohnya mengecek validitas data dari segi ‘open_time’/‘close_time’, ‘benefits’, ‘amount’, dan ‘responsibilities’. Selain itu terdapat code smell yang juga dimiliki oleh fungsi create()
dan partial_update()
, yaitu code duplication. Apabila dilihat lebih lanjut, terdapat beberapa code duplication yang ada pada fungsi tersebut. Akan tetapi, penulis akan berfokus pada code duplication berikut.
Kerugian yang Ditimbulkan oleh Code Duplication
Dengan adanya code duplication, dapat menimbulkan masalah maintainability. Maintainability yang dimaksud dapat berupa baris kode yang sangat panjang sehingga sulit untuk dibaca maupun terjadinya shotgun surgery.
Cara mengatasi Code Duplication
Salah satu cara yang dapat dilakukan untuk mengatasi duplikasi kode adalah dengan melakukan ekstraksi terhadap potongan kode tersebut menjadi fungsi sehingga fungsi tersebut juga nantinya dapat di-reuse. Dengan adanya ekstraksi fungsi yang dapat di-reuse, maka akan meminimalisir terjadinya shotgun surgery apabila terjadi perubahan/penambahan kode.
Proses Testing
Penulis melakukan perubahan pada kode dengan menerapkan TDD lifecyle untuk memastikan bahwa kode yang dihasilkan dapat di-trace dan implementasi kode tersebut sesuai dengan tes yang dibuat. Berikut ini adalah tes yang dibuat untuk mendukung proses refactoring potongan kode tersebut.
Dalam gambar tersebut, terdapat dua fungsi tes yang masing-masing mengecek perilaku kode apabila menerima tanggal yang valid maupun yang tidak valid. Untuk kondisi yang valid, dicek bahwa apabila menerima input dengan kondisi berikut:
open_time < close_time && open_time >= current_time
Untuk simplifikasi, penulis melakukan generalisasi terhadap akurasi waktu menjadi tanggal. Kemudian terdapat tiga kondisi untuk waktu yang tidak valid, yaitu:
1) open_time < current_time
2) open_time > close_time
3) open_time == close_time
Memang sebelumnya penulis merasa kondisi kedua dan ketiga dapat dilakukan simplifikasi dengan menuliskan ‘≤’. Akan tetapi, terdapat perbedaan error message untuk kedua kondisi tersebut yang membuat kedua kondisi tersebut tidak dapat digabung.
Hasil Akhir
Hasil akhir yang dibuat adalah dengan melakukan ekstraksi potongan kode tersebut menjadi fungsi. Selain itu, fungsi tersebut bersifat static. Berikut ini adalah gambar dari potongan kode yang telah dilakukan refactoring.
Dapat dilihat pada gambar tersebut bahwa solusi yang digunakan adalah dengan melakukan ekstraksi potongan kode tersebut menjadi fungsi date_validator()
. Fungsi ini yang nantinya akan dipanggil pada create()
dan partial_update()
. Dengan adanya fungsi tersebut dapat meminimalisir shotgun surgery apabila terdapat perubahan atau penambahan tertentu pada kode. Selain itu, dapat dilihat bahwa fungsi tersebut tidak memiliki parameter self
yang menandakan bahwa fungsi tersebut bersifat static. Hal ini memiliki dua tujuan, yaitu agar dapat diakses oleh class lain dan agar proses testing dapat dilaksanakan dengan mudah.