私が見たすべての MVC プロジェクトで、「サービス」クラスと「DAO」クラスは常に独自のインターフェイスを実装していました。しかし、ほとんどの場合、このインターフェイスが役立つ状況は見たことがありません。
これらの場合にインターフェイスを使用する理由はありますか? 「サービス」および「DAO」クラスでインターフェイスを使用しないと、どのような結果になる可能性がありますか? 私はどんな結果も想像できません。
私が見たすべての MVC プロジェクトで、「サービス」クラスと「DAO」クラスは常に独自のインターフェイスを実装していました。しかし、ほとんどの場合、このインターフェイスが役立つ状況は見たことがありません。
これらの場合にインターフェイスを使用する理由はありますか? 「サービス」および「DAO」クラスでインターフェイスを使用しないと、どのような結果になる可能性がありますか? 私はどんな結果も想像できません。
Spring は Inversion of Control コンテナです。これは、ある意味では、使用するクラスの実装がアプリケーションではなく、その構成に依存することを意味します。UserRepository
インスタンスを格納する必要があるクラスがあるUser
場合、それは次のようになります
class UserService {
@Autowired
private UserRepository userRepository;
}
interface UserRepository {
List<User> getUsers();
User findUserBySIN(String SIN);
List<User> getUsersInCountry(Long couyntryId);
}
そして、あなたはそれのために宣言されたBeanを持っているでしょう
<bean class="com.myapp.UserRepositoryHibernateImpl">
...
</bean>
この Bean はUserRepositoryHibernateImpl
を実装することに注意してくださいUserRepository
。
将来のある時点で、Hibernate プロジェクトのサポートが終了し、Mybatis でのみ利用可能な機能が本当に必要になるため、実装を変更する必要があります。UserService
クラスはインターフェイス型で宣言されたを使用しているためUserRepository
、インターフェイスで表示されるメソッドのみがクラスに表示されます。したがって、実際のポリモーフィック タイプを変更してuserRepository
も、残りのクライアント コードには影響しません。変更する必要があるのは (新しいクラスの作成を除く) だけです。
<bean class="com.myapp.future.UserRepositoryMyBatisImpl">
...
</bean>
アプリケーションは引き続き動作します。
インターフェイスを支持する議論はたくさんあります。Google を参照してください。
他の人が言及したポイントに追加できます:
要するに、インターフェースがあればいいだけです!
インターフェイスを早い段階で使用すると、アプリケーションはスケーラブルに対応できるようになります。インターフェイスを使用しないと、アプリケーションのスケーラビリティが犠牲になります。
私は最近、まったく同じ質問を自問してきました.1つの実装クラスが存在することを知っていても、インターフェースを作成するのはばかげており、肥大化に追加されていると感じています(より実用的な言語を試したすべてのJavaプログラマーは、フィーリング)。これはまた別のコンパイル モジュールであり、多くの場合、内なる独断主義者を満足させるためにのみ作成されます。
Spring は、プログラマーがブロックを作成するだけで、フレームワークがそれをすべて組み立てる、モジュール/コンポーネント指向のフレームワークに進化したようです。これが、基準に一致する複数の Bean を持つことが問題であり、物事を複雑にする理由です (DI の目的を殺すような修飾子を使用することになります)。プログラマーは当然、必要な構成の量を最小限に抑えるために、型のあいまいさを回避しようとします。理想的には、特定のブロックが 1 つの「スロット」にのみ収まるようにします。
私の意見では、DI の最大の利点は、(構成 XML で宣言されたクラスの型を変更するだけで) 実装を簡単に変更できることではなく、依存関係を簡単に分離できるため、各コンポーネントを分離して簡単にテストできることです。 . そのためには、1 つの子インターフェイスは必要ありません。
クラスをリバース エンジニアリングしてそのインターフェイスを抽出するのは純粋に機械的な作業になるため、「別の実装を追加する必要がある場合」について心配する必要はありません。口論。
免責事項: 中小規模のアプリケーション開発者の意見。大規模なプロジェクトでは状況が変わると確信しています。
インターフェイスベースの実装は、テスト スイートでそれらをモックするのに役立ちます。私たちのプロジェクトでは、サービス レイヤーをテストする際に、実際に DB に接続する代わりに、DAO をモックし、ハード コーディングされたデータを提供します。同じ議論がサービス層にも当てはまります。