Refactoring: The Bloater


The bloater menunjukan 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:

  1. Long Method

  2. Large Class

  3. Primitive Obsession

  4. Long Parameter List

  5. Data Clumps

 

1. Long Method

img

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
.
img

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. img

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. img

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:
img

 

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. img

 

Long Method Treatment: Decompose Conditional

Memecah logika kondisi yang kompleks menjadi metode-metode terpisah untuk meningkatkan keterbacaan dan pemeliharaan kode. . img

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
. img

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.
img

 

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.
img

 

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.
img

 

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. img

 

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.

img

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.
img

 

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. img

 

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. img

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. img

 

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. img

 

3. Long Parameter List

Penggunaan parameter yang terlalu banyak adalah lebih dari 2 atau 3 parameter.
img

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:
img

 

4. Data Clumps

Masalah Data clumps sering kali disebabkan oleh struktur program yang jelek atau copypasta programming
img

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

Bagikan postingan ini

Penulis
Dikhi Martin

Dikhi MartinSoftware Engineer