SOLID jsou pět principů návrhu pro vytváření udržovatelných a flexibilních OOP systémů. Každý z nich řeší běžnou příčinu tuhého a křehkého kódu.
| Písmeno | Princip | Jedno-věťová stručnost |
|---|
| S | Single Responsibility | Třída by měla mít jeden důvod ke změně |
| O | Open/Closed | Otevřeno pro rozšíření, uzavřeno pro modifikaci |
| L | Liskov Substitution | Podtypy musí být použitelné všude tam, kde je použit základní typ |
| I | Interface Segregation | Mnoho malých rozhraní je lepší než jedno tlustě |
| D | Dependency Inversion | Závisejte na abstrakcích, ne na konkrétních třídách |
# 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 není závislá na e-mailu konkrétně — bez doteku jej vyměňte za SMS nebo testovací double (D). Přidání nového typu notifier nevyžaduje žádnou změnu v OrderService (O).
SOLID je doporučením, ne zákonem. Přílišné uplaňování — rozhraní pro každou třídu, nepřímé volání všude — vytváří "polévku z abstrakcí", která je obtížnější sledovat, než problém, který vyřešila.
SOLID poskytuje sdílený diagnostický jazyk: recenzenti mohou jmenovat proč je třída obtížná na změnu ("toto porušuje SRP") místo argumentace na základě vkusu.
Při rozumném použití principy snižují efekty rozprostření — změny zůstávají lokální, nové funkce se rozšiřují namísto přepsání a testy mohou nahradit falešné objekty za skutečné závislosti.