SOLID είναι πέντε αρχές σχεδιασμού για την κατασκευή συντηρήσιμων, ευέλικτων συστημάτων OOP. Καθεμία αναφέρεται σε μια κοινή αιτία άκαμπτου, εύθραυστου κώδικα.
| Γράμμα | Αρχή | Σημασία μιας γραμμής |
|---|
| S | Single Responsibility | Μια κλάση θα πρέπει να έχει έναν λόγο για αλλαγή |
| O | Open/Closed | Ανοικτή για επέκταση, κλειστή για τροποποίηση |
| L | Liskov Substitution | Οι υποτύποι πρέπει να είναι χρησιμοποιήσιμοι όπου χρησιμοποιείται ο βασικός τύπος |
| I | Interface Segregation | Πολλές μικρές διεπαφές είναι καλύτερες από μία παχιά |
| D | Dependency Inversion | Εξαρτάστε από αφαιρέσεις, όχι από συγκεκριμένες κλάσεις |
# 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 δεν εξαρτάται ειδικά από το ηλεκτρονικό ταχυδρομείο — αλλάξτε σε SMS ή ένα test double χωρίς να το αγγίξετε (D). Η προσθήκη ενός νέου τύπου notifier δεν απαιτεί αλλαγή στο OrderService (O).
SOLID είναι καθοδήγηση, όχι νόμος. Η υπέρμετρη εφαρμογή του — μια διεπαφή ανά κλάση, έμμεσες αναφορές παντού — παράγει "σούπα αφαίρεσης" που είναι δύσκολη να παρακολουθηθεί περισσότερο από το πρόβλημα που λύθηκε.
SOLID δίνει μια κοινή διαγνωστική γλώσσα: οι κριτές μπορούν να ονοματοποιήσουν γιατί μια κλάση είναι δύσκολη στην αλλαγή ("αυτό παραβιάζει SRP") αντί να διαφωνούν με βάση τη γεύση.
Εφαρμοζόμενες με κρίση, οι αρχές μειώνουν τα εφέ κυματισμού — οι αλλαγές παραμένουν τοπικές, τα νέα χαρακτηριστικά επεκτείνονται παρά ξαναγράφονται, και τα τεστ μπορούν να αντικαταστήσουν ψευδή με πραγματικές εξαρτήσεις.