Trước tiên, hãy hiểu rằng một lớp trừu tượng thuần túy thực sự chỉ là một giao diện không thể thực hiện nhiều kế thừa.
Viết lớp, trích xuất giao diện, là một hoạt động chết não. Nhiều đến mức chúng tôi có một cấu trúc lại cho nó. Đó là một điều đáng tiếc. Theo mô hình "mỗi lớp có một giao diện" này không chỉ tạo ra sự lộn xộn mà nó hoàn toàn bỏ lỡ điểm.
Một giao diện không nên được coi là chỉ đơn giản là một sự phục hồi chính thức của bất cứ điều gì mà lớp có thể làm. Một giao diện nên được coi là một hợp đồng được áp đặt bởi việc sử dụng mã khách hàng chi tiết hóa nhu cầu của nó.
Tôi không gặp khó khăn gì khi viết một giao diện hiện chỉ có một lớp thực hiện nó. Tôi thực sự không quan tâm nếu không có lớp nào thực hiện nó. Bởi vì tôi đang nghĩ về những gì tôi sử dụng mã cần. Giao diện thể hiện những gì sử dụng mã yêu cầu. Bất cứ điều gì đến sau này đều có thể làm những gì nó thích miễn là nó thỏa mãn những mong đợi này.
Bây giờ tôi không làm điều này mỗi khi một đối tượng sử dụng một đối tượng khác. Tôi làm điều này khi vượt qua một ranh giới. Tôi làm điều đó khi tôi không muốn một đối tượng biết chính xác đối tượng khác mà nó đang nói chuyện. Đó là cách duy nhất đa hình sẽ hoạt động. Tôi làm điều đó khi tôi mong đợi đối tượng mà mã khách hàng của tôi đang nói có khả năng thay đổi. Tôi chắc chắn không làm điều này khi thứ tôi đang sử dụng là lớp String. Lớp String rất hay và ổn định và tôi cảm thấy không cần phải đề phòng nó thay đổi.
Khi bạn quyết định tương tác trực tiếp với một triển khai cụ thể thay vì thông qua một sự trừu tượng, bạn dự đoán rằng việc triển khai đó đủ ổn định để tin tưởng không thay đổi.
Đúng vậy, đó là cách tôi tiết chế Nguyên tắc đảo ngược phụ thuộc . Bạn không nên mù quáng áp dụng điều này vào mọi thứ. Khi bạn thêm một sự trừu tượng, bạn thực sự nói rằng bạn không tin tưởng sự lựa chọn của lớp triển khai sẽ ổn định trong suốt vòng đời của dự án.
Tất cả điều này giả định rằng bạn đang cố gắng tuân theo Nguyên tắc Đóng mở . Nguyên tắc này chỉ quan trọng khi chi phí liên quan đến việc thay đổi trực tiếp mã được thiết lập là đáng kể. Một trong những lý do chính khiến mọi người không đồng ý về việc các đối tượng tách rời quan trọng như thế nào là bởi vì không phải ai cũng trải qua cùng một chi phí khi thực hiện các thay đổi trực tiếp. Nếu việc kiểm tra lại, biên dịch lại và phân phối lại toàn bộ cơ sở mã của bạn là chuyện nhỏ với bạn thì việc giải quyết nhu cầu thay đổi bằng sửa đổi trực tiếp có thể là sự đơn giản hóa rất hấp dẫn của vấn đề này.
Đơn giản là không có câu trả lời chết não cho câu hỏi này. Một giao diện hoặc lớp trừu tượng không phải là thứ bạn nên thêm vào mỗi lớp và bạn không thể chỉ đếm số lượng lớp thực hiện và quyết định nó không cần thiết. Đó là về việc đối phó với sự thay đổi. Điều đó có nghĩa là bạn đang dự đoán tương lai. Đừng ngạc nhiên nếu bạn hiểu sai. Giữ nó đơn giản như bạn có thể mà không cần lùi mình vào một góc.
Vì vậy, xin vui lòng, đừng viết trừu tượng chỉ để giúp chúng tôi đọc mã. Chúng tôi có các công cụ cho việc đó. Sử dụng trừu tượng để tách rời những gì cần tách rời.