I nomi hanno l'opportunità di trasmettere significato. Perché perdere questa opportunità con Impl?
Prima di tutto, se avrai sempre una sola implementazione, elimina l'interfaccia. Crea questo problema di denominazione e non aggiunge nulla. Ancora peggio, potrebbe causare problemi con firme del metodo incoerenti nelle API se tu e tutti gli altri sviluppatori non state attenti a usare sempre solo l'interfaccia.
Detto questo, possiamo supporre che ogni interfaccia abbia o possa avere due o più implementazioni.
Se ne hai solo uno in questo momento e non sai in che modo l'altro potrebbe essere diverso, Default è un buon inizio.
Se ne hai due in questo momento, nominali ciascuno secondo il suo scopo.
Esempio: recentemente abbiamo avuto un contesto di classe concreto (in riferimento a un database). Ci siamo resi conto che dovevamo essere in grado di rappresentare un contesto offline, quindi il nome Context è stato usato per una nuova interfaccia (per mantenere la compatibilità con le vecchie API) e una nuova implementazione è stata creata, OfflineContext . Ma indovina come è stato rinominato l'originale? Esatto, ContextImpl (yikes).
In questo caso, DefaultContext sarebbe probabilmente ok e la gente lo otterrebbe, ma non è così descrittivo come potrebbe essere. Dopo tutto, se non è offline , che cos'è? Quindi siamo andati con: OnlineContext .
Caso speciale: utilizzo del prefisso "I" sulle interfacce
Una delle altre risposte ha suggerito di utilizzare il prefisso I sulle interfacce. Preferibilmente, non è necessario farlo.
Tuttavia, se hai bisogno sia di un'interfaccia, per 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 "Io" all'interfaccia (tuttavia, va benissimo se non si adatta perfettamente a te e al tuo team).
Esempio: molti oggetti possono essere un "EventDispatcher". Per motivi di API, questo deve essere conforme a un'interfaccia. Tuttavia, si desidera anche fornire 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 utilizzare il nome base EventDispatcher per la classe concreta e implementare IEventDispatcher per 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. */
}