Langsung ke konten utama

SOLID - Prinsip Desain Arsitektur Di Dalam Pemrograman Object Oriented (Open / Close Principal)

 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.

Objects or entities should be open for extension but closed for modification.
Prinsip Open / Close mengharuskan suatu Class / Komponen untuk bisa dimodifikasi logic / behaviour melalui Class turunan (Open) tanpa harus memodifikasi langsung pada kode di Class Utama (Close). Prinsip ini bertujuan agar kode yang kita buat bisa dengan mudah untuk di modifikasi logic / alur dalam melakukan sesuatu melalui Class turunan nya tanpa harus merubah kode yang ada di Class yang bersangkutan.

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";
    }
}

Dengan memisahkan implementasi masing-masing pisau, maka kode kita jadi lebih mudah dikembangkan juga mengurangi ketergantungan. Juga mudah untuk di test / di mock. Sehingga pemanggilannya kurang lebih seperti berikut: 
<?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");
jadi tampa merubah logika / kode di Class Blender, kita bisa menambah pisau sesuai dengan logika yang kita inginkan.

Komentar

Postingan populer dari blog ini

Contoh Perhitungan Algoritma Perceptron

      Melanjutkan tulisan saya sebelumnya tentang algoritma perceptron,kali ini saya akan menulis tentang conto perhitungan manual algoritma perceptron. Untuk contoh kasusnya saya menggunakan data logika AND. Cekidot.... Algoritma      Data yang kita gunakan sebagai contoh adalah data logika AND sebagai berikut: x1 x2 target 0 0 0 0 1 0 1 0 0 1 1 1       tentukan bobot awal secara acak, saya pakai contoh w1 = 0,w2 =0, learning rate = 1, bias = 0,maksimal epoh = 10. Disini saya memakai fungsi aktivasi undak biner. Epoh ke 1 Data ke satu x = {0,0}, bobot w = {0,0},b=0,target = 0 y_in = (x1*w1)+(x2*w2)+b = (0*0)+(0*0)+0 = 0 y = sign(0) = 1 karena y != target maka hitung error dan update bobot  error = target - y = 0 - 1 = -1 w1_baru = w1_lama +(learning_rate*error*x1)                = 0 ...

Contoh Perhitungan Algoritma Learning Vector Quantization

Melanjutkan tulisan saya tentang algoritma Learning Vector Quantization yang lalu, kali ini saya akan melanjutkan dengan contoh perhitungan manual. Berikut ini contoh data yang akan kita hitung. No X1 X2 X3 X4 target 1 0 1 1 0 0 2 0 0 1 1 1 3 1 1 1 1 0 4 1 0 0 1 1 pada contoh di atas, saya menggunakan 4 data sebagai data training beserta target yang bertujuan untuk mendapatkan bobot yang akan digunakan pada proses klasifikasi. Bobot awal adalah { 1, 1, 1, 0} dan { 1, 0, 1, 1} dengan learning rate 0,05 dengan fungsi pembelajaran = 0,1. Pelatihan Iterasi ke 1 1. Data ke 1 { 0, 1, 1, 0} dengan target 0, bobot = {{ 1, 1, 1, 0},{ 1, 0, 1, 1}}      - menghitung bobot untuk masing masing output :          kelas 0 = sqrt(((0-1)^2)+((1-1)^2)+((1-1)^2)+((0-...

SOLID - Prinsip Desain Arsitektur Di Dalam Pemrograman Object Oriented (Dependency Inversion Principal)

Akhirnya kita sampai di bagian paling akhir dari seri tulisan SOLID Principal yaitu untuk huruf D.  Ketika kita bekerja menggunakan bahasa pemrograman berorientasi object, kita pasti akan menggunakan Class. Class tersebut pada akhirnya akan saling terkait /  ketergantungan satu dan yang lain untuk melakukan tugas tertentu.  Ketergantungan ini disebut dengan istilah  Dependency.  Dependency ini bisa terjadi antar Class di dalam satu  Code Base  yang sama, atau bahkan antar  Library.  Controhnya seperti potongan kode berikut. <?php namespace App\DependencyInversion; /** * Description of Engine * * @author programmer */ class Engine { private KeihinCarburator $carburator ; private NGKSpark $spark ; public function __construct (KeihinCarburator $carburator , NGKSpark $spark ) { $this -> carburator = $carburator ; $this -> spark = $spark ; } public funct...