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-...

Part 7 : Normalisasi Histogram

Menyambung tulisan saya yang sebelumnya tentang pengolahan citra khususnya histogram,kali ini saya lanjutkan tentang Normalisasi histogram.Sebelumnya saya harap agan sudah mengerti tentang histogram.Jika belum bisa di baca dulu di tulisan saya sebelumnya di sini . Normalisasi Histogram adalah menskalakan nilai piksel secara linear untuk menggunakan secara penuh jangkauan yang tersedia. Rumus :  Keterangan : n k= nilai grayscale dari piksel ke k(k = 0,1,2,3....) min = nilai grayscale terkecil yang diperoleh dari histogram max = nilai grayscale terbesar L = range nilai grayscale citra Contoh perhitungan : dari tabel di atas,nilai min adalah 2 yaitu nilai grayscale terkecil dari citra dan max adalah 5 s = 0 - 2 /5 - 2 =0 (untuk n = 0)  hasil = 0 x 7(nilai maksimal grayscale) = 0 sk = 3 - 2 /5 - 2 = 0.333  (untuk n = 3) hasil = 0.333 x 7 = 2 keterangan : 7 adalah range grayscale dari citra,dan untuk banyak kasus biasanya memakai 255. Tujuan Normalisasi...