SOLID là 5 nguyên tắc thiết kế OOP (Robert C. Martin): S Single Responsibility, O Open/Closed, L Liskov Substitution, I Interface Segregation, D Dependency Inversion.
S — Single Responsibility: Một class chỉ có một lý do để thay đổi. Không phải "1 class = 1 method" mà là "1 class = 1 trục thay đổi".
java
// ❌ Vi phạm: class đổi vì 3 lý do khác nhau
class User {
void save() { /* DB */ } // đổi khi DB schema đổi
void sendWelcomeEmail() { /* SMTP */ } // đổi khi email provider đổi
String renderHtml() { /* HTML */ } // đổi khi UI đổi
}
// ✅ Tách theo trách nhiệm
class User { /* data + business invariant */ }
class UserRepository { void save(User u) {} }
class WelcomeEmailService { void send(User u) {} }O — Open/Closed: Module nên mở để mở rộng, đóng để sửa đổi. Thêm feature bằng thêm code, không sửa code cũ.
java
// ❌ Vi phạm: mỗi shape mới phải sửa method này
double area(Object shape) {
if (shape instanceof Circle c) return Math.PI * c.radius * c.radius;
if (shape instanceof Square s) return s.side * s.side;
// thêm Hexagon → phải sửa
}
// ✅ Open qua polymorphism
interface Shape { double area(); }
class Circle implements Shape { /* ... */ }
class Hexagon implements Shape { /* ... */ } // thêm mới — code cũ không đụngCông cụ đạt OCP: polymorphism, strategy pattern, DI container.
Lưu ý: OCP không có nghĩa "mọi class đều phải mở mở rộng" — premature abstraction là anti-pattern. Mở khi có lý do rõ (đã sửa nhiều lần hoặc biết trước nhiều biến thể).