Dalam suatu software development project, sering kita memulai project itu dengan gambaran yang jelas akan apa yang akan kita kerjakan. Akan tetapi seiring dengan berjalannya proses development, sering kita mengalami bahwa software yang kita buat semakin sulit untuk dimaintain (ditambah fitur baru, diubah fitur yang telah ada). The software start to rotting.
Design smells – The odors of rotting software
Kita mengetahui bahwa software yang kita buat mulai mengalami rotting ketika salah satu (atau lebih) hal-hal berikut terjadi :
- Rigidity
- Fragility
- Opacity
- Viscosity
- Needless Complexity
- Needless Repetition
- Immobility
1. Rigidity
Rigidity adalah kecenderungan suatu software untuk sulit dirubah. Suatu design adalah rigid bila sebuah perubahan pada suatu modul menyebabkan banyak perubahan pada modul-modul yang lain.
2. Fragility
Fragility adalah kecenderungan suatu software untuk error di banyak tempat ketika suatu perubahan dibuat.
3. Opacity
Opacity adalah kecenderungan suatu software untuk sulit dipahami. Kode program yang berkembang seiring waktu biasanya akan semakin sulit dipahami ketika kode program itu dibaca.
4. Viscosity
Terdapat 2 bentuk viscosity, yaitu : Software viscosity dan Environment viscosity.
Software viscosity. Ketika software developer dihadapkan pada suatu perubahan, sering developer memiliki beberapa cara untuk melakukan perubahan itu. Ada cara yang tetap mempertahankan design yang telah dipakai untuk software itu (design preserving), ada pula cara yang tidak memperhatikan design yang dipakai untuk software itu (hack). Ketika cara design-preserving lebih sulit untuk dilakukan daripada hack, viscosity dari software itu tinggi. Dangan kata lain, lebih mudah untuk melakukan hal yang salah, daripada hal yang benar.
Environment viscosity. Environment viscosity terjadi ketika development environment terlalu lambat dan tidak efisien. Sebagai contoh, ketika waktu compile software terlalu lama, maka developer akan tergoda untuk membuat perubahan yang menyebabkan proses compile tidak lama, meski perubahan yang dilakukannya tidak memperhatikan design.
5. Needless Complexity
Needless complexity adalah design smell yang terjadi ketika design kita mengandung elemen yang tidak berguna pada saat ini.
Dalam suatu project, sering kita mengantisipasi suatu perubahan kebutuhan dengan memberi fasilitas untuk menyelesaikannya (dalam sisi design). Pada awalnya hal ini terlihat sebagai sesuatu yang cerdas, akan tetapi dengan berjalannya waktu, efek yang timbul justru sebaliknya.
Dengan menambah design untuk antisipasi perubahan kebutuhan di masa datang, maka ada bagian design yang tidak berguna dan ini membuat software semakin komplek dan semakin sulit untuk dimengerti.
6. Needless Repetition
Dalam suatu team, programmer A harus menyelesaikan suatu masalah, kemudian ia mencari contoh kode di dalam project yang sedang ia kerjakan yang sesuai untuk permasalahannya, kemudian mengcopy-paste kode itu dan memodifikasi kode itu agar sesuai dengan permasalahannya.
Yang tidak diketahui oleh programmer A bahwa kode itu adalah kode buatan programmer B dimana programmer B juga meng-copy paste dari bagian lain dari project (dan juga memodifikasinya). Bagaimana bila ternyata kode yang di-copy paste oleh programmer B ternyata adalah hasil copy-paste programmer C dari programmer D????
Dari ilustrasi ini terlihat bahwa kode yang di-copy paste ada di dalam project berulang kali dalam bentuk yang berbeda. Duplicate code terjadi, dan abstraction dilupakan. Apa yang terjadi seandainya kebutuhan akan code yang di-copy paste itu berubah? Seluruh Kode yang di-copy paste oleh programmer A,B,C,D juga harus berubah.
Hal ini berbeda ketika abstraction dipegang oleh programmer dan copy-paste dihindari sedapat mungkin. Ketika ada perubahan kebutuhan, maka bagian kode program yang harus berubah hanya satu, bukannya di setiap kode yang di-copy paste oleh masih-masing programmer.
7. Immobility
Sebuah design adalah immobile ketika suatu bagian design dari suatu sistem berguna untuk sistem lain, tetapi usaha dan resiko untuk memisahkan bagian itu dari sistem aslinya terlalu besar.
Referensi :
Agile Principles, Patterns, and Practices in C# ; by Martin C. Robert dan Martin Micah. (Chapter 7)