Имена имеют возможность передать смысл. Почему вы отказались от этой возможности с Impl?
Прежде всего, если у вас когда-либо будет только одна реализация, покончите с интерфейсом. Это создает проблему именования и ничего не добавляет. Хуже того, это может вызвать проблемы с непоследовательными сигнатурами методов в API, если вы и все другие разработчики не будете осторожны, чтобы всегда использовать только интерфейс.
Учитывая это, мы можем предположить, что каждый интерфейс имеет или может иметь две или более реализации.
Если у вас есть только один в данный момент, и вы не знаете, чем другой может отличаться, по умолчанию хорошее начало.
Если у вас есть два прямо сейчас, назовите каждого в соответствии с его назначением.
Пример: недавно у нас был конкретный класс Context (применительно к базе данных). Было понято, что нам нужно иметь возможность представлять контекст, находящийся в автономном режиме, поэтому имя «Контекст» использовалось для нового интерфейса (для обеспечения совместимости для старых API), и была создана новая реализация, OfflineContext . Но угадайте, во что переименовали оригинал? Это верно, ContextImpl (yikes).
В этом случае DefaultContext , вероятно, будет в порядке, и люди получат его, но это не так наглядно, как могло бы быть. В конце концов, если это не в автономном режиме , что это? Итак, мы пошли с: OnlineContext .
Особый случай: использование префикса «I» на интерфейсах
Один из других ответов предложил использовать префикс 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. */
}