Ini adalah code smell di mana pendefinisian method terlalu panjang. Tentu saja hal ini dapat menyulitkan pengembang lain atau pengembang yang sama di waktu yang berbeda untuk dapat memahami kode yang ditulis. Selain itu, code smell ini sering kali terhubung dengan pelanggaran Single-Responsibility Principle. Berikut ini contohnya:
publicvoidsomeCalculation(){System.out.println("Langkah 1: inisialisasi"); // kode untuk inisialisasiSystem.out.println("Langkah 2: ambil data dari database"); // kode untuk mengambil data dari databaseSystem.out.println("Langkah 3: pemrosesan data dari database"); // kode untuk memproses data yang telah diambil dari databaseSystem.out.println("Langkah 4: melakukan perhitungan yang kompleks"); // kode untuk melakukan perhitungan yang kompleksSystem.out.println("Langkah 5: Melakukan finalisasi dan mengirim data ke service lain"); // kode untuk finalisasi dan mengirim data ke service lain}
Dalam contoh di atas, methodsomeCalculation melakukan beberapa langkah-langkah yang di setiap langkahnya melakukan hal dengan kewajiban yang berbeda (misal ambil data dari database, melakukan perhitungan yang kompleks, dan mengirim data). Method seperti ini akan sulit untuk dibaca dan dilakukan pemeliharan.
Penanganan Long Method
Beberapa penanganan yang dapat dilakukan untuk long method adalah dengan ekstraksi method. Untuk setiap langkah/kewajiban yang berbeda, kita dapat membuat method tersendiri. Method utama akan memanggil method baru yang dibuat. Dengan cara ini, kode akan lebih mudah dipahami.
Jika diperhatikan, bisa jadi method yang baru didefinisikan perlu data untuk yang didapat dari method baru yang dijalankan sebelumnya (misal performComplexCalculation perlu data dari processData). Dalam hal ini kita dapat membuat processData mengembalikan data dan digunakan sebagai masukan untuk method performComplexCalculation.
public void someCalculation() {
performInitialization();
fetchDataFromDatabase();
processData();
performComplexCalculation();
finalizeAndSendData();
}
private void performInitialization() {
System.out.println("Langkah 1: inisialisasi");
// kode untuk inisialisasi
}
private void fetchDataFromDatabase() {
System.out.println("Langkah 2: ambil data dari database");
// kode untuk mengambil data dari database
}
private void processData() {
System.out.println("Langkah 3: pemrosesan data dari database");
// kode untuk memproses data yang telah diambil dari database
}
private void performComplexCalculation() {
System.out.println("Langkah 4: melakukan perhitungan yang kompleks");
// kode untuk melakukan perhitungan yang kompleks
}
private void finalizeAndSendData() {
System.out.println("Langkah 5: Melakukan finalisasi dan mengirim data ke service lain");
// kode untuk finalisasi dan mengirim data ke service lain
}