The Change Preventer

Bad Code Smell
Code Reengineering

The Change Preventer

Smell ini berarti jika kamu melakukan perubahan di satu tempat pada code mu, maka kamu akan harus melakukan banyak perubahan di tempat lain juga

Divergent Change

Divergent Change terjadi ketika programmer melakukan perubahan pada suatu class tetapi kemudian ia juga harus melakukan banyak perubahan pada method/class lain yang sebenarnya tidak berhubungan. Hal ini berarti satu class bertanggung jawab untuk berbagai jenis fungsi atau responsibilitas dan melanggar Single Responsibility Principal, dimana setiap terdapat fungsi lain yang diubah atau ditambahkan, maka class tersebut harus diganti untuk menangani fungsi baru tersebut. Smell ini dapat menyebabkan error yang muncul setiap dilakukan perubahan pada class tersebut sehingga akan memakan waktu yang lebih banyak dalam mengerjakannya. Divergent Change dapat ditangani dengan menerapkan extract class atau extract superclass.

Before

After

Pada contoh code di atas, sebelumnya class Employee yang berfungsi untuk menampung informasi employee, juga menampung method calculateBonus() dan updateAddress(), yang menyebabkan class Employee bertanggung jawab terhadap banyak fungsi, misalnya persenan bonus akan diganti maka akan dilakukan perubahan di dalam class Employee.

Setelah dilakukannya refactoring, yaitu dengan extract class atau membuat class baru sesuai responsibilitasnya masing-masing, sehingga jika ada perubahan yang ingin dilakukan maka akan hanya fokus terhadap class itu sendiri.

Shotgun Surgery

Shotgun Surgery terjadi ketika programmer melakukan perubahan pada sebuah bagian code tetapi kemudian ia juga harus melakukan perubahan-perubahan pada code yang tersebar di class lain. Satu responsibilitas telah terbagi di banyak bagian yang berbeda dalam code. Smell ini dapat menyebabkan pengembangan code akan menjadi lebih rumit dan menambah kemungkinan terjaidnya error jika terdapat banyak class yang harus diganti. Shotgun Surgery dapat ditangani dengan menerapkan move method atau move field menuju sebuah existing class atau new class.

Before

After

Pada contoh code di atas, sebelumnya terdapat dua class, yaitu Customer yang merepresentasikan pelanggan dan OrderProcessor yang bertanggung jawab untuk memproses pesanan. Method updateCustomerName() dan updateCustomerEmail() dalam kelas OrderProcessor memanggil method updateName() dan updateEmail() dalam class Customer. Ketika ingin mengubah logika pembaruan nama atau email customer, programmer harus melakukan perubahan di dua kelas yang berbeda.

Setelah dilakukannya refactoring, yaitu dengan memindahkan fitur updateEmail() dan updateAddress() ke fitur baru yaitu updateDetails(), serta updateCustomerName() dan updateCustomerEmail() ke updateCustomerDetails() sehingga mengurangi dampak dari Shotgun Surgery.

Parallel Inheritance Hierarchy

Parallel Inheritance Hierarchy terjadi ketika setiap programmer membuat subclass untuk sebuah class, ia akan perlu untuk membuat subclass untuk class lain. Hal ini akan menjadi masalah besar jika code memiliki sistem hierarchy yang besar. Smell ini dapat menyebabkan code sulit untuk dipelihara dan rentan terhadap kesalahan. Parallel Inheritance Hierarchy dapat ditangani dengan menerapkan move method dan move field.

Before

After

Pada contoh code di atas, sebelumnya terdapat class Cylinder yang extends dari class Shape, serta class CylinderVolume yang implements dari interface Volume. Code ini bertujuan untuk menghitung volume dari sebuah bangun ruang yang berbasis lingkaran, tetapi jika programmer ingin menambahkan bangun ruang lain, ia harus menambahkan paling sedikit dua subclass untuk dua parent yang berbeda. Misalnya diinginkan untuk code dapat menghitung volume kerucut (Cone), maka programmer harus menambahkan subclass Cone yang extends class Shape dan ConeVolume yang implements interface Volume.

Setelah dilakukannya refactoring, yaitu dengan implements class Shape kepada interface Volume, kemudian class Cylinder dapat extends dari class Shape, hal ini memungkinkan untuk method volume() berada di class Cylinder. Sehingga jika ingin menghitung bangun ruang lain, hanya perlu untuk menambahkan class yang extends dari class Shape.