デザインパターン:コントロールのIoCの反転、DI DI

基本コンセプト

制御の逆転(IOCと略す制御の反転は、)、オブジェクト指向プログラミングの1つの設計原理は、コンピュータ・コードとの間の結合の程度を減少させるために使用することができます。

最も一般的なメソッドが呼び出される依存性注入(DIと呼ばれる、依存性注入)「と呼ばれる方法がある依存のルックアップ」(依存ルックアップ)。

テクニカルノート

クラスA、クラスB、Bオブジェクトで使用、通常の状況下では、オブジェクトコードは、新規のBに明示的にAを必要とします。

DI技術を使用した後に、コードAは、外部関連するコンテナによって新たな制御プログラムに直接新しいオブジェクトなしで得られたプライベートオブジェクトB、が、オブジェクトBを定義する必要があり、クラスAに注入しました参照。状態は、構成ファイル(例えば、XML)で指定されたときに取得したオブジェクトを取得した詳細。#

例えば

Databaseクラスの次のコードは、データベースと対話するためのアダプタが必要です。私たちは、コンストラクタのカップリングで、その結果、アダプタをインスタンス化します。

<?php
namespace Database;

class Database
{
    protected $adapter;

    public function __construct()
    {
        $this->adapter = new MySqlAdapter;
    }
}

class MysqlAdapter {}

:上記のコードは、問題を生成し
、我々は新しいMySqlAdapter(文字列名)の初期化アダプターを使用するには、アダプタの生成モードを変更したい場合、あなたはコードのデータベースを変更する必要があり、1;
2、あなたがデータベースに異なる影響をテストする場合、アダプタので、非常に難しいMySqlAdapterオブジェクト初期化はコンストラクタデータベースの死者で書かれている;
3、新しいMySqlAdapter()プロセスが非常に遅く、我々は、単一の指標を使用したいと考えていているが良い、アダプタを初期化されている場合はモックは、このプロセスのアウトオブジェクトを非常に困難です。

依存性注入を使用して再建:

<?php
namespace Database;

class Database
{
    protected $adapter;

    public function __construct(MySqlAdapter $adapter)
    {
        $this->adapter = $adapter;
    }
}

class MysqlAdapter {}

上記のコードは、我々アダプタオブジェクトは、コンストラクタにパラメータとして渡されます。コンストラクタを呼び出す前に良いMysqlAdapterオブジェクトの外のデータベースを初期化されています。このように自分自身のイニシアチブに依存し、道の対外依存度を通過する非初期化され、我々は、依存性注入と呼ばれます。

復興のアップグレード版

<?php
namespace Database;

class Database
{
    protected $adapter;

    public function __construct(AdapterInterface $adapter)
    {
        $this->adapter = $adapter;
    }
}

interface AdapterInterface {}

class MysqlAdapter implements AdapterInterface {}

Databaseクラスは現在、より多くの利点を持っている実装依存と比較して、インターフェイスに依存します。

、あなたはチームで働く設計アダプターを担当する同僚と仮定する。最初の例では、我々は、ユニットテストに設計されたアダプタを完了した後に待機する必要があります。今、依存性は、インタフェース/慣例があることを、私たちすることができます簡単にシミュレートインターフェースのテスト、私たちは、同僚が合意アダプタに基づくことを理解するであろうことを知っているので、

この方法の大きな拡大の利点は、コードが高くなります。一年後、我々は別のデータベースに移行することを決定した場合は、我々だけで、対応するアダプタが実装するインタフェースを記述する必要があり、アカウントに注入アダプタインタフェースは、規則に従うことから、我々は追加の再構成を必要としません。

公開された165元の記事 ウォン称賛59 ビュー30000 +

おすすめ

転載: blog.csdn.net/weixin_43972437/article/details/103858533