Belajar mencium bau-nya kode program (code smell)


Seorang programmer yang bergadang dan tidak mandi lebih dari sehari pasti akan bau.   Developer yang jaketnya tidak pernah dicuci selama berbulan-bulan juga akan bau.   Tapi bukan hanya itu, seorang developer yang tidak berhati-hati dalam merangkai kode program bisa menyebabkan kode program-nya menjadi bau!   Berdasarkan artikel dari Wikipedia, code smell adalah gejala yang mengindikasikan terdapat permasalahan pada kode program.  Istilah ini pertama kali dipakai oleh Kent Beck yang juga menciptakan metode pengembangan software Extreme Programming (XP) dan Test Driven Development (TDD).

Code smell belum tentu adalah bug atau kesalahan. Secara teknis, kode program yang “bau” tidak salah dan program bisa berjalan dengan benar.   Akan tetapi bila dibiarkan, kode program yang “bau” tersebut bisa meningkatkan resiko terjadinya kesalahan atau menghambat pengembangan di masa depan.

Sebagai contoh, saya membuat sebuah method yang akan menghasilkan file MVC berdasarkan domain class. Pendekatan paling sederhana adalah mencoba membuat salah satu komponen terlebih dahulu, misalnya memastikan Model bisa dihasilkan dengan baik, seperti pada kode program berikut ini:

void prosesModel(nama) {
    List daftarField = bacaField(nama);
    ...
    // proses daftarField untuk model
    ...
    if (file.exists()) {
    	System.out.println("File sudah ada dan tidak akan dibuat");
    }
    ...
}

void prosesDomainClass(String nama) {
	prosesModel(nama);
}

Kalau dilihat sekilas, kode program di atas terlihat rapi dan nantinya tidak akan ada kode program yang panjang di method prosesDomainClass() karena proses dipecah ke dalam pemanggilan fungsi lainnya.

Lalu, saya perlu membuat fungsi yang menghasil View dan Controller. Karena cara kerjanya mirip-mirip, saya melakukan Copy And Paste Programming, sehingga hasil akhirnya menjadi seperti berikut ini:

void prosesController(nama) {
    List daftarField = bacaField(nama);
    ...
    // proses daftarField untuk controller
    ...
    if (file.exists()) {
    	System.out.println("File sudah ada dan tidak akan dibuat");
    }
    ...
}

void prosesView(nama) {
    List daftarField = bacaField(nama);
    ...
    // proses daftarField untuk view
    ...
    if (file.exists()) {
    	System.out.println("File sudah ada dan tidak akan dibuat");
    }
    ...
}

void prosesModel(nama) {
    List daftarField = bacaField(nama);
    ...
    // proses daftarField untuk model
    ...
    if (file.exists()) {
    	System.out.println("File sudah ada dan tidak akan dibuat");
    }
    ...
}

void prosesDomainClass(String nama) {
    prosesModel(nama + "Model");
    prosesView(nama + "View");
    prosesController(nama + "Controller");
}

Sesungguhnya Copy And Paste Programming adalah sesuatu yang dijauhi dan erat kaitannya dengan hal negatif.   Developer yang melakukan Copy And Paste Programming atau Snarf And Barf Programming biasanya melakukan langkah-langkah berikut ini:

  • Men-copy sejumlah kode program dari wilayah lain yang kira-kira memiliki fungsi yang mirip.
  • Men-paste kode program tersebut ke wilayah baru.
  • Menyesuaikan kode program yang baru di-paste dengan wilayah baru supaya kode program tersebut bekerja.

Lalu, apa salahnya melakukan Copy And Paste Programming?  Bukankah toh kode program bisa jalan dan bisa bekerja sesuai dengan yang diharapkan?

Agar lebih jelas, saya akan mengandaikan bahwa di masa depan saya perlu melakukan perubahan.   Saat ini, kode program di atas tidak akan menimpa file yang sudah ada.   Bagaimana seandainya saya ingin melakukan perubahan agar kode program boleh menimpa file yang sudah ada?   Saya wajib mengubah atau menghilangkan bagian kode program berikut ini:

