Tên có cơ hội để truyền đạt ý nghĩa. Tại sao bạn lại vứt bỏ cơ hội đó với Impl?
Trước hết, nếu bạn chỉ có một lần thực hiện, hãy bỏ qua giao diện. Nó tạo ra vấn đề đặt tên này và không thêm gì. Thậm chí tệ hơn, nó có thể gây rắc rối với chữ ký phương thức không nhất quán trong API nếu bạn và tất cả các nhà phát triển khác không cẩn thận chỉ luôn sử dụng giao diện.
Do đó, chúng ta có thể giả định rằng mọi giao diện đều có hoặc có hai hoặc nhiều triển khai.
Nếu bạn chỉ có một cái ngay bây giờ và bạn không biết người kia có thể khác biệt như thế nào, Mặc định là một khởi đầu tốt.
Nếu bạn có hai cái ngay bây giờ, hãy đặt tên cho mỗi cái theo mục đích của nó.
Ví dụ: Gần đây, chúng tôi có một bối cảnh lớp cụ thể (tham chiếu đến cơ sở dữ liệu). Chúng tôi nhận ra rằng chúng tôi cần có khả năng thể hiện một bối cảnh ngoại tuyến, vì vậy tên Bối cảnh được sử dụng cho giao diện mới (để duy trì khả năng tương thích cho các API cũ) và triển khai mới được tạo ra, OfflineContext . Nhưng đoán xem ban đầu được đổi tên thành gì? Đúng vậy, ContextImpl ( yike ).
Trong trường hợp này, DefaultContext có thể sẽ ổn và mọi người sẽ nhận được nó, nhưng nó không được mô tả như nó có thể. Rốt cuộc, nếu nó không ngoại tuyến , thì nó là gì? Vì vậy, chúng tôi đã đi với: OnlineContext .
Trường hợp đặc biệt: Sử dụng tiền tố "I" trên các giao diện
Một trong những câu trả lời khác được đề xuất sử dụng tiền tố I trên các giao diện. Tốt hơn là, bạn không cần phải làm điều này.
Tuy nhiên, nếu bạn cần cả hai giao diện, để triển khai tùy chỉnh, nhưng bạn cũng có một triển khai cụ thể chính sẽ được sử dụng thường xuyên và tên cơ bản cho nó chỉ quá đơn giản để từ bỏ một giao diện, sau đó bạn có thể xem xét thêm "Tôi" với giao diện (mặc dù, nó hoàn toàn ổn nếu nó vẫn không phù hợp với bạn và nhóm của bạn).
Ví dụ: Nhiều đối tượng có thể là "EventDispatcher". Vì lợi ích của API, điều này phải phù hợp với một giao diện. Nhưng, bạn cũng muốn cung cấp một bộ điều phối sự kiện cơ bản cho đoàn. DefaultEventDispatcher sẽ ổn, nhưng nó hơi dài và nếu bạn sẽ thấy tên của nó thường xuyên, bạn có thể thích sử dụng tên cơ sở EventDispatcher cho lớp cụ thể và triển khai IEventDispatcher để triển khai tùy chỉnh:
/* Option 1, traditional verbose naming: */
interface EventDispatcher { /* interface for all event dispatchers */ }
class DefaultEventDispatcher implements EventDispatcher {
/* default event dispatcher */
}
/* Option 2, "I" abbreviation because "EventDispatcher" will be a common default: */
interface IEventDispatcher { /* interface for all event dispatchers */ }
class EventDispatcher implements IEventDispatcher {
/* default event dispatcher. */
}