Pendahuluan
Ketika kita menulis program dengan menggunakan paradigma OOP / Object Oriented baik menggunakan Java, PHP ataupun yang lain, kita akan banyak berinteraksi dengan Class maupun Object. Dan tidak dapat dipungkiri bahwa interaksi antar Object tersebut akan memunculkan tantangan baru, yaitu kode akan susah dibaca, kode menjadi susah dikembangkan, dan ketika di kembangkan memunculkan BUG dan lain sebagainya.
Oleh karena beberapa kendala tersebut, maka ada baiknya kita perlu mempelajari beberapa prinsip penulisan kode di dalam OOP yang dikenal dengan nama SOLID.
SOLID
SOLID sendiri merupakan sebuah prinsip yang dikenalkan oleh RObert J Martin (Uncle Bob) di dalam paper yang diterbitkan pada tahun 2000 dengan tujuan untuk membuat kode yang lebih mudah dimengerti, dapat dibaca dan mudah dalam melakukan testing. tonton di sini.
SOLID sendiri merupakan singkatan / akronim dari beberapa prinsip, antara lain:
- S - Single Responsibility
- O - Open / Close
- L - Liskov Substitution
- I - Interface Segregation
- D - Dependency Inversion
Dengan mengadopsi kelima prinsip diatas, akan membantu kita dalam menulis kode yang bersih, lebih mudah di maintenance, dan dikembangkan sesuai dengan kebutuhan sistem. Di tulisan ini, akan saya bahas 2 prinsip yaitu S dan masing masing prinsip akan saya tulis di artikel terpisah.
S - Single Responsibility
Prinsip Single Responsibility merupakan prinsip yang mengharuskan suatu Class hanya mempunyai 1 tugas secara spesifik dan fokus mengerjakan suatu tugas tertentu. Sekarang kita lihat pada contoh Class berikut:
<?php namespace App\Entity; class Customer { /** * * @var string */ private $code; /** * * @var string */ private $name; /** * * @var string */ private $address; public function getCode(): ?string { return $this->code; } public function getName(): string { return $this->name; } public function getAddress(): string { return $this->address; } public function setCode(string $code):self { $this->code = $code; return $this; } public function setName(string $name):self { $this->name = $name; return $this; } public function setAddress(string $address):self { $this->address = $address; return $this; } public function save():void { // simpan ke database } }
Class Customer diatas merupakan class yang merepresentasikan tabel yang ada di database. Pada Class diatas, mempunyai beberapa function getter() dan setter() dan juga mempunyai fungsi save() yang digunakan untuk menyimpan data ke storage.
Secara prinsip SRP, Class diatas harus di pecah berdasarkan domain tugas. Karena Class tersebut merupakan representasi dari tabel di database, maka class tersebut hanya boleh mempunyai fungsi yang getter() dan setter() yaitu untuk menampung data dari baris di database ke dalam class, sedangkan fungsi save() yang merupakan fungsi untuk menyimpan data ke tabel perlu di pindah menjadi Class tersendiri. Hal ini akan memudahkan kita ketika suatu saat akan mengembangkan fungsi save() di kemudian hari, sehingga class Customer akan mebih mudah dibaca juga ketika terjadi perbahan metode penyimpanan, tidak menyebabkan error / mempengaruhi class Customer. Jadi ketika dipecah, kita akan mempunyai 2 Class yaitu Customer untuk representasi data / tabel dan CustomerRepository yang digunakan untuk operaasi ke database. Seperti contoh berikut:
<?php namespace App\Entity; class Customer { /** * * @var string */ private $code; /** * * @var string */ private $name; /** * * @var string */ private $address; public function getCode(): ?string { return $this->code; } public function getName(): string { return $this->name; } public function getAddress(): string { return $this->address; } public function setCode(string $code):self { $this->code = $code; return $this; } public function setName(string $name):self { $this->name = $name; return $this; } public function setAddress(string $address):self { $this->address = $address; return $this; } }
<?php namespace App\Repository; use App\Entity\Customer; class CustomerRepository { public function save(Customer $customer):void { // simpan customer ke database } public function findAll():array { // select all dari database } }
Komentar
Posting Komentar