Tips ini bisa kalian praktekan jika sedang mengerjakan sebuah project dari developer lainnya dan kamu tidak tahu dari mana memulainya.
Salah satu yang bisa di cek pertama kali adalah class yang berhubungan dengan user seperti misalnya user model dan user controller.
Daftar Isi
Itu karena disinilah tempat dimana biasanya yang memiliki banyak fungsi dan variable yang dipaksakan untuk berada disitu.
Ini bisa terjadi karena kita tidak tahu lagi dimana menaruh fungsi dan variable tersebut.
Kita lihat aja contoh class UserController di bawah ini.
Class UserController{
protected $userService;
protected $registrationService;
protected $userRepository;
protected $billing;
protected $mailer;
protected $userEventRepository;
protected $logger;
public function __construct(
UserService $userService;
RegistrationService $registrationService;
UserRepository $userRepository;
Billing $billing;
Mailer $mailer;
UserEventRepository $userEventRepository;
Logger $logger;
)
{
}
}
Contoh diatas adalah salah satu class dengan total 7 instance variable yang menurut saya memiliki terlalu banyak instance variable d. Sebelumnya tidak ada yg salah dengan dengan class tersebut tapi jika perhatikan apa benar semua instance tersebut harus dilakukan oleh user controller? Selain itu apakah class tersebut mudah dibaca kira-kira oleh orang lain?
Jeff Bay adalah pencetus latihan ini, dia merekomendasikan kalau sebuah class harusnya memiliki maksimal 2 buah variable saja. Tapi itu memungkinkan misalnya dalam java, tapi dalam PHP kita akan sedikit toleransi dengan maksimal 5 instance variable seperti yang direkomendasikan oleh Rafael Dohms (doh.ms). Tapi bagaimana jika kita kurangi lagi jadi maksimal 4 variable dalam 1 class saja? Ok kita mulai saja dengan step pertama bagaimana menyederhanakan class tersebut.
Single responsibility principle
Prinsip ini bertujuan agar sebuah class atau fungsi seharusnya hanya memiliki 1 tugas utama saja.
Class UserController harusnya hanya bertugas untuk menerima request dan memberikan respon terhadap request tersebut. Tapi seperti yang kita lihat class tersebut memiliki banyak sekali tugas didalamnya yang perlu kita breakdownn supaya lebih jelas.
Dari masing-masing instace tersebut kita mulai dari yang pertama UserService. Mungkin disini maksudnya adalah semua service yang akan dilakukan oleh user. Jika kita mengacu pada namanya maka UserRepository harusnya berada didalam UserService bukan? Begitu juga UserEventRepository harusnya kita masukkan saja ke dalam UserService. Jadi kita bisa menghapus kedua instance tersebut dan memasukkannya kedalam UserService.
Class UserController{
protected $userService;
protected $registrationService;
protected $billing;
protected $mailer;
protected $logger;
public function __construct(
UserService $userService;
RegistrationService $registrationService;
Billing $billing;
Mailer $mailer;
Logger $logger;
)
{
}
}
Class UserService{
protected $userRepository;
protected $userEventRepository;
public function __construct(
UserRepository $userRepository;
UserEventRepository $userEventRepository;
){
}
}
Kemudian kita lihat untuk RegistrationService, bagaimana kalau kita buatkan saja sebuah controller baru untuk menghandle semua proses registrasi? Tidak buruk juga kan? Begitu juga dengan billing, bukannya lebih baik billing berhubungan dengan proses registrasi?
Class UserController{
protected $userService;
protected $mailer;
protected $logger;
public function __construct(
UserService $userService;
Mailer $mailer;
Logger $logger;
){
}
}
class UserService{
protected $userRepository;
protected $userEventRepository;
public function __construct(
UserRepository $userRepository;
UserEventRepository $userEventRepository;
){
}
}
Class RegistrationController{
protected $registrationService;
protected $billing;
public function __construct(
RegistrationService $registrationService;
Billing $billing;
){
}
}
Terakhir untuk Mailer dan Logger service, kita bisa tetap menaruhnya di UserController karena maksimal 4 instace sudah kita penuhi. Tapi kita bisa saja pakai event handler untuk mengirim email ataupun menulis log. Misal saat ada user register, kita bisa buat event listener-nya kemudian kirimkan email. Jadi kita disini hilangkan saja Mailer & Logger service dari UserController kita ya. Maka final dari hasil refactoring class tersebut akan menjadi seperti di bawah ini.
Class UserController{
protected $userService;
public function __construct(
UserService $userService;
){
}
}
class UserService{
protected $userRepository;
protected $userEventRepository;
public function __construct(
UserRepository $userRepository;
UserEventRepository $userEventRepository;
){
}
}
Class RegistrationController{
protected $registrationService;
protected $billing;
public function __construct(
RegistrationService $registrationService;
Billing $billing;
){
}
}
Part ini adalah yang terakhir dari tips untuk membuat kode kita menjadi lebih simple. Dalam refactoring ini tidak melulu harus mengikuti aturan ini dan aturan itu. Jika kalian mengaggap semua normal dengan kode yang ada sekarang tidak salah kok. Jangan juga beranggapan kalau semua harus kalian buat simple. Tapi lihatlah lebih dalam lagi, ternyata betapa berantakannya kode yang kita buat dan berusaha untuk membuatnya lebih baik dan lebih mudah kita mengerti dimasa depan. Jangan sampai setelah sekian tahun membuat sebuah project, kamu sendiri tidak tahu apa yg sebenarnya terjadi di dalam progam kamu. Kan lucu kan :p
Sekali lagi semua ini hanya tips, jadi kalian tidak harus melulu mengikuti aturan yang ada. Tapi yang penting buat semuanya simple aja ya bro.
Simple is perfect & Perfect is shit