Bloaters
Smell → Martin Fowler Code Smells → Bloaters
Semua smell di dalam grup ini berkaitan dengan bagian code yang terlalu gemuk. Bila terlalu banyak code di dalam suatu class atau method, programmer lain akan kesulitan memahami isi code.
Long Method
sourcemaking | refactoring.guru | before | after
Penjelasan
Long Method bagaikan gulungan struk yang panjang tiada akhir, dikira mau ikut lomba struk terpanjang macam kayak Al*amart apa? Atau mau nantang Edho Zell buat borong semua barang di Indom**et?
Penjelasan Smell
Smell ini terjadi ketika ada sebuah method yang terlalu panjang. Method yang terlalu panjang dapat ditentukan dengan beberapa indikator:
- programmer kesulitan memahami method. Perlu membaca dengan detail baris per baris berulang-ulang untuk memahami tujuan code ini
- programmer perlu menuliskan internal comment untuk mengklarifikasi tujuan beberapa line of code
- satu method memiliki banyak tanggungjawab
- terdapat hidden-side-effect di dalam method. Nama method tidak sesuai dengan apa yang dilakukan di dalamnya.
- melebihi N baris. N ini merupakan angka yang ditentukan oleh masing-masing tim. Beda perusahaan atau beda bahasa pemrograman bisa beda angka. Di sourcemaking, dibilang tidak boleh lebih dari 10 baris.
Pada contoh SemesterMenu.java, terdapat method menu
, create
, dan delete
yang melebihi 10 baris.
Penyelesaian
Dilakukan Extract Method pada method menu
, create
, dan delete
.
Lihat hasilnya di package after.
Code di dalam method menu
diekstrak menjadi showSemesters()
, printAndGetMenu()
, dan showSemester()
.
Untuk method create, delete, dan bagian code input menu. Kita dapat melihat terdapat duplicate code yang juga membuat method menjadi panjang. Hal ini dapat diatasi dengan mengakali logic input menjadi method getDateInput
, getIntInput
, dan getStringInput
.
Tambahan
Refactor pada contoh SemesterMenu
ini belum selesai. Terdapat smell Large Class yang akan diurus disini.
Large Class
sourcemaking | refactoring.guru | before | after
Penjelasan Smell
Wih ada inovasi robot multitasking nih dengan memadukan belasan tangannya buat berbagai kerjaan. Dikira Squidward bermutasi dengan Spongebob gara-gara Sandy, tapi ternyata malah bikin panik banyak orang?
Smell ini terjadi ketika ada sebuah class yang memiliki terlalu banyak method dan/atau line of code.
Code yang mengandung Large Class berpotensi melanggar Single Responsibility Principle bila terdapat terlalu banyak jenis tanggungjawab yang dilakukan oleh satu class. Bila Large Class disertai dengan pelanggaran SRP, maka terjadi juga smell Divergent Change.
Pada contoh SemesterMenu.java, class ini bukan hanya berurusan dengan menu dan input console untuk CRUD semester saja. Class ini juga pegang kendali untuk pembuatan vector semester. Class ini juga terbebani dengan banyaknya variasi cara input di method getDateInput
, getIntInput
, dan getStringInput
.
Penyelesaian
Dilakukan Extract Class pada:
- vector Semester dan validasi-validasinya diekstrak ke class baru bernama Semesters.
- fungsi
getDateInput
,getIntInput
, dangetStringInput
dibuat menjadi 3 class yang terpisah. Lalu Extract Superclass menjadi abstract class Console.
Dilakukan Move Method pada:
- fungsi
showSemester
menjaditoString
di class Semester. - fungsi
showSemesters
menjadishow
di class Semesters. - fungsi
isLabelUnique
pindah ke class Semesters.
Lihat hasilnya di package after.
Primitive Obsession
sourcemaking | refactoring.guru | before | after
Penjelasan Smell
Ini tahun 1987 atau 2020? Ngoding aja cuma pakai
int
,float
,char
, samaboolean
doang buat ngoding. Dikira kita masih hidup di zaman yang susah apa?
Smell ini terjadi ketika ada field atau parameter yang memakai tipe data primitif, padahal behavior-nya lebih daripada tipe data yang ia gunakan.
Hal ini tidak terjadi hanya di tipe data primitif int
, float
, dan sebagainya saja. Hal ini juga bisa terjadi di tipe data lain di level abstraksi yang lebih tinggi. Misalnya String
. Intinya adalah, bila programmer menyimpan data dengan sebuah tipe data, padahal behavior dari data itu lebih dari tipe data yang ia gunakan, berarti sebenarnya harus diganti atau dibuatkan class baru.
Perhatikan contoh Mahasiswa.java. Terdapat field name
menggunakan String dan tanggal lahir yang dipecah-pecah menjadi integer. Padahal name
memiliki validasi sesuai dengan regex dalam code, dan tanggal lahir memiliki validasi tanggal harus valid.
Selain itu, terdapat juga field type
menggunakan String. Padahal value type
hanya boleh Reguler atau Global. Selain itu, type
juga digunakan pada MahasiswaGreeter yang di dalam sini terdapat smell switch statement.
Penyelesaian
Dilakukan Extract Class pada name
, dibuatkan class baru bernama FullName. Kemudian replace data value with object pada field name
di class Mahasiswa.
Untuk integer dayOfBirth
, monthOfBirth
, dan yearOfBirth
, kita ganti menggunakan class java.util.Date
bawaan dari Java.
Untuk logic Greeter, kita gunakan replace type code with state/strategy.
Long Parameter List
sourcemaking | refactoring.guru | before | after
Penjelasan Smell
Pengen naik angkot berharap kosong malah penuh. Aku pengen skip malah disuruh naik, udah gitu duduk kiri kanan mepet-mepetan pula, udah kayak apa ini angkot? Aku nemuin code ginian rasanya suruh masukkin data-data yang lagi-lagi ribetin projectnya lagi. RIBET!! RIBET!!!
Smell ini terjadi ketika ada method yang memiliki jumlah parameter yang terlalu banyak. Hal ini membuat code menjadi sulit dibaca dan juga menyebabkan cognitive overload pada programmer karena ada beban memori harus mengingat-ingat letak parameter. Lebih berbahayanya lagi jika parameter memiliki tipe data yang sama. Bisa saja tidak sengaja tertukar posisinya.
Perhatikan contoh WalletNotification.java. Terdapat method balanceNotif(String name, String email, int amount, int current)
.
Penyelesaian
Dilakukan Preserve Whole Object pada method balanceNotif
sehingga menjadi balanceNotif(User user, int amount)
. Karena name, email, dan current balance bisa didapatkan langsung dari object user.
public void balanceNotif(User user, int amount) {
...
}
Data Clumps
sourcemaking | refactoring.guru | before | after
Penjelasan Smell
Data Clump itu bagaikan bucin.. Giliran butuh dibujuk semuanya, kalo enggak ya sudah
Smell ini terjadi ketika ada beberapa field atau parameter method yang selalu dipakai atau dioper bersama-sama. Bila terjadi hal seperti ini, berarti variabel-variabel ini bisa dipertimbangkan untuk digabungkan langsung dalam satu class.
Perhatikan class Kelas
dan Semester
di dalam package before
. Pada kedua class ini, terdapat Date start
dan end
.
Penyelesaian
Karena selalu berbarengan, start
dan end
dipertimbangkan untuk digabung dalam class DateRange
. Agar tidak hanya menjadi smell data class, kita dapat melengkapi class DateRange
dengan behavior tertentu. Contohnya kita tambahkan validasi start
tidak boleh melebihi end
.
Referensi Gambar
Semua gambar referensi mengikuti pictorial gambar pada Refactoring.guru dengan tetap mengutamakan link credit pada sourcemaking.com maupun refactoring.guru