Langsung ke konten utama

SOLID - Prinsip Desain Arsitektur Di Dalam Pemrograman Object Oriented (Interface Segregation Principal)

 Clients should not be forced to depend upon interfaces that they do not use

Definisi Interface Segregation

     Sesuai dengan pengertian di atas, Interface segregation merupakan prinsip yang bertujuan untuk mencegah suatu interface / abstract class mempunyai banyak fungsi yang tidak saling terkait yang menyebabkan penggunaan class implementasi menjadi lebih kompleks. 
     Mirip seperti konsep Single Responsibility, tujuan prinsip Interface Segregation bertujuan untuk mengurangi ketergantungan Class yang disebabkan oleh suatu class / interface yang mempunyai banyak fungsi yang tidak saling terkait, yang kemudian membaginya menjadi beberapa interface yang lebih kecil yang lebih independent.
         Untuk lebih jelasnya, kita akan membahasnya melalui contoh.

Contoh Pelanggaran Prinsip Interface Segregation

          Anggap kita punya karyawan WorkerInterface, dimana interface tersebut mempunyai function work() dan sleep() dan juga eat() yang nantinya akan di implementasi oleh Class seperti potongan kode berikut.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php

/**
 *
 * @author apple
 */
interface WorkerInterface 
{
    public function work():string;
    
    public function sleep():string;
    
    public function eat():string;
}

class KaryawanTetap implements WorkerInterface 
{
    
    public function eat(): string 
    {
        return "mulai makan free";
    }

    public function sleep(): string 
    {
        return "mulai tidur";
    }

    public function work(): string 
    {
        return "mulai kerja 8 Jam";
    }

}

class KaryawanMagang implements WorkerInterface 
{
    public function eat(): string 
    {
        return "mulai makan bawa sendiri";
    }

    public function sleep(): string 
    {
        return "mulai tidur";
    }

    public function work(): string 
    {
        return "mulai kerja 6 Jam";
    }
}
dari contoh di atas nampaknya tidak ada yang salah bukan ?. Namun dikemudian hari kita kedatangan robot yang dia akan menjadi tambahan tenaga karyawan kita. Jadi kita akan membuat Class Robot yang implements ke Interface WorkerInterface. 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<?php

class Robot implements WorkerInterface 
{
    public function eat(): string 
    {
        // robot tidak makan
    }

    public function sleep(): string 
    {
        // robot tidak tidur
    }

    public function work(): string 
    {
        return "mulai kerja 24 Jam non stop";
    }
}
nah masalah disini muncul. Robot tidak tidur, juga tidak makan. Sedangkan untuk menjadi karyawan maka Class robot harus mengimplementasikan function sleep() dan juga eat() sedangkan Robot tidak menggunakan kedua function tersebut yang menyebabkan kita mengimplementasikan function yang tidak digunakan.

Solusi

Untuk mengatasi masalahpada contoh di atas, kita perlu memisahkan function menjadi beberapa interface terpisah.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php

interface WorkerInterface 
{
    public function work():string;
}

interface SleepableInterface 
{
    public function sleep():string;
}

interface EatableInterface 
{
    public function eat():string;
}
kemudian kita bisa implement sesuai dengan kebutuhan seperti kode berikut:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php

class KaryawanTetap implements WorkerInterface, SleepableInterface, EatableInterface 
{ public function eat(): string { return "mulai makan free"; } public function sleep(): string { return "mulai tidur"; } public function work(): string { return "mulai kerja 8 Jam"; } } class KaryawanMagang implements WorkerInterface, SleepableInterface, EatableInterface
{ public function eat(): string { return "mulai makan bawa sendiri"; } public function sleep(): string { return "mulai tidur"; } public function work(): string { return "mulai kerja 6 Jam"; } } class Robot implements WorkerInterface { public function work(): string { return "mulai kerja 24 Jam non stop"; } }
karena Robot tidak makan dan tidak tidur, maka Robot tidak perlu impelements ke interface SleepableInterface juga EatableInterface . Sehingga kita dapat menggunakan class tersebut sebagaimana Class WorkerManager berikut.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php

class WorkerManager
{
    private array $workers;
    
    public function __construct() 
    {
        $this->workers = [];
    }
    
    public function addWorker(WorkerInterface $worker):void
    {
        $this->workers[] = $worker;
    }
    
    public function startWork():void
    {
        foreach ($this->workers as $worker) {
            $worker->work();
        }
    }
}

Kesimpulan

Dengan menggunakan prinsip Interface Segregation, kita bisa menghindari penulisan function yang tidak perlu, sehingga kode yang kita buat menjadi lebih rapi juga lebih mudah untuk dikembangkan.

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