1

依存性注入パターンを使用して依存性を削除すると、別の場所に行き着きます。

たとえば、Snippet 1、または私が Object Maker と呼んでいるもの。

つまり、どこかでオブジェクトをインスタンス化する必要があるということです...したがって、あるオブジェクトから依存関係を移動すると、別のオブジェクトを置くことになります。

これにより、すべての依存関係が 1 つのオブジェクトに統合されていることがわかります。依存関係を減らして、それらがすべて単一の (できるだけ近い) 場所に存在するようにすることがポイントですか?

スニペット 1 - オブジェクト メーカー

<?php

class ObjectMaker
{
    public function makeSignUp()
    {
        $DatabaseObject = new Database();
        $TextObject = new Text();
        $MessageObject = new Message();

        $SignUpObject = new ControlSignUp();        
        $SignUpObject->setObjects($DatabaseObject, $TextObject, $MessageObject);
        return $SignUpObject;
    }
    public function makeSignIn()
    {
        $DatabaseObject = new Database();
        $TextObject = new Text();
        $MessageObject = new Message();

        $SignInObject = new ControlSignIn();
        $SignInObject->setObjects($DatabaseObject, $TextObject, $MessageObject);
        return $SignInObject;
    }
    public function makeTweet( $DatabaseObject = NULL, $TextObject = NULL, $MessageObject = NULL )
    {
        if( $DatabaseObject == 'small' )
        {
            $DatabaseObject = new Database();
        }
        else if( $DatabaseObject == NULL )
        {
            $DatabaseObject = new Database();
            $TextObject = new Text();
            $MessageObject = new Message();
        }
        $TweetObject = new ControlTweet();        
        $TweetObject->setObjects($DatabaseObject, $TextObject, $MessageObject);
        return $TweetObject;
    }
    public function makeBookmark( $DatabaseObject = NULL, $TextObject = NULL, $MessageObject = NULL )
    {
        if( $DatabaseObject == 'small' )
        {
            $DatabaseObject = new Database();
        }
        else if( $DatabaseObject == NULL )
        {
            $DatabaseObject = new Database();
            $TextObject = new Text();
            $MessageObject = new Message();
        }

        $BookmarkObject = new ControlBookmark();        
        $BookmarkObject->setObjects($DatabaseObject,$TextObject,$MessageObject);
        return $BookmarkObject;
    }
}
4

5 に答える 5

2

個人的には、オブジェクトをインスタンス化するのが理にかなっている場所ならどこでもオブジェクトをインスタンス化し、依存関係を特別なドキュメント ファイルに詳しく記録したいと考えています。

于 2012-04-14T22:29:00.087 に答える
2

いいえ、依存関係の統合とは関係ありません。オブジェクトをよりテストしやすくすることと関係があります。

はい、依存関係が別の場所に表示される傾向があるという副作用がありますが、重要なのは、依存関係がテストしているオブジェクトにないことです。

ターゲット オブジェクトに依存関係を作成しない場合は、テスト (またはフェイクまたはモック) オブジェクトをインスタンス化して、ターゲット オブジェクトにフィードできます。オブジェクトが独自の依存関係を作成した場合、それは不可能です。

このように考えてください。Car オブジェクトがあるとします。車がドライバーを作成した場合、他のドライバーがそれを運転する方法はありません。ハードコーディングされたドライバーの作成があるため、All Foo Car のみである可能性があります。

では、特別に設計されたレース トラックで車をテストするためのロボットを開発するとしましょう。繰り返しになりますが、ロボットを運転席に置くことはできませんでした。

もちろん、テスト容易性は依存性注入の利点の 1 つにすぎません。依存性を強制的に切り離すことは、より多くのモジュール コードを記述する必要があることを意味します。依存性注入フレームワーク (Crafty など) を使用している場合は、依存性を必要に応じて自動インスタンス化することができます。これには多くの利点がありますが、強力な型付き言語ではより多くの利点が得られる傾向があります。

于 2012-04-14T22:59:53.907 に答える
1

依存関係を減らして、それらがすべて単一の (できるだけ近い) 場所に存在するようにすることがポイントですか?

基本的にはそうだと思います、はい。アイデアは、アプリケーションのコンポーネントを疎結合にすることです。つまり、コンポーネントをより簡単に再利用し、交換し、テストすることができます。単純なアプリケーションを使用している場合、もちろん、必要な場所でオブジェクトをインスタンス化することは完全にうまく機能します。しかし、依存関係が複数ネストされて複雑になるにつれて、コードが密結合になる可能性があり、これは保守、適応、およびテストが困難になることを意味します。

于 2012-04-14T22:42:28.503 に答える
0

ウィキペディアの引用

従来のソフトウェア開発では、依存オブジェクトは、使用する具体的なクラスを自分で決定します。依存性注入パターンでは、この決定は「インジェクター」に委任されます。「インジェクター」は、コンパイル時ではなく実行時に、依存性コントラクトインターフェイスのさまざまな具象クラスの実装を置き換えることを選択できます。

DIは、不安定なクラスへの結合が少ない特定のクラスになります。注入されるインスタンスは通常、インターフェースの実装です。OCPは、実装の変更は、それらに依存するクローズドクラスの変更を必要とすべきではないと述べています。

tl; drクラスAは、それに注入されたインターフェースIの実装のみに依存しますが、よりまとまりがあります(責任が少なくなります)。他のクラスの中には、選択やインスタンス化などの責任に悩まされているものもありますが、そのクラスもよりまとまりがあります。

于 2012-04-15T23:23:08.507 に答える