The Change Preventers

"Change Preventers" adalah smell yang mengindikasikan bahwa ketika melakukan perubahan di satu bagian dari kode, akan menyebabkan banyak perubahan di bagian lainnya. Dampaknya, pengembangan program menjadi lebih rumit dan mahal.

Divergent Change

Penjelasan

"Bayangkan divergent change sebagai pengalaman ingin mengganti warna tombol di sebuah situs web. Seharusnya perubahan yang sederhana, bukan? Tetapi ternyata warna tombol itu digunakan di seluruh situs web, sehingga harus mengubah kode CSS di berbagai file untuk menyesuaikan warna baru."

Seringkali, kita menemui kesulitan untuk menentukan apa yang harus dilakukan oleh kelas ini atau tidak. Ini bisa kita diskusikan bersama dalam tim saat merancang kode, atau kita tunggu sampai ada tanda-tanda yang jelas bahwa kelas ini sering berubah karena berbagai alasan. Cara yang umum untuk memisahkan tugas adalah dengan menggunakan MVC, di mana kita memisahkan model, view, dan controller. Namun, jika ingin lebih terperinci, kita juga bisa menggunakan arsitektur berlapis yang sudah dipelajari dalam kelas DDD.

Code di bawah ini serupa tidak ada masalah, namun bagaimana jika perusahaan ingin membuat fitur baru untuk memperbarui status pesanan? Tentu jika kita satukan di class OrderManager akan menambah beban kerja baru.

Penyelesaian

Lakukan Extract Class ketika ingin membuat manager baru yaitu khusus melakukan update pada order status. Di dalam class OrderManager nantinya akan terdapat method updateOrderStatus() yang dikhususkan melakukan pekerjaan ini.

Treatment lain yang bisa dilakukan pada Divergent Change:

  • Extract Superclass atau Subclass
  • Jika setelah extract class masih memiliki perilaku yang sama, bisa manfaatin inheritance saja.

Shotgun Surgery

Penjelasan

"Aduh ribet banget.. Aku kan cuman ganti satu blok, kenapa warna LEGO lain jadi perlu diubah juga?? Gak jadi ubah aja deh.."

Smell ini terjadi ketika proses terlalu rumit terjadi ketika melakukan sebuah perubahan.

Tidak hanya programmer yang melakukan perubahan, tapi sistem juga bisa.

Lihatlah class ProductManager di bawah ini:

Ketika user ingin mengubah product description, product price, ataupun product stock, maka program akan meminta update pada detail product lain.

Penyelesaian

Lakukan Extract Class pada seluruh manager yang bisa dilakukan. Seperti updateProductDescription(), updateProductPrice(), dan updateProductStock() yang akan memiliki class masing-masing, sehingga user dapat melakukan update pada salah satu product's detail saja.

Treatment lain yang bisa dilakukan pada Shotgun Surgery:

  • Move Method and Move Field
  • Memindahkan perilaku kelas yang ada ke dalam satu kelas. Jika tidak ada kelas yang sesuai untuk ini, buatlah kelas baru.

  • Inline Class
  • Digunakan ketika pemisahan class ternyata membuat lazy class, lebih baik disatukan saja.

Parallel Inheritance Hierarchies

Penjelasan

"Aku punya peliharaan kelinci. Tapi sekarang aku juga ingin punya anjing. Papa tidak mengizinkan karena anjing juga perlu punya kandang sendiri.. Kenapa tidak disatukan saja, kan mereka sama-sama hewan?"

Ketika perubahan diperlukan dalam satu hierarki, perubahan seringkali juga harus dilakukan di hierarki lainnya. Misalnya, jika kita menambahkan jenis karyawan baru ke dalam hierarki karyawan, seperti karyawan paruh waktu, kita mungkin juga perlu menyesuaikan struktur departemen untuk mencerminkan perubahan tersebut.

Sebagai contoh lihatlah code di bawah ini. Terdapat class FullTimeEmployee dan PartTimeEmployee yang extends terhadap class Employee. Selain itu SalesDepartment dan ProductionDepartment yang extends kepada class Department.

Terlihat bahwa class FullTimeEmployee dan PartTimeEmployee extends ke parent class Employee. Namun jika lebih diperhatikan, perilaku di antara kedua subclass ini tidak terlihat mewarisi sifat Employee dengan baik. Sehingga ketika ada jenis employee baru lagi, akan menghasilkan parallel inheritance hierarchies serupa.

Penyelesaian

Dengan menerapkan polimorfisme dan pewarisan yang lebih bijak, maka akan membuat interface baru yaitu Job yang akan diimplement ke FullTimeJob dan PartTimeJob sehingga pembagian dilakukan ke jenis job, bukan jenis employee lagi. Dengan dilakukannya solusi ini, employee juga bisa mendapat Department dan Job yang lebih teratur.

Treatment lain yang bisa dilakukan pada Parallel Inheritance Hierarchies:

  • Move Method and Move Field
  • Menghapus duplikat hierarki kelas paralel dalam dua langkah. Pertama, jadikan instance dari satu hierarki merujuk ke instance dari hierarki lainnya. Kemudian, hapus hierarki pada kelas yang dirujuk.