Refactoring: The Bloater
sesuatu yang berkembang terlalu besar sehingga tidak dapat ditangani secara efisien. Sesuatu tersebut dapat berupa metode yang terlalu panjang, kelas yang terlalu besar, daftar parameter yang terlalu banyak, penggunaan data primitive yang berlebihan, ataupun penggunaan data clumps. Berikut adalah jenis-jenis smell code dari kelompok The Bloater:
-
-
Large Class
-
Primitive Obsession
-
Long Parameter List
-
1. Long Method
Long method atau metode yang panjang merupakan istilah untuk sebuah metode yang memiliki terlalu banyak baris. Secara umum, metode yang memiliki lebih dari sepuluh baris code menunjukkan kemungkinan code yang terlalu panjang, sehingga perlu dianalisa lebih lanjut apakah perlu dipecah menjadi beberapa metode. Membuat sebuah metode dianggap lebih sulit dibandingkan dengan menambahkan beberapa baris code pada metode yang sudah ada. Terutama jika baris code yang ditambahkan hanya sedikit. Namun hal ini adalah penyebab utama membengkaknya suatu metode ketika baris lainnya ditambahkan lagi di kemudian hari.
Penambahan komentar-komentar dalam sebuah metode untuk memperjelas kegunaan variable, logika, atau baris lainnya pada suatu metode juga dapat menjadi sebuah indikasi bahwa baris-baris yang harus dijelaskan terpisah seharusnya dideklarasikan pada metode terpisah. Metode yang baik memiliki nama yang dapat menjelaskan kegunaan dari metode itu sendiri, sehingga penggunaan komentar didalam metode sebaiknya dihindari.
Beberapa cara yang dapat dilakukan untuk memperbaiki kondisi metode yang sudah terlalu panjang adalah:
Long Method Treatment: Extract Method
Teknik ini memecah metode panjang menjadi metode-metode kecil yang lebih spesifik. Setiap metode baru melakukan bagian kecil dari pekerjaan yang sebelumnya dilakukan oleh metode panjang
.
Pada contoh diatas, print detail
dapat diekstraksi menjadi metode lain yang berfungsi untuk melakukan print detail.
Long Method Treatment: Replace Temp with Query
Mengganti temp dengan query. Kondisi yang menempatkan hasil perhitungan (expression) dalam sebuah variable penampung sementara (temp) yang akan digunakan dalam perhitungan selanjutnya, dapat digantikan dengan metode yang bertugas untuk mengembalikan hasil query perhitungan tersebut.
Pada contoh diatas, variable basePrice
digunakan untuk menampung hasil perkalian quantity
dan itemPrice
yang akan digunakan pada seleksi nilai dari basePrice
tersebut. Hal ini dapat dipisah menjadi metode yang melakukan perhitungan dan mengembalikan nilai basePrice
.
Long Method Treatment: Introduce Parameter Object
Memperkenalkan object parameter ketika beberapa metode memiliki sekelompok parameter yang sama.
Seperti pada contoh di diatas, penggunaan parameter dari start date
dan end date
berulang pada tiga metode yang berbeda. Hal ini dapat digantikan dengan sebuah object (dateRange
contohnya) yang dapat menggantikan sekelompok parameter tersebut. Penggunaan object parameter dapat mempersingkat code pada metode tersebut.
Long Method Treatment: Preserved Whole Object
Sebuah metode yang mendapatkan beberapa nilai dari beberapa object yang kemudian di-pass ke metode lain. Hal ini dapat digantikan dengan mempassing keseluruhan nilai object seperti contoh dibawah ini:
Long Method Treatment: Replace Method with Method Object
Memindahkan logika kompleks dari metode panjang ke dalam kelas terpisah. Hal ini memungkinkan pengelolaan state dan logika menjadi lebih terstruktur.
Long Method Treatment: Decompose Conditional
Memecah logika kondisi yang kompleks menjadi metode-metode terpisah untuk meningkatkan keterbacaan dan pemeliharaan kode. .
Pada contoh diatas, conditional operator diubah menjadi metode notSummer()
dan perhitungan charge diextract menjadi metode winterCharge()
.
2. Large Class
Large class merupakan kelas yang berisi banyak fields
, metode
, atau baris code
.
Ukuran kelas pada saat awal dideklarasikan biasanya kecil, namun seiring berjalannya waktu kelas menjadi besar dengan penambahan-penambahan kebutuhan aplikasi. Beberapa hal yang dapat dilakukan untuk mengatasi masalah kelas yang besar adalah:
Large Class: Extract Class
Ekstraksi kelas dapat dilakukan ketika sebuah kelas dapat dibagi menjadi beberapa bagian komponen. Seperti contoh dibawah ini, attribute yang terkait dengan nomor telepon dapat diextract menjadi kelas terpisah yang dihubungkan dengan kelas Person.
Large Class: Extract Subclass
Extract subclass, dapat dilakukan ketika behavior sebuah kelas dapat diimplementasikan menjadi beberapa cara. Seperti pada contoh dibawah ini, JobItem
class dapat diextract menjadi superclass dengan subclass LaborItem
.
Large Class: Extract Interface
Extract Interface. Kondisi dimana beberapa client menggunakan bagian yang sama dari sebuah class, sehingga bagian tersebut dapat diextract menjadi sebuah interface yang dapat diimplementasikan oleh kelas lainnya.
Large Class: Duplicate Observed Data
Duplicate Observed data. Apabila sebuah data bertanggung jawa pada komponen GUI, maka hal ini dapat dipisahkan menjadi sebuah kelas yang khusus menghandle GUI.
3. Primitive Obsession
Smell ini terjadi ketika ada field atau parameter yang memakai tipe data primitif, padahal behavior-nya lebih daripada tipe data yang ia gunakan.
Primitive data type biasanya digunakan untuk
-
object-object kecil yang menjalankan tugas sederhana, seperti mata uang, telepon, dst.
-
Konstanta untuk informasi code, seperti konstanta dari
USER_ROLE
. -
Konstanta String sebagai nama field yang digunakan untuk data array.
Beberapa refactoring yang dapat dilakukan untuk memperbaiki penggunaan primitive data type secara berlebihan:
Primitive Obsession: Replace Data Value with Object
Mengganti nilai data primitif dengan objek untuk meningkatkan keterbacaan, keamanan, dan fleksibilitas kode. Dengan menggunakan objek, kita bisa menambahkan metode khusus yang relevan dengan nilai tersebut.
Primitive Obsession: Replace Type code with Subclasses
Mengganti kode tipe yang digunakan untuk mengidentifikasi jenis tertentu (misalnya, konstanta integer atau string) dengan subclass yang lebih sesuai untuk memodelkan perilaku khusus dari setiap jenis. Ini membantu dalam menerapkan pola desain berbasis objek dan meningkatkan keterbacaan dan pemeliharaan kode.
Primitive Obsession: Replace Array with Object
Mengganti array yang digunakan untuk menyimpan berbagai jenis data dengan objek yang lebih terstruktur dan bermakna. Dengan menggunakan objek, setiap elemen array dapat diberi nama dan tipe yang tepat, meningkatkan keterbacaan dan mengurangi kesalahan.
Primitive Obsession: Replace Type Code with State/Strategy
Mengganti kode tipe yang mengubah perilaku objek berdasarkan nilai tertentu dengan pola State atau Strategy. Pola ini memungkinkan penggantian perilaku objek secara dinamis dengan lebih terstruktur dan modular, meningkatkan fleksibilitas dan keterbacaan.
Primitive Obsession: Replace Type Code with Class
Mengganti kode tipe dengan kelas khusus yang mewakili tipe tersebut. Ini memungkinkan pengelompokan data dan perilaku yang terkait ke dalam satu unit, meningkatkan enkapsulasi dan keterbacaan kode. Kelas ini dapat digunakan untuk memperkenalkan perilaku spesifik dan validasi.
3. Long Parameter List
Penggunaan parameter yang terlalu banyak adalah lebih dari 2 atau 3 parameter.
Kondisi ini merupakan salah satu indikasi bad code smell dari kategori Bloater. Daftar parameter yang terlalu panjang dapat diperbaiki dengan cara mengganti parameter dengan memanggil metode, seperti pada contoh di bawah ini:
4. Data Clumps
Masalah Data clumps sering kali disebabkan oleh struktur program yang jelek atau copypasta programming
Salah satu cara memastikan apakah sekumpulan data merupakan data clumps atau bukan adalah dengan menghapus salah satu nilai data dan mengecek apakah nilai lainnya masih valid. Jika tidak, maka kemungkinan terjadi data clumps sangat tinggi. Beberapa cara untuk memperbaiki kondisi data clumps adalah:
-
Ekstraksi kelas
-
Menggunakan parameter object
-
Preserve the whole object
Kesimpulan
-
Bloater merupakan kondisi dimana sesuatu berkembang terlalu besar sehingga tidak dapat dikendalikan secara efisien.
-
Jenis-jenis smell code yang termasuk kategori bloater adalah long method, large class, primitive obsession, long parameter list dan data clumps
Referensi
-
Steve Halladay. (2012). Principle-Based Refactoring. 01. Principle Publishing. Indianapolis. ISBN: 978-0615690223.
-
Bad Code Smells, https://sourcemaking.com/refactoring/smells
-
The Bloaters,