Les noms ont la possibilité de donner un sens. Pourquoi voudriez-vous jeter cette opportunité avec Impl?
Tout d’abord, si vous n’avez qu’une seule implémentation, supprimez l’interface. Cela crée ce problème de nommage et n’ajoute rien. Pire encore, des signatures de méthode incohérentes dans les API pourraient poser problème si vous et tous les autres développeurs ne faites pas attention à toujours utiliser uniquement l'interface.
Compte tenu de cela, nous pouvons supposer que chaque interface a ou peut avoir deux implémentations ou plus.
Si vous n'en avez qu'un pour le moment et que vous ne savez pas en quoi l'autre peut être différent, Default est un bon début.
Si vous en avez deux à présent, nommez-les chacun en fonction de son objectif.
Exemple: Nous avons récemment eu une classe concrète Context (en référence à une base de données). On s'est rendu compte qu'il fallait pouvoir représenter un contexte hors ligne. Le nom Context a donc été utilisé pour une nouvelle interface (afin de préserver la compatibilité des anciennes API) et une nouvelle implémentation a été créée, OfflineContext . Mais devinez quoi l'original a été renommé? C'est vrai, ContextImpl ( beurk ).
Dans ce cas, DefaultContext serait probablement correct et les gens l’obtiendraient, mais ce n’est pas aussi descriptif qu’il pourrait l’être. Après tout, si ce n'est pas hors ligne , qu'est-ce que c'est? Nous sommes donc allés avec: OnlineContext .
Cas particulier: utilisation du préfixe "I" sur les interfaces
Une des autres réponses suggéra d'utiliser le préfixe I sur les interfaces. De préférence, vous n'avez pas besoin de faire cela.
Toutefois, si vous avez besoin d'une interface pour les implémentations personnalisées, mais que vous avez également une implémentation concrète principale qui sera utilisée souvent, et que le nom de base qui lui est attribué est trop simple pour être abandonné à une seule interface, vous pouvez envisager d'ajouter "Je" à l'interface (cependant, c'est tout à fait bien si ça ne vous convient pas, à vous et à votre équipe).
Exemple: De nombreux objets peuvent être un "EventDispatcher". Pour les API, cela doit être conforme à une interface. Mais vous souhaitez également fournir un répartiteur d'événements de base pour la délégation. DefaultEventDispatcher conviendrait, mais il est un peu long et si vous voyez souvent son nom, vous préférerez peut- être utiliser le nom de base EventDispatcher pour la classe concrète et implémenter IEventDispatcher pour les implémentations personnalisées:
/* 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. */
}