Nguyên tắc đóng mở (OCP) nói rằng một đối tượng nên được mở để mở rộng nhưng đóng để sửa đổi. Tôi tin rằng tôi hiểu nó và sử dụng nó cùng với SRP để tạo các lớp chỉ làm một việc. Và, tôi cố gắng tạo ra nhiều phương thức nhỏ để có thể trích xuất tất cả các điều khiển hành vi thành các phương thức có thể được mở rộng hoặc ghi đè trong một số lớp con. Vì vậy, tôi kết thúc với các lớp có nhiều điểm mở rộng, có thể thông qua: tiêm phụ thuộc và thành phần, sự kiện, ủy quyền, v.v.
Hãy xem xét một lớp đơn giản, có thể mở rộng sau đây:
class PaycheckCalculator {
// ...
protected decimal GetOvertimeFactor() { return 2.0M; }
}
Bây giờ, ví dụ, OvertimeFactor
thay đổi thành 1,5. Vì lớp trên được thiết kế để mở rộng, tôi có thể dễ dàng phân lớp và trả về một lớp khác OvertimeFactor
.
Nhưng ... mặc dù lớp được thiết kế để mở rộng và tuân thủ OCP, tôi sẽ sửa đổi phương thức duy nhất được đề cập, thay vì phân lớp và ghi đè phương thức đang đề cập và sau đó nối lại các đối tượng của tôi trong bộ chứa IoC của tôi.
Kết quả là tôi đã vi phạm một phần những gì OCP cố gắng thực hiện. Cảm giác như tôi chỉ lười biếng vì ở trên dễ hơn một chút. Tôi có hiểu nhầm OCP không? Tôi có nên thực sự làm một cái gì đó khác nhau? Bạn có tận dụng các lợi ích của OCP khác nhau không?
Cập nhật : dựa trên các câu trả lời có vẻ như ví dụ giả định này là một ví dụ kém vì một số lý do khác nhau. Mục đích chính của ví dụ là chứng minh rằng lớp được thiết kế để được mở rộng bằng cách cung cấp các phương thức mà khi bị ghi đè sẽ thay đổi hành vi của các phương thức công khai mà không cần thay đổi mã nội bộ hoặc mã riêng. Tuy nhiên, tôi chắc chắn đã hiểu nhầm OCP.