SOLID là năm nguyên tắc thiết kế để xây dựng các hệ thống OOP dễ bảo trì, linh hoạt. Mỗi nguyên tắc giải quyết một nguyên nhân phổ biến gây ra code cứng nhắc, mong manh.
SOLID là năm nguyên tắc thiết kế để xây dựng các hệ thống OOP dễ bảo trì, linh hoạt. Mỗi nguyên tắc giải quyết một nguyên nhân phổ biến gây ra code cứng nhắc, mong manh.
| Chữ | Nguyên tắc | Ý nghĩa một dòng |
|---|
| S | Single Responsibility | Một class chỉ nên có một lý do để thay đổi |
| O | Open/Closed | Mở cho mở rộng, đóng cho sửa đổi |
| L | Liskov Substitution | Subtype phải dùng được ở bất cứ đâu base type được dùng |
| I | Interface Segregation | Nhiều interface nhỏ tốt hơn một interface phình to |
| D | Dependency Inversion | Phụ thuộc vào abstraction, không phải class cụ thể |
# Dependency Inversion: code cấp cao phụ thuộc vào một 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): # abstraction được inject
self.notifier = notifier # không phải "new EmailNotifier()"
def place(self):
self.notifier.send("order placed") # hoạt động với BẤT KỲ Notifier nào
OrderService không phụ thuộc cụ thể vào email — hoán đổi sang SMS hoặc một test double mà không cần đụng tới nó (D). Thêm một loại notifier mới không cần thay đổi OrderService (O).
SOLID là hướng dẫn, không phải luật. Áp dụng quá đà — một interface cho mỗi class, indirection ở khắp nơi — tạo ra "súp abstraction" còn khó theo dõi hơn bài toán mà nó định giải quyết.
SOLID cung cấp một ngôn ngữ chẩn đoán chung: người review có thể gọi tên tại sao một class khó thay đổi ("cái này vi phạm SRP") thay vì tranh luận theo cảm tính.
Áp dụng với sự cân nhắc, các nguyên tắc này giảm hiệu ứng lan tỏa — thay đổi giữ ở mức cục bộ, tính năng mới mở rộng chứ không viết lại, và test có thể thay thế dependency thật bằng đồ giả (fake).