SOLID je pet principa dizajna za izgradnju održivih, fleksibilnih OOP sustava. Svaki se bavi čestom uzrokom krutog, lomljivog koda.
| Slovo | Princip | Značenje u jednoj liniji |
|---|
| S | Jedina odgovornost | Klasa bi trebala imati samo jedan razlog za promjenu |
| O | Otvoren/Zatvoren | Otvoren za proširenje, zatvoren za izmjenu |
| L | Liskovska supstitucija | Podtipovi moraju biti upotrebljivi gdje god se koristi bazni tip |
| I | Segregacija sučelja | Više malih sučelja je bolje od jednog velikog |
| D | Inverzia ovisnosti | Zavisti od apstrakcija, ne od konkretnih klasa |
# 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 se ne oslanja specifično na email — zamijenite sa SMS ili test double bez dodira na njega (D). Dodavanje nove vrste notifikatora ne trebat će nikakvu promjenu na OrderService (O).
SOLID je smjernica, ne zakon. Prekompliciranje — sučelje po klasa, indirekcija svugdje — proizvodi "juhu od apstrakcije" koju je teže pratiti nego problem koji je riješila.
SOLID nudi zajednički dijagnostički jezik: recenzenti mogu pozvati zašto je klasa teška za promjenu ("ovo krši SRP") umjesto rasprave o ukusu.
Primijenjeni sa razborit, principi smanjuju efekte valovitosti — promjene ostaju lokalne, nove značajke se proširuju umjesto da se prepišu, i testovi mogu zamijeniti lažnjake za stvarne ovisnosti.