Namen haben die Möglichkeit, Bedeutung zu vermitteln. Warum sollten Sie diese Gelegenheit mit Impl verpassen?
Zunächst einmal, wenn Sie immer nur eine Implementierung haben, tun , weg mit der Schnittstelle. Es verursacht dieses Benennungsproblem und fügt nichts hinzu. Schlimmer noch, es kann Probleme mit inkonsistenten Methodensignaturen in APIs verursachen, wenn Sie und alle anderen Entwickler nicht darauf achten, immer nur die Schnittstelle zu verwenden.
Vorausgesetzt, wir können davon ausgehen, dass jede Schnittstelle zwei oder mehr Implementierungen hat oder haben kann .
Wenn Sie im Moment nur eine haben und nicht wissen, inwiefern sich die andere unterscheidet, ist Default ein guter Anfang.
Wenn Sie gerade zwei haben, benennen Sie jede nach ihrem Zweck.
Beispiel: Vor kurzem hatten wir eine konkrete Klasse Context (in Bezug auf eine Datenbank). Es wurde erkannt, dass wir in der Lage sein mussten, einen Kontext darzustellen, der offline war. Daher wurde der Name Context für eine neue Schnittstelle verwendet (um die Kompatibilität für alte APIs aufrechtzuerhalten), und eine neue Implementierung wurde erstellt, OfflineContext . Aber raten Sie mal, in was das Original umbenannt wurde? Das ist richtig, ContextImpl (yikes).
In diesem Fall wäre DefaultContext wahrscheinlich in Ordnung , und die Leute würden es bekommen, aber es ist nicht so beschreibend, wie es sein könnte. Wenn es nicht offline ist , was ist es dann? Also gingen wir mit: OnlineContext .
Sonderfall: Verwenden des Präfix "I" bei Schnittstellen
Eine der anderen Antworten schlug vor, das Präfix I für Schnittstellen zu verwenden. Vorzugsweise müssen Sie nicht brauchen , dies zu tun.
Wenn Sie jedoch für benutzerdefinierte Implementierungen sowohl eine Schnittstelle als auch eine konkrete Primärimplementierung benötigen , die häufig verwendet wird, und der grundlegende Name dafür einfach zu einfach ist, um auf eine Schnittstelle allein zu verzichten, können Sie das Hinzufügen in Betracht ziehen "Ich" zur Benutzeroberfläche (obwohl es völlig in Ordnung ist, wenn es für Sie und Ihr Team immer noch nicht richtig ist).
Beispiel: Viele Objekte können ein "EventDispatcher" sein. Für APIs muss dies einer Schnittstelle entsprechen. Sie möchten jedoch auch einen einfachen Ereignis-Dispatcher für die Delegierung bereitstellen . DefaultEventDispatcher wäre in Ordnung, aber es ist etwas lang, und wenn Sie den Namen häufig sehen, ziehen Sie es möglicherweise vor, den Basisnamen EventDispatcher für die konkrete Klasse zu verwenden und IEventDispatcher für benutzerdefinierte Implementierungen zu implementieren:
/* 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. */
}