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 + (1*(-1)*0) = 0 w2_baru = w2_lama +(learning_rate*error*x2)                = 0+(1*(-1)*0) = 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-0)^2)) = 1         kelas 1 = sqrt(((0-1)^2)+((1-0)^2)+((1-

Pemrograman Berorientasi Object - Overloading dan Overriding

       Function atau method overloading dan override adalah fitur yang sangat mendasar dan berguna dari bahasa OOP manapun. Dalam tutorial ini kita akan membahas implementasi metode overloading dan override di php. Di sini pertama kita akan membahas dasar-dasar overloading dan override. Setelah eksplorasi dasar kita akan menerapkan overloading dan override di php. Sebelum melangkah lebih jauh, saya mengasumsikan bahwa Anda memiliki pengetahuan dasar tentang class dan pewarisan di php. Anda juga memiliki pemahaman tentang magic method di php. Magic method karena overloading di php bisa di implmentasikan dengan menggunakan magic method. Overriding        Arti dasar dari overriding di OOP sama dengan arti kata sebenarnya. Dalam arti kata sebenarnya dari overriding adalah menggantikan perilaku orang tua yang sama pada anak. Ini sama dengan override method di OOP. Dalam arti OOP, override adalah mengganti method class induk di class anak. Atau dengan method kata kunci sederhana yang me