Một class hoặc module chỉ nên đảm nhận một vai trò duy nhất trong hệ thống.
Nếu một class có nhiều vai trò, thì bất kỳ thay đổi nào trong một vai trò cũng có thể vô tình ảnh hưởng đến vai trò khác → dễ gây lỗi, khó bảo trì.
Module nên cho phép mở rộng (extend) chứ không sửa đổi (modify) mã nguồn sẵn có.
Khi bạn cần thêm tính năng mới, bạn không nên chạm vào logic cũ nếu không cần thiết. Thay vào đó, nên mở rộng bằng cách thêm lớp mới hoặc kế thừa.
Class con phải có thể thay thế class cha mà không làm thay đổi logic chương trình.
Kế thừa phải giữ đúng hành vi gốc. Nếu subclass phá vỡ logic của superclass → không thể thay thế an toàn.
Đừng bắt class phải implement những method mà nó không dùng đến.
(Thay vì tạo một interface "to đùng" với quá nhiều phương thức, ta nên chia nhỏ nó thành nhiều interface chuyên biệt, phù hợp với từng nhu cầu của các class cụ thể.)
Module cấp cao không nên phụ thuộc trực tiếp vào module cấp thấp, mà cả hai nên phụ thuộc vào abstraction.
Nếu code phụ thuộc trực tiếp vào implementation cụ thể (ví dụ: MySQL), thì sẽ rất khó test, tái sử dụng hoặc thay đổi (ví dụ: muốn đổi sang MongoDB).