Імена мають можливість передати значення. Чому б ви відкинули цю можливість разом із Impl?
Перш за все, якщо у вас буде лише одна реалізація, займіться інтерфейсом. Це створює цю проблему іменування і нічого не додає. Що ще гірше, це може спричинити проблеми з непослідовними підписами методів в API, якщо ви та всі інші розробники не будете обережні завжди використовувати лише інтерфейс.
Враховуючи це, ми можемо вважати, що кожен інтерфейс має або може мати дві або більше реалізації.
Якщо у вас зараз лише один, і ви не знаєте, чим може відрізнятися інший, Стандартний засіб - це гарний початок.
Якщо у вас зараз два, назвіть кожного відповідно до його призначення.
Приклад: Нещодавно у нас був конкретний клас Context (стосовно посилання на базу даних). Було зрозуміло, що нам потрібно вміти представляти контекст, який був офлайн, тому ім'я Context було використано для нового інтерфейсу (для підтримки сумісності для старих API), і була створена нова реалізація, OfflineContext . Але вгадайте, на що було перейменовано оригінал? Правильно, ContextImpl ( поступається ).
У цьому випадку DefaultContext , ймовірно, буде нормальним, і люди отримають його, але це не так описово, як це могло б бути. Зрештою, якщо це не офлайн , що це? Тож ми поїхали з: OnlineContext .
Особливий випадок: використання префікса "Я" на інтерфейсах
Один з інших відповідей пропонував використовувати префікс I на інтерфейсах. Переважно, не потрібно цього робити.
Однак якщо вам потрібен і інтерфейс, і для користувальницьких реалізацій, але ви також маєте первинну конкретну реалізацію, яка буде використовуватися часто, і основне ім'я для неї просто занадто просто, щоб відмовитися від інтерфейсу самостійно, тоді ви можете розглянути можливість додавання "Я" до інтерфейсу (хоча, це зовсім чудово, якщо він все ще не відповідає правильному для вас та вашої команди).
Приклад: Багато об'єктів можуть бути "EventDispatcher". Для API це повинно відповідати інтерфейсу. Але ви також хочете надати базовий диспетчер подій для делегації. DefaultEventDispatcher було б добре, але це трохи довго, і якщо ви збираєтеся бачити ім'я його часто, ви могли б віддати перевагу використовувати базове ім'я EventDispatcher для конкретного класу, а також здійснювати IEventDispatcher для призначених для користувача реалізацій:
/* 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. */
}