Langsung ke konten utama

SOLID - Prinsip Desain Arsitektur Di Dalam Pemrograman Object Oriented (Single Responsibility)

Pendahuluan

Ketika kita menulis program dengan menggunakan paradigma OOP / Object Oriented baik menggunakan Java, PHP ataupun yang lain, kita akan banyak berinteraksi dengan Class maupun Object. Dan tidak dapat dipungkiri bahwa interaksi antar Object tersebut akan memunculkan tantangan baru, yaitu kode akan susah dibaca, kode menjadi susah dikembangkan, dan ketika di kembangkan memunculkan BUG dan lain sebagainya.

Oleh karena beberapa kendala tersebut, maka ada baiknya kita perlu mempelajari beberapa prinsip penulisan kode di dalam OOP yang dikenal dengan nama SOLID. 

SOLID

SOLID sendiri merupakan sebuah prinsip yang dikenalkan oleh RObert J Martin (Uncle Bob) di dalam paper yang diterbitkan pada tahun 2000 dengan tujuan untuk membuat kode yang lebih mudah dimengerti, dapat dibaca dan mudah dalam melakukan testing. tonton di sini.

SOLID sendiri merupakan singkatan / akronim dari beberapa prinsip, antara lain: 

  • S - Single Responsibility
  • O - Open / Close
  • L - Liskov Substitution
  • I - Interface Segregation
  • D - Dependency Inversion

Dengan mengadopsi kelima prinsip diatas, akan membantu kita dalam menulis kode yang bersih, lebih mudah di maintenance, dan dikembangkan sesuai dengan kebutuhan sistem. Di tulisan ini, akan saya bahas 2 prinsip yaitu S  dan masing masing prinsip akan saya tulis di artikel terpisah.

S - Single Responsibility

A class should have one and only one reason to change, meaning that a class should have only one job.

Prinsip Single Responsibility merupakan prinsip yang mengharuskan suatu Class hanya mempunyai 1 tugas secara spesifik dan fokus mengerjakan suatu tugas tertentu. Sekarang kita lihat pada contoh Class berikut:

<?php

namespace App\Entity;

class Customer 
{
    /**
     * 
     * @var string
     */
    private $code;
    
    /**
     * 
     * @var string
     */
    private $name;
    
    /**
     * 
     * @var string
     */
    private $address;
    
    public function getCode(): ?string 
    {
        return $this->code;
    }

    public function getName(): string 
    {
        return $this->name;
    }

    public function getAddress(): string 
    {
        return $this->address;
    }

    public function setCode(string $code):self 
    {
        $this->code = $code;
    
        return $this;
    }

    public function setName(string $name):self  
    {
        $this->name = $name;
    
        return $this;
    }

    public function setAddress(string $address):self 
    {
        $this->address = $address;
    
        return $this;
    }

    public function save():void
    {
        // simpan ke database
    }
}

Class Customer diatas merupakan class yang merepresentasikan tabel yang ada di database. Pada Class diatas, mempunyai beberapa function getter() dan setter() dan juga mempunyai fungsi save() yang digunakan untuk menyimpan data ke storage.  

Secara prinsip SRP, Class diatas harus di pecah berdasarkan domain tugas. Karena Class tersebut merupakan representasi dari tabel di database, maka class tersebut hanya boleh mempunyai fungsi yang getter() dan setter() yaitu untuk menampung data dari baris di database ke dalam class, sedangkan fungsi save() yang merupakan fungsi untuk menyimpan data ke tabel perlu di pindah menjadi Class tersendiri. Hal ini akan memudahkan kita ketika suatu saat akan mengembangkan fungsi save() di kemudian hari, sehingga class Customer akan mebih mudah dibaca juga ketika terjadi perbahan metode penyimpanan, tidak menyebabkan error / mempengaruhi class Customer. Jadi ketika dipecah, kita akan mempunyai 2 Class yaitu Customer untuk representasi data / tabel dan CustomerRepository yang digunakan untuk operaasi ke database. Seperti contoh berikut: 

<?php

namespace App\Entity;

class Customer 
{
    /**
     * 
     * @var string
     */
    private $code;
    
    /**
     * 
     * @var string
     */
    private $name;
    
    /**
     * 
     * @var string
     */
    private $address;
    
    public function getCode(): ?string 
    {
        return $this->code;
    }

    public function getName(): string 
    {
        return $this->name;
    }

    public function getAddress(): string 
    {
        return $this->address;
    }

    public function setCode(string $code):self 
    {
        $this->code = $code;
    
        return $this;
    }

    public function setName(string $name):self  
    {
        $this->name = $name;
    
        return $this;
    }

    public function setAddress(string $address):self 
    {
        $this->address = $address;
    
        return $this;
    }
}
<?php

namespace App\Repository;

use App\Entity\Customer;

class CustomerRepository 
{
    public function save(Customer $customer):void
    {
        // simpan customer ke database
    }
    
    public function findAll():array
    {
        // select all dari database
    }
}


Dengan memisahkan Class berdasarkan tugas secara spesifik, kode yang kita tulis lebih mudah untuk di kembangkan, lebih mudah dibaca dan lebih mudah untuk di maintenance dan juga mudah untuk berkolaborasi tanpa mengganggu / konflik.

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