Apa Itu Clean Code?
Kode yang bersih bukan hanya kode yang berfungsi โ ini kode yang bisa dibaca dan dipahami oleh developer lain, atau dirimu sendiri, 6 bulan ke depan. Developer menghabiskan 70% waktu membaca kode dan hanya 30% menulisnya.
1. Penamaan yang Bermakna
// Buruk: nama tidak jelas
function calc($a, $b, $c) {
return $a * $b * (1 - $c / 100);
}
// Bagus: nama menjelaskan niat
function calculateDiscountedTotal(
float $unitPrice,
int $quantity,
float $discountPercent
): float {
return $unitPrice * $quantity * (1 - $discountPercent / 100);
}
2. Satu Fungsi, Satu Tanggung Jawab
// Bagus: pisahkan tanggung jawab
class UserRegistrationService
{
public function register(RegisterUserDTO $dto): User
{
$this->validator->validate($dto);
$user = $this->repository->create($dto);
$this->onUserCreated($user);
return $user;
}
private function onUserCreated(User $user): void
{
WelcomeEmailJob::dispatch($user);
LoyaltyPoint::giveWelcomeBonus($user);
Log::info("User registered", ["id" => $user->id]);
}
}
3. Hindari Magic Numbers
// Buruk
if ($user->role === 2 && $score > 75) { }
// Bagus
if ($user->role === UserRole::PREMIUM_MEMBER
&& $score > DiscountPolicy::MIN_SCORE) { }
4. Prinsip DRY โ Jangan Ulangi Dirimu Sendiri
// DRY: gunakan query scope
// Di model User:
public function scopeActive($query) {
return $query->where("status", "active")->where("verified", true);
}
$users = User::active()->orderBy("name")->get();
$admins = User::active()->where("role", "admin")->get();
5. Fail Fast dengan Early Return
// Bagus: early return โ kode lebih datar dan mudah dibaca
function processPayment(Order $order): void
{
if ($order === null) throw new InvalidArgumentException("Order tidak valid");
if ($order->total <= 0) throw new LogicException("Total harus lebih dari nol");
if ($order->status !== "pending") throw new OrderException("Sudah diproses");
$this->paymentGateway->charge($order);
}
Kesimpulan
Clean Code adalah keahlian yang diasah dari waktu ke waktu. Mulai dengan membiasakan diri memberi nama yang bermakna, menulis fungsi kecil yang fokus, dan selalu bertanya: apakah developer lain bisa memahami kode ini tanpa bantuan saya?