Tôi hơi bối rối về cách nguyên tắc Mở đóng có thể được áp dụng trong cuộc sống thực. Yêu cầu trong bất kỳ doanh nghiệp thay đổi theo thời gian. Theo nguyên tắc Mở-Đóng, bạn nên mở rộng lớp thay vì sửa đổi lớp hiện có. Đối với tôi mỗi lần mở rộng một lớp học dường như không thực tế để đáp ứng yêu cầu. Hãy để tôi đưa ra một ví dụ với hệ thống đặt vé tàu.
Trong hệ thống đặt vé tàu sẽ có một đối tượng Vé. Có thể có nhiều loại vé khác nhau Vé thông thường, Vé giảm giá, v.v. Vé là lớp trừu tượng và RoutTicket và ConcessionTickets là các lớp cụ thể. Vì tất cả các vé sẽ có phương thức PrintTicket là phổ biến, do đó, nó được viết trong Ticket là lớp trừu tượng cơ bản. Hãy nói rằng điều này làm việc tốt trong vài tháng. Bây giờ yêu cầu mới xuất hiện, trong đó tuyên bố thay đổi định dạng của vé. Có thể thêm vài trường được thêm vào vé in hoặc có thể thay đổi định dạng. Để đáp ứng yêu cầu này, tôi có các tùy chọn sau
- Sửa đổi phương thức PrintTicket () trong lớp trừu tượng Ticket. Nhưng điều này sẽ vi phạm nguyên tắc Mở-Đóng.
- Ghi đè phương thức PrintTicket () trong các lớp con nhưng điều này sẽ nhân đôi logic in vi phạm nguyên tắc DRY (Không lặp lại chính mình).
Vì vậy, câu hỏi là
- Làm thế nào tôi có thể đáp ứng yêu cầu kinh doanh trên mà không vi phạm nguyên tắc Mở / Đóng.
- Khi lớp học được cho là đóng cửa để sửa đổi? Các tiêu chí để xem xét lớp được đóng cửa để sửa đổi là gì? Có phải sau khi thực hiện ban đầu của lớp hoặc có thể là sau khi triển khai đầu tiên trong sản xuất hoặc có thể là một cái gì đó khác.