SOLID janë pesë parime të dizajnit për ndërtimin e sistemeve OOP të qëndrueshme dhe fleksibël. Secila adreson një shkak të zakonshëm të kodit të ngurtë dhe të brishtë.
| Shkronja | Parimi | Kuptimi në një rresht |
|---|
| S | Single Responsibility | Një klasë duhet të ketë një arsye për të ndryshuar |
| O | Open/Closed | E hapura për zgjerimet, e mbyllura për modifikime |
| L | Liskov Substitution | Nëntipet duhet të jenë të përdorshëm kudo që është tipi bazë |
| I | Interface Segregation | Shumë ndërfaqe të vogla janë më të mira se një e trashë |
| D | Dependency Inversion | Varen nga abstraksionet, jo nga klasat konkrete |
# 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 nuk varet nga emaili specifik — zëvendësoni me SMS ose një test double pa e prekur (D). Shtimi i një tipi të ri noticer nuk kërkon ndryshim në OrderService (O).
SOLID është udhëzim, jo ligj. Aplikimi i tepruar — një ndërfaqe për klasë, indirekim kudo — prodhon "супу абстракције" që është më e vështirë të ndjekesh se problema që zgjidhi.
SOLID jep një gjuhë diagnostike të ndarë: rishikuesit mund të emërtojnë pse një klasë është e vështirë të ndryshohet ("kjo shkel SRP") në vend të debateve për shijet.
Zbatime me gjykim, parimet zvogëlojnë efektet valës — ndryshimet qëndrojnë lokale, veçoritë e reja zgjerohen në vend se të rishkruhen, dhe testet mund të zëvendësojnë falsifikatat për varësitë reale.