Hãy nhìn vào điều này thực tế
Obj 3
bây giờ biết Obj 4
tồn tại. Vậy thì sao? Tại sao chúng ta quan tâm?
Dip nói
"Các mô-đun cấp cao không nên phụ thuộc vào các mô-đun cấp thấp. Cả hai nên phụ thuộc vào trừu tượng hóa."
OK, nhưng không phải tất cả các đối tượng trừu tượng?
Dip cũng nói
"Trừu tượng không nên phụ thuộc vào chi tiết. Chi tiết nên phụ thuộc vào trừu tượng."
OK, nhưng nếu đối tượng của tôi được đóng gói đúng cách không ẩn bất kỳ chi tiết nào?
Một số người thích mù quáng khẳng định rằng mọi đối tượng đều cần một giao diện từ khóa. Tôi không phải là một trong số họ. Tôi thực sự muốn mù quáng khẳng định rằng nếu bây giờ bạn sẽ không sử dụng chúng, bạn cần có một kế hoạch để đối phó với việc cần một cái gì đó giống như chúng sau này.
Nếu mã của bạn hoàn toàn có thể tái cấu trúc trên mỗi bản phát hành, bạn chỉ có thể trích xuất các giao diện sau nếu bạn cần chúng. Nếu bạn đã xuất bản mã mà bạn không muốn biên dịch lại và thấy mình muốn nói chuyện qua một giao diện, bạn sẽ cần một kế hoạch.
Obj 3
biết Obj 4
tồn tại Nhưng có Obj 3
biết Obj 4
là bê tông không?
Đây là lý do tại sao nó rất tốt để KHÔNG lan rộng new
khắp nơi. Nếu Obj 3
không biết Obj 4
là cụ thể, có thể là do nó không tạo ra nó, sau đó nếu bạn lẻn vào sau và biến Obj 4
thành một lớp trừu tượng Obj 3
sẽ không quan tâm.
Nếu bạn có thể làm điều đó thì Obj 4
đã hoàn toàn trừu tượng tất cả cùng. Điều duy nhất làm cho một giao diện giữa chúng ngay từ đầu có được bạn là sự đảm bảo rằng ai đó sẽ không vô tình thêm mã mang lại sự Obj 4
cụ thể ngay bây giờ. Các nhà xây dựng được bảo vệ có thể giảm thiểu rủi ro đó nhưng điều đó dẫn đến một câu hỏi khác:
Là Obj 3 và Obj 4 trong cùng một gói?
Các đối tượng thường được nhóm theo một cách nào đó (gói, không gian tên, v.v.). Khi được nhóm một cách khôn ngoan sẽ thay đổi nhiều khả năng tác động trong một nhóm hơn là giữa các nhóm.
Tôi thích nhóm theo tính năng. Nếu Obj 3
và Obj 4
ở trong cùng một nhóm và lớp, rất có thể bạn sẽ không xuất bản một bản và không muốn cấu trúc lại nó trong khi chỉ cần thay đổi một bản khác. Điều đó có nghĩa là những đối tượng này ít có khả năng hưởng lợi từ việc có một sự trừu tượng hóa giữa chúng trước khi nó có nhu cầu rõ ràng.
Nếu bạn đang vượt qua một ranh giới nhóm mặc dù đó thực sự là một ý tưởng tốt để cho các đối tượng ở hai bên thay đổi độc lập.
Nó nên đơn giản nhưng thật không may, cả Java và C # đã đưa ra những lựa chọn đáng tiếc làm phức tạp điều này.
Trong C #, truyền thống đặt tên cho mọi giao diện từ khóa bằng I
tiền tố. Điều đó buộc khách hàng BIẾT họ đang nói chuyện với một giao diện từ khóa. Điều đó gây rối với kế hoạch tái cấu trúc.
Trong Java, truyền thống sử dụng một mẫu đặt tên tốt hơn: FooImple implements Foo
Tuy nhiên, điều này chỉ giúp ở cấp mã nguồn do Java biên dịch các giao diện từ khóa thành một nhị phân khác. Điều đó có nghĩa là khi bạn tái cấu trúc Foo
từ các máy khách cụ thể sang các máy khách trừu tượng không cần một ký tự mã đã thay đổi vẫn phải được biên dịch lại.
Đó là những L BUI trong các ngôn ngữ cụ thể này giúp mọi người không thể đưa ra sự trừu tượng hóa chính thức cho đến khi họ thực sự cần nó. Bạn không nói ngôn ngữ nào bạn đang sử dụng nhưng hiểu rằng có một số ngôn ngữ đơn giản là không có những vấn đề này.
Bạn không nói ngôn ngữ nào bạn đang sử dụng vì vậy tôi sẽ thôi thúc bạn phân tích ngôn ngữ và tình huống của bạn một cách cẩn thận trước khi bạn quyết định đó sẽ là giao diện từ khóa ở mọi nơi.
Nguyên tắc YAGNI đóng một vai trò quan trọng ở đây. Nhưng "Làm ơn hãy tự bắn vào chân mình".