Skip to the content.

Bloaters

SmellMartin Fowler Code SmellsBloaters

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

Gulungan struk yang panjang tiada akhir

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:

Pada contoh SemesterMenu.java, terdapat method menu, create, dan delete yang melebihi 10 baris.

Penyelesaian

Pecahkan method menjadi beberapa bagian

Dilakukan Extract Method pada method menu, create, dan delete.

Lihat hasilnya di package after.

Jadilah submethod-submethod yang enak dibaca

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

Robot multitasking

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? :scream:

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

Pecahkan class besar menjadi beberapa class

Dilakukan Extract Class pada:

Dilakukan Move Method pada:

Biarkan class-class menjalankan task sesuai kebutuhan

Lihat hasilnya di package after.

Primitive Obsession

sourcemaking | refactoring.guru | before | after

Penjelasan Smell

Objek-objek geometri

Ini tahun 1987 atau 2020? Ngoding aja cuma pakai int, float, char, sama boolean 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

Buat class berisikan variabel primitif

Dilakukan Extract Class pada name, dibuatkan class baru bernama FullName. Kemudian replace data value with object pada field name di class Mahasiswa.

Object class teratur, class lebih mudah menangani object

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

Penuh sesak pokoknya

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!!! :anger:

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

Gunakan method call atau wakilkan sebagai object

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 joget dangdut indo remix

Data Clump itu bagaikan bucin.. Giliran butuh dibujuk semuanya, kalo enggak ya sudah :sob:

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

Fasilitaskan mereka, buat dia nyaman!

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