Tôi có một chương trình đơn giản vẽ số liệu hình học dựa trên dữ liệu chuột do người dùng cung cấp. Tôi có một lớp học xử lý theo dõi chuột (nó nhận được Danh sách có lịch sử di chuyển chuột) và một lớp học trừu tượng có tên là Hình dạng là . Từ lớp này, tôi nhận được một số hình dạng bổ sung, như Circle, Rectangle, vv - và mỗi một trong số chúng sẽ ghi đè lên hàm Draw() trừu tượng.Lấy nguyên tắc đóng mở trong quá khứ
Tất cả đều hoạt động độc đáo, nhưng sự cố xảy ra khi tôi muốn người dùng có thể chuyển đổi hình dạng mong muốn Hình theo cách thủ công. Tôi nhận được dữ liệu chuột và tôi biết tôi nên vẽ hình dạng nào. Vấn đề là làm thế nào để làm cho mã để "biết" mà đối tượng nó nên tạo và vượt qua thông số appropiate cho constructor. Cũng không thể vào thời điểm này để thêm các dẫn xuất hình dạng mới, mà là sai lầm một cách không đúng.
tôi obiously không muốn đi ra với mã như:
List<Shape> Shapes = new List<Shape>();
// somwhere later
if(CurrentShape == "polyline"){
Shapes.Add(new Polyline(Points));
}
else if (CurrentShape == "rectangle"){
Shapes.Add(new Rectangle(BeginPoint, EndPoint));
}
// and so on.
Đoạn mã trên rõ ràng vilates Open-Closed Nguyên tắc. Vấn đề là tôi không có bất kỳ ý tưởng tốt nào để vượt qua nó. Vấn đề chính là các hình dạng khác nhau có các hàm tạo với các tham số khác nhau, khiến cho nó trở nên rắc rối hơn nhiều.
Tôi khá chắc chắn rằng đây là một vấn đề phổ biến, nhưng tôi không biết làm thế nào để vượt qua nó. Bạn có ý tưởng không?
Đó không phải là "Nguyên tắc đóng mở". Đó chỉ là đa hình –
Vâng, tôi muốn mã lớp Hình dạng được đóng cho phiên bản và mở cho các phần mở rộng, vì vậy tôi nghĩ rằng nó phù hợp với vấn đề OCP. –
Nhiều như bạn muốn nó là đúng, nó không phải! –