SOLID Principles

 S.O.L.I.D

SOLID Principles ini dicetuskan oleh Uncle Bob di sekitar tahun 1995-an, yang mana ketika kita mengimplementasikannya dalam pengembangan software dengan pendakatan berbasis objek (object oriented), diharapkan akan membuat kode program menjadi lebih adaptif terhadap perubahan serta mudah dalam maintenance.

SOLID :

  • S : Single Responsibility Principle
  • O : Open Closed Principle
  • L : Liskov Substitution Principle
  • I : Interface Segregation Principle
  • D : Dependency Inversion Principle
Single Responsibility Principle : setiap class hanya memiliki 1 fungsi saja

Dalam project, misal terdapat class MyHomePage, class MyHomePage untuk menampilkan tampilan halaman home.



Open Closed Principle : setiap entitas perangkat lunak (class, module, fungsi, dsb.) sebaiknya terbuka untuk dilakukan ekstensi, dan tertutup untuk modifikasi. Kita seharusnya dapat menambahkan behavior baru tanpa perlu merubah implementasinya.

Tujuan dari prinsip ini untuk menghindari kemungkinan terjadinya bug-bug baru ketika kita merubah implementasi code yang sudah ada.


Ilustrasi untuk open closed principle :


Seperti gambar Illustrasi di atas, Terdapat 1 Mesin Blender, dan beberapa wadah untuk blender yang digunakan untuk kasus-kasus yang berbeda, dimana ada yang untuk memblender daging, memblender buah, memblender bumbu dapur. Jadi wadah tersebut memiliki fungsi yang berbeda-beda tanpa harus merubah fungsi utama dari mesin blender.


Liskov Substitution Principle : kelas turunan dapat menggantikan peran kelas parentnya




Interface Segregation Principle : Memecah sebuah abstrak yang terlalu besar menjadi beberapa abstrak yang lebih spesifik. Terkadang pada sebuah code yang dibutuhkan hanya beberapa method saja dari interface tersebut, sisanya tidak dibutuhkan dan beberapa diantaranya memiliki kohesi yang rendah, tidak saling terkait. Selain itu, sebuah abstraksi terlalu abstrak jika semuanya dikontrol oleh satu kelas yang sama. Dengan Interface Segregation, interface-nya jadi lebih spesifik tergantung dari kebutuhan yang diinginkan tanpa code yang tidak diperlukan. 

Dalam project, interface halaman login memiliki fungsi untuk user dapat mengisi username dan password dan melakukan login.

Dependency Inversion Principle : Modul level tinggi dan rendah bergantung pada abstraksi. Detail bergantung pada abstraksi.

Object Oriented Programming Principles (OO Principles)

Dalam Object Oriented programming, dikenal 4 prinsip yang menjadi dasar penggunaannya :

1. Encapsulation

Encapsulation atau pengkapsulan adalah konsep tentang pengikatan data atau metode berbeda yang disatukan atau “dikapsulkan” menjadi satu unit data. Maksudnya, berbagai objek yang berada dalam class tersebut dapat berdiri sendiri tanpa terpengaruh oleh yang lainnyaEncapsulation dapat mempermudah pembacaan kode. Hal tersebut terjadi karena informasi yang disajikan tidak perlu dibaca secara rinci dan sudah merupakan satu kesatuan. Proses enkapsulasi mempermudah untuk menggunakan sebuah objek dari suatu kelas karena kita tidak perlu mengetahui segala hal secara rinci.

2. Abstraction

Prinsip ini sendiri berarti memungkinkam seorang developer memerintahkan suatu fungsi, tanpa harus mengetahui bagaimana fungsi tersebut bekerja. Abstraksi mencoba menyembunyikan detail agar programmer dapat berfokus pada konsep tertentu saja pada satu waktu.

3. Inheritance

Inheritance dalam konsep OOP adalah kemampuan untuk membentuk class baru yang memiliki fungsi turunan atau mirip dengan fungsi yang ada sebelumnya. Konsep ini menggunakan sistem hierarki atau bertingkat. Maksudnya, semakin jauh turunan atau subclass-nya, maka semakin banyak logic yang berubah, tetapi tujuan dari fungsinya tetap sama. 

4. Polymorphism

Prinsip terakhir dalam OOP adalah polymorphism. Pada dasarnya polymorphism adalah kemampuan suatu pesan atau data untuk diproses lebih dari satu bentuk. Salah satu ciri utama dari OOP adalah adanya polymorphism. Tanpa hal ini, suatu pemrograman tidak bisa dikatakan sebagai OOP. Polymorphism sendiri adalah konsep di mana suatu objek yang berbeda-beda dapat diakses melalui interface yang sama. Sebagai gambaran ilustrasi :

ketika memiliki fungsi untuk menghitung luas suatu benda, sementara benda tersebut berbentuk segitiga, lingkaran, dan persegi. Ketiga benda tersebut memiliki rumus perhitungan tersendiri. Dengan polymorphism, kita dapat memasukkan fungsi perhitungan luas ke tiga benda tersebut, dengan tiap benda memiliki metode perhitungannya sendiri. 

Ini tentu akan mempermudah perintah yang sama untuk beberapa class atau subclass tertentu. 

Komentar