Refactoring merupakan suatu teknik yang digunakan untuk mengidentifikasi design kode dan memodifikasi struktur kode dengan tujuan untuk meningkatkan kualitas design tanpa mengubah behavior kode yang tampak. Hal ini dibutuhkan untuk memudahkan apabila terdapat perubahan pada program karena kode-kode telah terdesign dgn baik. Pada dasarnya pengembangan software adalah berkelanjutan Sehingga apabila terdapat kebutuhan untuk penambahan fitur atau menangani bugs maka akan menghemat waktu dalam hal pemahaman karena kode-kodenya lebih mudah dibaca.

Tiga tahap dasar yang dilakukan dalam refaktoring, yaitu :
1. Mengidentifikasi “Bau busuk” kode (Bad Smells)
Dalam source kode biasanya masih terdapat banyak bad smells. Langkah awal adalah mengidentifikasi
Bad Smells.
2. Lakukan refaktoring yang tepat
Mengubah struktur kode dalam arti perubahan dalam refaktoring. Perubahan-perubahan ini dapat dilakukan secara otomatis oleh tool refaktoring.
3. Jalankan tes untuk memvalidasi perubahan
Langkah ketiga adalah mengoreksi perubahan yang sudah dilakukan. Refaktoring bukan berarti mengubah behavior kode, sehingga tes unit dilakukan untuk membuktikan bahwa behavior dari kode-kode tidak berubah setelah dilakukan refaktoring.

Berikut beberapa jenis bad smells :
1. Duplicated kode
Jika terdapat baris kode untuk logic yang sama tetapi tersebar di beberapa bagian program. Jika ada perubahan logic, dan ada bagian program yang anda lupa/kelewatan untuk update, program anda dalam masalah yang sangat serius.

2. Long Method
kode/method yang panjang lebih akan sulit dimengerti ketimbang kode/method yang hanya terdiri dari beberapa baris kode. Sebisa mungkin, tulislah method yang hanya terdiri dari beberapa baris saja. Jika kode tersebut akan melakukan banyak hal/task, pecah-pecahlah kode tersebut ke beberapa method kecil yang masing-masing melakukan task yang spesifik.

3. Large Class
Salah satu prinsip dasar dalam mendesain sebuah class adalah “High Cohesive”. Biasanya, class yang mencoba untuk melakukan banyak hal (sehingga menjadi besar & bloated) menjadi kurang cohesive.

4. Long Parameter List
Sulit dimengerti dan dapat menimbulkan inkonsistensi.

5. Divergent Change
Sekali lagi masalah cohesiveness. Gejalanya, suatu perubahan kecil mengharuskan adanya perubahan suatu subset dari suatu method, perubahan lainnya lagi, mengharuskan perubahan di subset yang lain pula.

6. Shotgun Surgery
Yang ini lebih parah. Suatu perubahan kode mengharuskan banyak perubahan di banyak class yang berbeda-beda.

7. Feature Envy
Cemburu! Ya, suatu method membutuhkan lebih banyak informasi dari class lain daripada dari class-nya sendiri.

8. Data Clumps
Attribut yang terkumpul bersama-sama tetapi sebenarnya bukan bagian dari class yang sama.

9. Primitive Obsession
Keengganan untuk menggunakan class-class, lebih memfavoritkan primitive types.

10. Switch Statements
Biasanya, switch statements (atau bisa juga conditional logic ‘if’) terduplikasi diberbagai bagian program. Coba pikirkan menggunakan polymorphism dibanding menggunakan switch statements.

11. Parallel Inheritance Hierarchies
Mirip-mirip shotgun surgery. Setiap kali menambah sub-class ke suatu hirarki, penambahan harus dilakukan ke seluruh hirarki yang berhubungan.

12. Lazy Class
Class yang tidak melakukan apa-apa. (Biasanya hasil downsize dari Refactoring). Fungsionalitas dari class tersebut tidak ada yang memakai lagi dalam program.

13. Speculative Generality
Ini berbahaya! Over-engineering! Mencoba memasukkan suatu fitur yang “mungkin nantinya akan dipakai”. Kenyataannya, sering terjadi pada akhirnya memang tidak pernah terpakai.

14. Temporary Field
Atribut suatu object yang hanya dipakai pada kondisi tertentu saja, padahal seharusnya suatu object itu membutuhkan seluruh atributnya.

15. Message Chains
Client meminta sebuah object lain ke sebuah object, dan object yang diminta object tersebut meminta object lain, dan seterusnya. Menjadi tergantung pada struktur navigasi.

16. Middle Man
Jika anda punya class yang mendelegasikan lebih dari setengah responsibility-nya ke class lain, pikirkan lagi apakah class tersebut benar-benar dibutuhkan.

17. Inappropriate Intimacy
Sepasang class yang tahu terlalu banyak detail private satu sama lain.

18. Alternative Classes with Different Interface
Adanya dua atau lebih method yang melakukan hal yang sama, tetapi signature-nya berbeda.

19. Incomplete Library Class
Clas framework yang tidak melakukan apa yang perlu dia lakukan.

20. Data Class
Ini class yang isinya adalah hanya atribut (property, dengan ‘getter’ & ‘setter’). Dumb data holder. Padahal seharusnya suatu object memiliki data dan behavior.

21. Refused Bequest
Sub-class yang menolak fungsionalitas yang disediakan oleh super-class-nya.

22. Comments
Comment digunakan untuk menutup-nutupi ”Bad Smells” di kode. Jika ada comment di program anda, perhatikan disekitarnya, kemungkinan besar ada Bad Smells.

Referensi :
1. http://geeks.netindonesia.net/blogs/norman/
2. Danijel Arsenovski, “Professional Refactoring in Visual Basic”