Pengembangan perangkat lunak merupakan suatu proses yang dilakukan secara tim, sangat jarang perangkat lunak yang kompleks hanya dikerjakan oleh satu orang. Bekerja dalam tim tidaklah semudah bekerja sendiri.

Maka untuk memudahkan pekerjaan tim, setiap anggota harus memiliki pengetahuan tentang cara menulis kode dengan baik dan benar sehingga kode yang ditulisnya dapat dimengerti oleh anggota tim lain dan mudah untuk dikembangkan suatu saat nanti.

Pada tahun 2000-an Robert C Martin melalui publikasinya yang berjudul “Design Principle and Design Pattern” memperkenalkan konsep SOLID. Konsep ini bertujuan untuk menghasilkan kode yang reusebale, maintainable, scalable, dan testable, selain itu menerapkan konsep SOLID juga akan mempermudah software engineer bekerja dalam tim.

Peringatan!! Berhenti di sini jika Anda belum mengerti Object Oriented Programming (OOP).

What is SOLID?

SOLID merupakan singkatan dari Single-responsibility principle, Open-closed principle, Liskov substitution principle, Interface segregation principle dan Dependency Inversion Principle. Mari kita bahas satu persatu tentang konsep SOLID.

Single responsibility principle

“A Class should be responsible for a single task or a class must have a specific purpose.”

Suatu class tidak diperbolehkan untuk mengerjakan banyak hal. Misalnya di dalam class invoice terdapat fungsi untuk mencetak invoice, akses basis data, dan melakukan perhitungan order. Hal ini sangat bertentangan dengan Single responsibility principle.

Single responsibility principle artinya _s_etiap class wajib hanya memiliki satu tanggung jawab, dan hanya memiliki satu alasan untuk diubah. Contoh class untuk mendefinisikan struktur data hanya akan diubah jika terdapat perubahan pada struktur data, atau class yang mendefinisikan business logic hanya akan diubah jika terjadi perubahan business logic.

Salah satu implementasi dari Single responsibility principle adalah Repository Pattern. Penjelasan singkat dan implementasi Repository pattern pernah saya bahas di artikel sebelumnya (bisa dibaca di link bawah).

Secara singkatnya Repository Pattern …

Open-closed principle

“Software entities should be open for extension but closed for modification or the short

Dengan menerapkan Open-close principle kita harusnya bisa menambahkan fitur baru tanpa harus mengubah kode lama yang sudah ditulis sebelumnya. Hal ini dapat dilakukan dengan melakukan abstraksi yang tepat pada saat perancangan penulisan kode. Gunakan interface dan atau abstract classes. Open-closed Principle memaksa kita untuk menulis kode yang modular.

Mengubah kode yang telah ditulis sebelumnya dikhawatirkan akan menimbulkan bug di production. Selain itu, perlu dilakukan pengulangan testing pada kode lama yang seharusnya bisa dihindari jika menerapkan Open-closed Principle.

Liskov substitution principle

“Objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program.”

Konsep ini terkait dengan proses inheritance suatu fungsi atau objek. Dalam Liskov substitution principle, super class harus dapat digantikan dengan objek dari subclass-nya tanpa berefek pada suatu aplikasi. Hal ini dapat dilakukan dengan membuat objek dari subclass memiliki perilaku sama dengan superclass, misalnya parameter dan return value yang sama dengan superclass.

Interface segregation principle

“A client should not be forced to use an interface if it doesn’t need it.

Dalam bahasa Inggris segregation memiliki arti keeping things separated. jika dikaitkan dengan Interface segregation principle, maka artinya pemisahan interface.

Dalam pembuatan interface, lebih baik membuat banyak interface dengan fungsi yang spesifik. Hal ini lebih baik daripada membuat satu interface dengan fungsi yang tidak spesifik. Tujuan dari pemisahan interface adalah agar tidak memaksa client menggunakan kode yang tidak diperlukan.

Jika sudah ada interface yang tersedia, jangan menambahkan kode baru di interface. Lebih baik menambah interface baru yang masih berhubungan dengan interface lama, kemudian melakukan implement. Lagi pula satu class dapat melakukan implementasi lebih dari satu interface, jadi manfaatkan itu.

Dependency inversion principle

Dalam principle ini terdapat 2 aturan, yaitu:

  1. High-level modules should not depend on low-level modules, both should depend on abstraction.
  2. Abstractions should not depend on details. Details should depend on abstractions

Setiap class yang memiliki kompleksitas tinggi tidak boleh bergantung pada class yang memiliki kompleksitas rendah, dan untuk melakukan komunikasi setiap kelas harus melalui abstraksinya (interface).

Penutup

Konsep SOLID wajib dipahami oleh setiap software engineer setelah mempelajari Object Oriented Programming (OOP). Dengan implementasi konsep SOLID ini, maka kode yang ditulis akan lebih reusebale, maintainable, scalable, dan testable.

Reference

S.O.L.I.D: The First 5 Principles of Object Oriented Design | DigitalOcean

SOLID Principles: Explanation and examples

Original post from Medium on December 12, 2020