Programming Tutorial PHP Best Practices 27 July 2025

Tell, Don’t Ask: Cara Menulis OOP PHP yang Sopan dan Efektif

Tell, Don’t Ask: Cara Menulis OOP PHP yang Sopan dan Efektif
Bagikan:

Pernah nggak sih kamu merasa PHP itu ribet banget, apalagi kalau sudah ngomongin OOP (Object-Oriented Programming)? Tenang, kamu nggak sendirian! Banyak banget programmer—baik yang baru mulai atau yang sudah lama ngoding—masih suka terjebak dengan cara berpikir lama yang bikin kode PHP jadi susah dirawat. Nah, di artikel ini, kita bakal bahas satu prinsip sederhana tapi powerful: Tell, Don’t Ask. Prinsip ini bisa bikin kode kamu lebih sopan, rapi, dan gampang dikembangkan. Yuk, kita mulai dari cerita yang sering banget kejadian di dunia nyata!

Kamu pasti pernah lihat kode seperti ini:

if ($user->isActive()) {
    $mailer->sendWelcomeEmail($user);
}

Kelihatannya sih oke, tapi sebenarnya kode ini bikin objek user jadi kayak kotak data doang. Semua keputusan diambil di luar objeknya. Akibatnya, kode jadi susah di-maintain dan gampang error.

Sekarang, coba bandingkan dengan cara berikut:

$user->sendWelcomeEmailIfActive();

Nah, di sini objek user yang memutuskan sendiri apa yang harus dilakukan. Kode jadi lebih jelas, tanggung jawabnya juga lebih rapi. Inilah inti dari prinsip Tell, Don’t Ask: kasih tahu objek apa yang harus dilakukan, jangan tanya-tanya lalu ambil keputusan sendiri di luar.

Kenapa sih ini penting? Karena dengan cara ini, kode kamu jadi lebih mudah dirawat, gampang dites, dan nggak bikin pusing kalau tim kamu makin besar. Setiap objek punya tanggung jawab jelas, nggak ada lagi logic yang nyebar ke mana-mana.

Yuk, kita lihat contoh lain yang sering kejadian di Laravel:

if ($post->comments()->count() > 0) {
    $post->delete();
}

Coba refactor jadi seperti ini:

$post->deleteIfCommented();

Dengan begini, kamu nggak perlu tahu detail internal dari objek post. Cukup kasih tahu apa yang harus dilakukan, biar objeknya yang urus semuanya.

Kamu juga pasti pernah lihat kode seperti ini:

$order->getCustomer()->getEmail();

Padahal, lebih baik begini:

$order->notifyCustomer();

Semakin sedikit kamu “menginterogasi” objek, semakin rapi kode kamu. Prinsip ini juga dikenal dengan nama Law of Demeter—intinya, jangan terlalu banyak tahu urusan dalam objek lain.

Banyak yang masih mengira OOP itu cuma soal bikin class dan getter/setter. Padahal, OOP yang baik itu soal membungkus data dan perilaku jadi satu. Kalau class kamu cuma punya getter, itu namanya struct, bukan OOP beneran!

Dengan prinsip Tell, Don’t Ask, kamu otomatis belajar encapsulation alias membungkus detail supaya nggak bocor ke mana-mana. Kamu nggak perlu tahu “bagaimana” sesuatu dilakukan, cukup tahu “apa” yang harus dilakukan.

Ini bukan soal gaya-gayaan atau nama method yang keren. Yang penting, kamu benar-benar memindahkan tanggung jawab ke tempat yang tepat. Jangan semua logic ditumpuk di controller atau service, biar objek domain yang kerja.

Banyak yang khawatir soal testability. Tenang, justru dengan prinsip ini, unit test jadi lebih gampang. Kamu cukup tes satu aksi, tanpa harus mock chain getter yang panjang.

$user->deactivate();

Satu aksi, satu test, satu tanggung jawab. Simpel!

Prinsip ini juga cocok banget buat value object. Misal:

$price->isGreaterThan($limit);

Bisa diubah jadi:

$price->ensureNotGreaterThan($limit);

Sekarang, objek price yang memastikan nilainya sesuai aturan. Lebih aman dan jelas.

Jangan lupa, controller itu bukan CEO yang ngatur semuanya. Hindari logic seperti ini:

if ($order->isValid() && $order->hasStock()) {
    $inventory->reduceStock($order);
}

Lebih baik begini:

$order->place();

Dengan begitu, domain model kamu yang mengatur proses bisnis, bukan controller.

Apa sih kerugian kalau kamu melanggar prinsip ini? Banyak! Test jadi rapuh, controller jadi spaghetti, logic berulang di mana-mana. Akhirnya, tim kamu bakal pusing sendiri.

Contoh refactor nyata:

Sebelum:

if ($invoice->isPaid()) {
    $mailer->sendThankYou($invoice);
}

Sesudah:

$invoice->thankPayer();

Perubahan kecil, tapi dampaknya besar. Kode jadi lebih jelas dan mudah dirawat.

Prinsip ini bukan cuma buat senior. Justru makin awal kamu belajar, makin gampang kamu berkembang. Ajarkan ke tim, biasakan dari sekarang.

Setiap kali kamu mau nulis method, coba tanya ke diri sendiri:

Apakah aku sedang menyuruh objek melakukan sesuatu, atau cuma nanya-nanya lalu ambil keputusan sendiri?

Percayalah sama objekmu. Hormati batasannya. Tulis kode PHP yang sopan dan dewasa.

✨ Suatu saat nanti, kamu bakal berterima kasih ke diri sendiri!


Sumber & Referensi

Tips Praktis untuk Pemula
  • Selalu mulai dari method yang jelas tujuannya
  • Jangan ragu refactor kode lama jadi lebih “sopan”
  • Latihan dengan project kecil dulu, misal todo list atau sistem kasir sederhana
  • Cek dokumentasi resmi dan komunitas kalau bingung
  • Jangan takut salah, yang penting terus belajar dan praktik

Langkah Selanjutnya
  • Coba refactor satu file project kamu pakai prinsip Tell, Don’t Ask
  • Diskusikan dengan teman atau mentor, minta feedback
  • Pelajari lebih lanjut tentang OOP dan design pattern
  • Ikuti komunitas programming untuk update dan motivasi

“Programming itu bukan soal siapa yang paling jago, tapi siapa yang paling mau belajar dan berbagi.”

Semangat terus, ya! Programming itu perjalanan panjang, tapi seru kalau dijalani bareng-bareng. Jangan takut trial-error, dan ingat: kode yang baik itu kode yang mudah dipahami, bukan yang paling rumit.