I nomi hanno l'opportunità di trasmettere un significato. Perché dovresti buttare via quell'opportunità con Impl?
Prima di tutto, se avrai solo un'implementazione, elimina l'interfaccia. Crea questo problema di denominazione e non aggiunge nulla. Ancora peggio, potrebbe causare problemi con le firme dei metodi incoerenti nelle API se tu e tutti gli altri sviluppatori non state attenti a utilizzare sempre solo l'interfaccia.
Detto questo, possiamo supporre che ogni interfaccia abbia o possa avere due o più implementazioni.
-
Se ne hai uno solo adesso e non sai in che modo l'altro potrebbe essere diverso, Predefinito è un buon inizio.
-
Se ne hai due adesso, assegna un nome a ciascuno in base al suo scopo.
Esempio: recentemente abbiamo avuto una classe concreta Contesto (in riferimento a un database). Ci siamo resi conto che dovevamo essere in grado di rappresentare un contesto non in linea, quindi il nome Context è stato utilizzato per una nuova interfaccia (per mantenere la compatibilità per le vecchie API) e una nuova implementazione è stata creata, OfflineContext . Ma indovina a cosa è stato rinominato l'originale? Esatto, ContextImpl (yikes).
In questo caso, DefaultContext probabilmente andrebbe bene, e la gente lo otterrebbe, ma non è così descrittivo come potrebbe essere. Dopotutto, se è non offline , che cos'è? Quindi siamo andati con: OnlineContext .
Caso speciale: Uso del prefisso "I" sulle interfacce
Una delle altre risposte suggerito usando il prefisso I sulle interfacce. Preferibilmente, non hai bisogno di per farlo.
Tuttavia, se hai bisogno di un'interfaccia, per le implementazioni personalizzate, ma hai anche un'implementazione concreta primaria che verrà utilizzata spesso, e il nome di base è troppo semplice per rinunciare a un'interfaccia da solo, quindi puoi considerare di aggiungere "I" all'interfaccia (anche se va benissimo se non si adatta ancora a te e alla tua squadra).
Esempio: molti oggetti possono essere un "EventDispatcher". Per ragioni di API, questo deve essere conforme a un'interfaccia. Tuttavia, si desidera fornire anche un dispatcher di eventi di base per la delega. DefaultEventDispatcher andrebbe bene, ma è un po 'lungo, e se ne vedrai spesso il nome, potresti preferire usare il nome base EventDispatcher per la classe concreta e implementa IEventDispatcher per le implementazioni personalizzate:
/* 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. */
}