Refactor VacancyViewSet

Ilham Darmawan
PMPL DCP
Published in
3 min readNov 14, 2019

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() .

Fungsi Create yang Memiliki Code Smell

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.

Code Duplication yang Ditangani

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.

Tes yang Digunakan Dalam Proses Pengubahan Kode

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.

Hasil akhir berupa fungsi

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.

--

--