1

Head First Design Patterns では、実装ではなくインターフェイスにコーディングする必要があると述べましたが、コード例の最後の部分で混乱しました。実行時にオブジェクトの具体的な実装を割り当てると、どのように設計が改善されますか?

スーパータイプを使用するクラスのメソッド内にオブジェクトのインスタンスを配置する方が良いということですか? (特にオブジェクトをスーパークラスの変数に返すことを目的とするメソッド)

//Programming to an implementation would be:
Dog d = new Dog();
d.bark();

//Programming to an interface/supertype would be:
Animal animal = new Dog();
animal.makeSound();

//Even better is assigning the concrete implementation at runtime: (says the book)
a = getAnimal();
animal.makeSound();
4

2 に答える 2

1

さらに良い方法は、コード実行の環境/コンテキストに応じて、他の誰かが具体的なクラスを把握することです。これは制御の反転/依存性注入と呼ばれ、実際のクラスがいくつかの構成ファイルで構成されているか、規則によるコーディングを使用して正しいファイルを識別します。

理由に戻って、DB と対話しなければならない中程度の複雑さのプロジェクトを想像してみてください。DB にアクセスする方法をハードコーディングすると、顧客に特定のタイプ/バージョンの DB に固執するよう求めることになります。これが JDBC の仕組みです。同様に、より複雑なシナリオでは、DB ベースのシステム ファイル ベースから移行することを想像してください。ソフトウェアは柔軟性を考慮して設計する必要があることを理解すると、具象クラスの初期化の遅延を簡単に理解できます。

于 2013-10-02T02:55:39.177 に答える
0

その理由を一言で言うなら、中央集権化です。

これが意味することは、アプリケーションの開始時にこれらの具象型を単一の場所のどこかに割り当て、それらをインターフェイスとして必要とするクラスに提供することです。そのため、それらのクラスは具象型自体に結合されませんが、むしろ、それらの抽象化またはインターフェースに依存します。

これはFactory パターンの使用に似ているため、オブジェクトの作成をプログラム全体に広げるのではなく、後で簡単に変更できる単一の場所に作成します。

これにより、依存性注入制御の反転を使用できるようになり、テスト、保守性、ランタイム構成などの優れた機能が多数提供されます。

于 2013-10-02T12:41:39.673 に答える