SOLID adalah lima prinsip desain untuk membangun sistem OOP yang dapat dipertahankan dan fleksibel. Masing-masing mengatasi penyebab umum kode yang kaku dan rapuh.
| Huruf | Prinsip | Arti satu baris |
|---|
| S | Tanggung Jawab Tunggal | Sebuah kelas harus memiliki satu alasan untuk berubah |
| O | Terbuka/Tertutup | Terbuka untuk perpanjangan, tertutup untuk modifikasi |
| L | Substitusi Liskov | Subtipe harus dapat digunakan di mana pun tipe dasar digunakan |
| I | Segregasi Antarmuka | Banyak antarmuka kecil lebih baik daripada satu yang besar |
| D | Inversi Ketergantungan | Bergantung pada abstraksi, bukan pada kelas konkret |
# Dependency Inversion: high-level code depends on an abstraction
class Notifier: # abstraction
def send(self, msg): ...
class EmailNotifier(Notifier):
def send(self, msg): print("email:", msg)
class OrderService:
def __init__(self, notifier: Notifier): # injected abstraction
self.notifier = notifier # not "new EmailNotifier()"
def place(self):
self.notifier.send("order placed") # works with ANY Notifier
OrderService tidak bergantung pada email secara spesifik — tukar dengan SMS atau double pengujian tanpa menyentuhnya (D). Menambahkan jenis pemberitahu baru tidak memerlukan perubahan pada OrderService (O).
SOLID adalah panduan, bukan hukum. Menerapkannya secara berlebihan — satu antarmuka per kelas, indirektor di mana-mana — menghasilkan "sup abstraksi" yang lebih sulit diikuti daripada masalah yang telah diselesaikannya.
SOLID memberikan bahasa diagnostik bersama: pengulas dapat menyebutkan mengapa kelas sulit untuk diubah ("ini melanggar SRP") alih-alih memperdebatkan berdasarkan selera.
Dengan bijaksana diterapkan, prinsip-prinsip mengurangi efek riak — perubahan tetap lokal, fitur baru diperluas daripada ditulis ulang, dan tes dapat mengganti tiruan untuk dependensi nyata.