O - Open / Close
Bayangkan jika kita punya sepeda motor atau barang apapun yang sudah satu kesatuan yang ketika rusak sparepart nya tidak bisa diganti. Bayangkan jika ketika komponent nya rusak, kita harus langsung memperbaikinya di komponen tersebut tanpa bisa di ganti dengan komponen sejenis yang baru. Pasti akan sangat merepotkan bukan ?. Nah pada prinsipnya Open / Close ini untuk menghindari hal-hal yang demikian.
Implementasi
Bayangkan kita punya 1 buah blender, dimana blender ini bisa melakukan 3 pekerjaan yaitu mode daging, buah, dan bumbu. Apabila kita tidak mengikuti prinsip Open / Close, mungkin kode kita akan seperti ini:
<?php namespace App\Blender; class Blender { public function run(string $mode, string $material):void { switch($mode) { case "daging": $this->runDaging($material); break; case "buah": $this->runBuah($material); break; case "bumbu": $this->runBumbu($material); break; } throw new \Exception("mode tidak dikenal"); } private function runDaging(string $material):void { echo sprintf("proses menghaluskan %s", $material); } private function runBuah(string $material):void { echo sprintf("proses menghaluskan %s", $material); } private function runBumbu(string $material):void { echo sprintf("proses menghaluskan %s", $material); } }
kode di atas jika dijalankan akan berjalan dengan benar. Namun kendala akan muncul ketika kita menambahkan mode baru. Yang pada umumnya akan merubah fungsi run() dengan parameter yang berbeda pula. Perubahan kode ini sangat rawan menyebabkan BUG / ERROR kode yang sudah berjalan, juga akan menyebabkan Class menjadi terlalu komplex / panjang. Untuk menghindari hal tersebut, juga memudahkan dalam pengembangan dikemudian hari, maka bisa kita ubah untuk mengikuti prinsip Open / Close ini. Sehingga kita akan membutuhkan beberapa Class, antara lain:
- interface PisauInterface yang berfungsi sebagai blueprint dari logika masing-masing pisau blender
- Class PisauDaging, PisauBuah, dan PisauBumbu untuk implementasi masing-masing pisau
- Class Blender yang merupakan Class utama
Interface PisauInterface
<?php namespace App\Blender; interface PisauInterface { public function process(string $material):void; }
Class PisauDaging
<?php namespace App\Blender; class PisauDaging implements PisauInterface { public function process(string $material): void { echo sprintf("proses menghaluskan daging: %s", $material); } }
Class PisauBuah
<?php namespace App\Blender; class PisauBuah implements PisauInterface { public function process(string $material): void { echo sprintf("proses menghaluskan buah: %s", $material); } }
Class PisauBumbu
<?php namespace App\Blender; class PisauBumbu implements PisauInterface { public function process(string $material): void { echo sprintf("proses menghaluskan bumbu: %s", $material); } }
Class Blender
<?php namespace App\Blender; class Blender { private PisauInterface $pisau; public function __construct(PisauInterface $pisau) { $this->pisau = $pisau; } public function run(string $material):void { echo "menyalakan power"; $this->pisau->process($material); echo "selesai"; } }
<?php $daging = new PisauDaging(); $blender = new Blender($daging); $blender->run("daging sapi"); $buah = new PisauBuah(); $blender = new Blender($buah); $blender->run("Alpukat"); $bumbu = new PisauBumbu(); $blender = new Blender($bumbu); $blender->run("bawang merah");
Komentar
Posting Komentar