Bayangkan aplikasi toko sebagai kumpulan benda yang memiliki data dan perilaku: produk dapat mengubah stok, keranjang dapat menghitung total, dan pesanan dapat mengubah status. OOP membantu kita memodelkan benda-benda itu tanpa menyebarkan logika ke banyak file acak.
Cetakan
Hasil cetakan
Perilaku
Satu class, satu tanggung jawab yang jelas
final class Product
{
public function __construct(
private string $name,
private int $price,
private int $stock
) {}
public function reduceStock(int $quantity): void
{
if ($quantity < 1 || $quantity > $this->stock) {
throw new InvalidArgumentException('Stok tidak mencukupi.');
}
$this->stock -= $quantity;
}
public function subtotal(int $quantity): int
{
return $this->price * $quantity;
}
}Property dibuat private agar keadaan object tidak bisa diubah sembarangan. Perubahan stok hanya boleh melalui method yang sekaligus melakukan validasi.
Composition lebih aman daripada inheritance berlebihan
Inheritance cocok ketika relasi benar-benar “adalah”. Namun untuk layanan pembayaran, pengiriman, atau notifikasi, composition biasanya lebih fleksibel karena objek hanya menerima kemampuan yang dibutuhkan.
interface PaymentGateway
{
public function charge(int $amount): string;
}
final class CheckoutService
{
public function __construct(private PaymentGateway $gateway) {}
public function checkout(Cart $cart): string
{
if ($cart->isEmpty()) {
throw new DomainException('Keranjang kosong.');
}
return $this->gateway->charge($cart->total());
}
}Kapan OOP justru membuat kode lebih buruk?
Jangan membuat class hanya untuk membungkus satu fungsi sederhana. Jangan membuat hierarchy lima tingkat untuk variasi kecil. Jangan memakai getter dan setter tanpa aturan bisnis. OOP berguna ketika ada state, aturan, dan kolaborasi antarkomponen—bukan sebagai kewajiban gaya.
| Gejala | Perbaikan |
|---|---|
| Class memiliki 20+ method | Pecah berdasarkan tanggung jawab bisnis. |
| Constructor menerima terlalu banyak dependency | Cari service yang mengerjakan lebih dari satu hal. |
Banyak if berdasarkan tipe | Pertimbangkan polymorphism atau strategy. |
| Object hanya berisi data | Pastikan aturan yang menjaga data berada dekat dengan datanya. |
Latihan yang masuk akal
Buat Cart yang dapat menambah item, menolak jumlah nol, menghitung total, dan menerapkan kupon melalui interface. Setelah itu tulis unit test untuk kasus keranjang kosong, stok kurang, dan kupon kedaluwarsa. Dari latihan ini, konsep encapsulation, composition, dependency injection, dan exception akan terasa nyata.
