Nazwy mają okazję przekazać znaczenie. Dlaczego miałbyś rzucić tę szansę z Impl?
Przede wszystkim, jeśli będziesz mieć tylko jedną implementację, zrezygnuj z interfejsu. Stwarza to problem z nazewnictwem i nic nie dodaje. Co gorsza, może to powodować problemy z niespójnymi podpisami metod w interfejsach API, jeśli ty i wszyscy inni programiści nie będziecie ostrożni, aby zawsze używać tylko interfejsu.
Biorąc to pod uwagę, możemy założyć, że każdy interfejs ma lub może mieć dwie lub więcej implementacji.
Jeśli masz teraz tylko jeden i nie wiesz, w jaki sposób ten drugi może być inny, domyślnie jest dobrym początkiem.
Jeśli masz teraz dwa, nazwij każdy zgodnie z jego przeznaczeniem.
Przykład: Niedawno mieliśmy konkretny kontekst klasy (w odniesieniu do bazy danych). Zdano sobie sprawę, że musimy być w stanie reprezentować kontekst, który był offline, więc nazwa Kontekst została użyta dla nowego interfejsu (w celu zachowania kompatybilności ze starymi interfejsami API) i utworzono nową implementację OfflineContext . Ale zgadnij, na co zmieniono nazwę oryginału? Zgadza się, ContextImpl (yikes).
W takim przypadku DefaultContext prawdopodobnie będzie w porządku, a ludzie to zrozumieją, ale nie jest tak opisowy, jak mógłby być. W końcu, jeśli nie jest offline , co to jest? Więc poszliśmy z: OnlineContext .
Przypadek specjalny: użycie przedrostka „I” na interfejsach
Jedna z pozostałych odpowiedzi sugeruje użycie przedrostka I w interfejsach. Najlepiej nie musisz tego robić.
Jeśli jednak potrzebujesz zarówno interfejsu do niestandardowych implementacji, ale masz również podstawową konkretną implementację, która będzie często używana, a podstawowa nazwa jest zbyt prosta, aby zrezygnować z samego interfejsu, możesz rozważyć dodanie „I” do interfejsu (choć jest całkowicie w porządku, jeśli nadal nie jest odpowiedni dla ciebie i twojego zespołu).
Przykład: Wiele obiektów może być „EventDispatcher”. Ze względu na interfejsy API musi to być zgodne z interfejsem. Ale chcesz również podać podstawowy moduł wysyłania zdarzeń do delegowania. DefaultEventDispatcher byłoby w porządku, ale to trochę długo, a jeśli będą często widząc jego nazwę, to może wolą używać nazwy baza EventDispatcher dla konkretnej klasy i wdrożenia IEventDispatcher dla niestandardowych implementacji:
/* 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. */
}