名前には意味を伝える機会があります。なぜあなたはImplでその機会を捨てるのですか?
まず、実装が1つしかない場合は、インターフェースを廃止します。 この命名の問題を作成し、何も追加しません。さらに悪いことに、あなたと他のすべての開発者が常にインターフェイスのみを使用することに注意を払わないと、APIの一貫性のないメソッドシグネチャで問題が発生する可能性があります。
それを考えると、すべてのインターフェイスが 2つ以上の実装を持っているか、持っていると仮定できます。
現在1つしかなく、もう1 つがどのように異なるかわからない場合は、デフォルトが良いスタートです。
現在2つある場合は、目的に応じてそれぞれに名前を付けます。
例:最近、具体的なクラスContextがありました(データベースを参照)。オフラインのコンテキストを表現できるようにする必要があるため、Contextという名前を新しいインターフェイスに使用し(古いAPIとの互換性を維持するため)、新しい実装OfflineContextを作成しました。しかし、元の名前が何に変更されたと思いますか?そうです、ContextImpl(いいね)。
この場合、DefaultContextはおそらく大丈夫であり、人々はそれを取得しますが、それは可能な限り記述的ではありません。結局のところ、それがオフラインでない場合、それは何ですか?そこで、OnlineContextを使用しました。
特殊なケース: インターフェイスで「I」プレフィックスを使用する
他の回答の 1つは、インターフェイスでIプレフィックスを使用することを提案しました。できれば、これを行う必要はありません。
ただし、カスタム実装のために両方のインターフェースが必要であるが、頻繁に使用される主要な具体的な実装もあり、その基本名が単純すぎるためにインターフェースだけを放棄できない場合は、追加を検討できますインターフェイスへの「私」(ただし、それがまだあなたとあなたのチームにとって適切でない場合は完全に問題ありません)。
例:多くのオブジェクトは「EventDispatcher」になることができます。APIのために、これはインターフェイスに準拠する必要があります。ただし、委任用の基本的なイベントディスパッチャーも提供する必要があります。 DefaultEventDispatcherは問題ありませんが、少し長くなります。名前を頻繁に表示する場合は、具体的なクラスにはベース名EventDispatcherを使用し、カスタム実装にはIEventDispatcherを実装することをお勧めします。
/* 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. */
}