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

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