if (file.exists()) {
   System.out.println("File sudah ada dan tidak akan dibuat");
}

Tapi karena bagian kode program tersebut terduplikasi di tiga method yang berbeda, saya harus mengubahnya di tiga method yang berbeda.   Bila saya lupa mengubah salah satu method, maka perilaku program akan menjadi tidak konsisten dan menimbulkan bug.   Hal ini bisa saja terjadi, terutama bila kode program method sudah semakin panjang dan saya sedang tidak memiliki konsentrasi penuh saat coding🙂

Dalam hal ini, saya menemukan ada yang tidak beres.   Ini adalah salah satu bentuk code smell yang disebut sebagai Shotgun Surgery.  Aroma code smell ini “tercium” bila developer menyadari bahwa untuk melakukan sebuah perubahan perilaku tunggal, harus melakukan banyak perubahan kecil pada lokasi yang berbeda.   Seorang developer yang berpengalaman akan cepat menyadarinya dan segera mencari tahu apa yang tidak beres;  tapi seorang pemula mungkin akan mengabaikannya seolah2 semuanya baik-baik saja🙂

Berikut ini adalah contoh code smell lainnya (sumber):

  • Long Method: Method yang isinya sangat banyak.
  • Large Class: Class yang isinya sangat banyak.
  • Primitive Obsession: Tidak membuat class tersendiri untuk tipe data yang bisa dienkapsulasi ke dalam sebuah class. Misalnya menyimpan nilai uang ke dalam BigDecimal, sehingga operasi konversi kurs mata uang harus diletakkan di class lain. Akan lebih ideal bila terdapat class Uang sehingga nilai ulang beserta operasi konversi kurs bisa diletakkan di class ini.
  • Long Parameter List: Terdapat parameter dengan jumlah banyak.
  • DataClump: Beberapa data yang berbeda tapi sering kali dipakai bersamaan, misalnya variabel “mulai” dan variabel “selesai“.
  • Switch Statements: Penggunaan switch dapat diganti dengan inheritance di OOP.
  • Temporary Field: Sebuah variabel yang memiliki scope lebih luas tetapi hanya dipakai sementara oleh method, bukan untuk pertukaran data bagi method lainnya.
  • Refused Bequest: Class yang tidak ingin memakai methods dari superclass-nya.
  • Alternative Classes with Different Interfaces:: Dua buah class yang berbeda memiliki isi yang sangat mirip tetapi mereka mengimplementasikan dua interface yang berbeda.
  • Divergent Change: Kebalikan dari Shotgun Surgery, dimana developer sering mengubah class yang sama untuk beberapa hal yang berbeda.
  • Parallel Inheritance Hierarchies: Setiap kali membuat subclass dari sebuah class, wajib membuat subclass baru dari class lainnya. Misalnya, setiap kali membuat subclass dari Model bernama MahasiswaModel, wajib harus membuat subclass dari Presenter bernama MahasiswaPresenter.
  • Lazy Class: Class yang tidak berguna atau tidak cukup bermanfaat.
  • Data Class: Class yang hanya berisi atribut (data) dan tidak memiliki method (operasi).
  • Duplicate Code: Kode program yang terduplikasi.
  • Dead Code: Kode program yang tidak dipakai lagi.
  • Speculative Generality: Kode program yang dibuat dengan memikirkan perubahan di masa depan, tetapi bagian tersebut tidak terpakai sama sekali.
  • Feature Envy: Sebuah method sangat bergantung pada data yang ada di class lain, bukan di data milik class tempat method tersebut berada.
  • Inappropriate Intimacy: Dua class yang terlalu berhubungan erat satu sama lainnya.
  • Message Chains: Untuk mendapat data, class A harus memanggil class B yang kemudian memanggil class C lalu mengambil data dari class D; padahal yang dibutuhkan hanya data dari class D.
  • Middle Man: Sebuah class yang fungsinya terlalu sederhana dan tidak memiliki kontribusi selain hanya mendelegasikan tugasnya ke class lain.

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: