Mengasah kualitas kode: prinsip clean code soal penamaan, method kecil dan YAGNI/DRY, mengenali code smells seperti long parameter list dan god class, lalu refactoring dengan extract method dan replace conditional with polymorphism menggunakan tool IntelliJ.

Selama 20 episode, kita membangun fitur dan desain. Episode ini membalik perspektif: kode yang buruk — seperti apa, mengapa ia muncul, dan bagaimana memperbaikinya secara sistematis. Ini seni clean code dan praktik refactoring, yang dipopulerkan buku Clean Code karya Robert C. Martin dan Refactoring karya Martin Fowler.
Mengapa ini puncak dari OOP? Karena OOP memberi kalian alat desain, tetapi kualitas lahir dari kebiasaan: menamai dengan jujur, memecah method yang panjang, dan — kuncinya — mengubah kode tanpa mengubah perilaku. Kalian akan membaca dan merawat kode puluhan kali lebih sering daripada menulisnya dari nol.
Nama adalah dokumentasi pertama. Kode yang baik dibaca seperti prosa:
public void proc() {
List<String> d = ambilData();
for (String x : d) {
if (x.length() > 5) {
System.out.println(x);
}
}
}public void cetakDataPanjang() {
List<String> data = ambilData();
for (String item : data) {
if (item.length() > 5) {
System.out.println(item);
}
}
}Aturan penamaan:
cetakDataPanjang, hitungTotal.data, totalPesanan.Rekening, LayananPesanan.is/has: isAktif, hasItem.proc, d, tmp) dan nama generik (data, info, handler).Biaya nama yang buruk tidak terlihat di menit pertama, tetapi terbayar sebagai waktu baca yang terbuang setiap kali kalian atau orang lain menyentuh kode itu.
Method panjang adalah magnet bug — alurnya mustahil diikuti. Pecah sampai setiap method mengerjakan satu hal di satu tingkat abstraksi:
public void prosesPesanan(Pesanan p) {
if (p.getStatus().equals("MENUNGGU")) {
double total = 0;
for (Item i : p.getItemList()) {
total += i.getHarga() * i.getQty();
}
p.setTotal(total);
kirimEmail("Pesanan diterima", p.getEmail());
simpanKeDatabase(p);
}
}public void prosesPesanan(Pesanan p) {
if (!p.menunggu()) {
return;
}
hitungTotal(p);
notifikasiDiterima(p);
simpan(p);
}
private void hitungTotal(Pesanan p) {
p.setTotal(p.getItemList().stream()
.mapToDouble(i -> i.getHarga() * i.getQty())
.sum());
}Bandingkan: prosesPesanan sekarang adalah daftar isi yang terbaca; detail tersembunyi di method kecil. Kode dengan method kecil juga lebih mudah diuji (episode 16) — setiap langkah punya titik test sendiri.
Dua prinsip yang sering disalahpahami:
public double hargaKopi(int qty) { return qty * 25000; }
public double hargaTeh(int qty) { return qty * 20000; }Kedua method sebenarnya pola yang sama — abstraksi yang salah tempat vs duplikasi. Yang benar bukan langsung meng-abstraksi ke generik (YAGNI), tetapi menunggu sampai pola ketiga muncul, baru generalisasi dengan keyakinan. Keseimbangannya: DRY mencegah duplikasi bodoh, YAGNI mencegah abstraksi prematur.
Code smell adalah gejala di kode yang mengisyaratkan desain bermasalah:
Method dengan 5+ parameter sulit dipakai dan mudah salah urutan:
public void kirimLaporan(String nama, String email, String alamat,
String kota, String kodePos, String jenis) {
// 6 parameter, sulit dibaca & dipanggil
}Bungkus parameter yang berkaitan menjadi satu object — record (episode 10) sempurna untuk ini:
public record Alamat(String jalan, String kota, String kodePos) {}
public void kirimLaporan(String nama, String email, Alamat alamat, String jenis) {}4 parameter pun masih banyak; jika terus bertambah, pertimbangkan parameter object penuh.
Class yang menangani banyak tanggung jawab (ingat SRP di episode 14):
public class Aplikasi {
void login() { }
void hitungPajak() { }
void kirimEmail() { }
void bacaFile() { }
void cetakLaporan() { }
void kirimNotifikasi() { }
}Satu class, enam domain berbeda. Perbaikannya dengan extract class — pindahkan tiap kelompok logika ke class-nya sendiri.
Refactoring = mengubah struktur tanpa mengubah perilaku. Dua teknik yang paling berdampak:
Memindahkan blok kode ke method baru dengan nama yang menjelaskan — teknik inti yang sudah kita praktikkan di atas:
public void cetakFaktur() {
// 30 baris logika perhitungan di sini...
// 20 baris logika pencetakan di sini...
}public void cetakFaktur() {
double total = hitungTotal();
cetakBaris(total);
}
private double hitungTotal() {
// logika perhitungan
return 0;
}
private void cetakBaris(double total) {
// logika pencetakan
}Teknik favorit untuk menghilangkan if/else berantai — kita sudah melihat arahnya di episode 8 dan 14. Inilah versi refactoring-nya:
public double ongkosKirim(String jenis) {
if (jenis.equals("motor")) return 5000;
else if (jenis.equals("mobil")) return 10000;
else return 0;
}public interface Kiriman {
double ongkos();
}
public record KirimanMotor() implements Kiriman {
public double ongkos() { return 5000; }
}
public record KirimanMobil() implements Kiriman {
public double ongkos() { return 10000; }
}Pemanggil cukup kiriman.ongkos() — tanpa if, terbuka untuk ekstensi (OCP). Ini pola refactoring yang mengubah cabang statis menjadi keputusan dinamis.
Kekuatan IntelliJ IDEA (dan VS Code) ada di refactoring terotomasi yang aman — ubah struktur tanpa menyentuh perilaku:
Tip
Kunci refactoring yang aman: test dulu, refactor kemudian (episode 16). Kalian hanya berani mengubah struktur tanpa takut jika ada test yang menjaga perilaku. Bagi tim produksi, refactoring tanpa test adalah judi; dengan test, menjadi rutinitas yang tenang.
Satu kebiasaan yang mengubah tim: tinggalkan kode lebih bersih dari saat kalian datang (boy-scout rule). Saat menyentuh file, perbaiki satu smell kecil — ganti nama, extract satu method. Kecil per hari, tetapi dalam setahun codebase berubah drastis tanpa perlu proyek refactoring besar yang berisiko.
Warning
Refactoring bukan waktu untuk menambah fitur. Saat sesi refactoring, hanya struktur yang berubah — kalau terlintas ide fitur, catat dan kerjakan nanti di sesi terpisah. Mencampur keduanya membuat perubahan sulit direview dan dibatalkan.
Inti yang harus dibawa pulang:
Di episode 22 — episode terakhir — kita akan membahas ekosistem, alternatif & refleksi akhir: perbandingan Java vs Python vs Kotlin vs C# vs Rust vs Go, kapan memilih bahasa mana, rekap seluruh series, dan checklist produksi lengkap. Sampai jumpa di episode 22!