ホームページ  >  記事  >  バックエンド開発  >  依存関係注入がどのように分離を実現するかを深く理解する

依存関係注入がどのように分離を実現するかを深く理解する

Guanhui
Guanhui転載
2020-05-20 10:05:022140ブラウズ

依存関係注入がどのように分離を実現するかを深く理解する

第 1 章: シャオ ミンと携帯電話

むかしむかし、シャオ ミンという名前の男がいました。

シャオミンには喫煙と飲酒という 3 つの大きな趣味があります... ああ、ごめんなさい、間違ったセットに行ってしまいました。それは、Zhihu を閲覧すること、King Pesticide をプレイすること、WeChat の赤い封筒を手に入れることであるはずです。

依存関係注入がどのように分離を実現するかを深く理解する

Xiao Ming の 3 つの主要な趣味

単純な疑似コードを使用して、そんなシャオミン

class Ming extends Person
{
    private $_name;
    private $_age;
    function read()
    {
        //逛知乎
    }
    function  play()
    {
        //玩农药
    }
    function  grab()
    {
        //抢红包
    }
}

しかし、人間であるシャオミンは、上記の機能を自分で実現することはできません。携帯電話に頼らざるを得ません。それで、iPhone6を購入しました。次に、iPhone6を1台作りましょう。

class iPhone6 extends Iphone
{
    function read($user="某人")
    {
        echo $user."打开了知乎然后编了一个故事 \n";
    }
    function play($user="某人")
    {
        echo $user."打开了王者农药并送起了人头 \n";
    }
    function grab($user="某人")
    {
        echo $user."开始抢红包却只抢不发 \n";
    }
}

シャオミンは新しい携帯電話をとても大切にしていて、毎日しっかりと手に持って管理しているので、シャオミンはこんな感じになります

class Ming extends Person
{
    private $_name;
    private $_age;
    public function  __construct()
    {
        $this->_name = '小明';
        $this->_age = 26;
    }
    function read()
    {
        //……  省略若干代码
        (new iPhone6())->read($this->_name); //逛知乎
    }
    function  play()
    {
        //……  省略若干代码
        (new iPhone6())->play($this->_name);//玩农药
    }
    function  grab()
    {
        //……  省略若干代码
        (new iPhone6())->grab($this->_name);//抢红包
    }
}

今日は土曜日なので、シャオミンは行かなくても大丈夫です仕事に行くため、彼は立ち上がって、Zhihuを閲覧し、King Pesticideをプレイし、赤い封筒を手に取りました。

$ming = new Ming();  //小明起床
$ming->read();
$ming->play();
$ming->grab();

現時点では、コマンド ラインで次のような出力が表示されます。

Xiao Ming は Zhihu を開いてストーリーを作成しました

Xiao Ming は King Pesticide を開いて、送信しました 殺されました

シャオミンは赤い封筒を掴み始めましたが、掴むことしかできませんでしたが、渡すことはできませんでした

この日、シャオミンは充実した人生を送っていました。世界で一番幸せな人。

第 2 章: シャオ ミンの喜びと悲しみ

シャオ ミンと彼の携帯電話はかつて一緒に素晴らしい時間を過ごしました。自由時間があるとき、シャオ ミンは携帯電話を使ってハグしました。電話をしたり、Zhihuを閲覧したり、Weiboを閲覧したり、ゲームをしたりする彼は、彼女はまったく必要なく、携帯電話がそばにあれば満足できると感じていました。

しかし、システムのアップデートが何度も繰り返されることで彼の夢は完全に打ち砕かれ、携帯電話の動作はますます遅くなり、バッテリーの寿命はますます短くなり、ある日、冷たい風の中、彼の携帯電話が壊れてしまうと誰が想像したでしょうか。ついに寒さに耐えられなくなり、振り返らずに電源を切りました。

シャオミンはとても悲しく、携帯電話を変えなければならないことに気づきました。

より良いユーザー エクスペリエンスを得るために、Xiao Ming は歯を食いしばって iPhone を購入しました彼が遭遇した問題の 1 つは、オリジナルの iPhone 6 に依存しすぎており、両者が深く結びついていたことでした。携帯電話を変更するには、ナイフを使って変身し、体内のすべての方法を取り除く必要があります。すべての iPhone6 は iPhoneX に置き換えられました。

長い変換プロセス

長い変換プロセスを経て、Xiao Ming は最終的にコード内のすべての iPhone6 を iPhoneX に置き換えました。とても大変ですが、シャオミンは幸せだと感じています。

そこでシャオミンさんは喜んで携帯電話を職場に持って行きましたが、帰り道に泥棒に盗まれてしまいました。緊急事態に備えて、シャオミンさんは廃棄されたばかりの iPhone 6 を再利用するしかありませんでしたが、長い変革のプロセスを考えると、言葉では言い表せないほど悔しくなり、携帯電話に依存しすぎていると感じました。携帯電話に何か問題が起こるたびに、彼は感じていたのですか? 彼は自分自身を変えなければなりません。これは単なる過剰結合ではなく、単に本末転倒です。彼は空に向かって叫びました、私はそれをしたくないですもう携帯電話を制御できません。

空の創造主、つまりプログラマーである私が彼の叫び声を聞きました。私は彼に言いました、もう携帯電話を制御する必要はありません、管理は私に任せてください、私に制御を与えてください. .これを制御の反転といいます。

第 3 章: 創造者の知恵

シャオ ミンは私の言葉を聞きました。彼は嬉しかったですが、少し怖がっていました。彼はひざまずき、何度かひれ伏しました。 「あなたが伝説の創造主、バグメック神であることが判明しました。携帯電話の制御を私の手からあなたに渡すという、制御反転の 4 つの言葉を言ったと聞きましたが、これは「それはあなたの考えにすぎません。単なる考えです。制御の逆転を達成し、携帯電話を使い続けることができるようにするには、どのような方法を使用できますか?」 その後、私は 4 つの大きな言葉を投げかけました。「依存関係の注入!」

次に、偉大な私がシャオ ミンに次のような非人道的な変更を加え始めました。

class Ming extends Person
{
    private $_name;
    private $_age;
    private $_phone; //将手机作为自己的成员变量
    public function  __construct($phone)
    {
        $this->_name = '小明';
        $this->_age = 26;
        $this->_phone = $phone;
        echo "小明起床了 \n";
    }
    function read()
    {
        //……  省略若干代码
        $this->_phone->read($this->_name); //逛知乎
    }
    function  play()
    {
        //……  省略若干代码
        $this->_phone->play($this->_name);//玩农药
    }
    function  grab()
    {
        //……  省略若干代码
        $this->_phone->grab($this->_name);//抢红包
    }
}

次は、ある日シャオ ミンを実行するシミュレーションをしてみましょう。

$phone = new IphoneX(); //创建一个iphoneX的实例
if($phone->isBroken()){//如果iphone不可用,则使用旧版手机
    $phone = new Iphone6();
}
$ming = new Ming($phone);//小明不用关心是什么手机,他只要玩就行了。
$ming->read();
$ming->play();
$ming->grab();

まず、iPhone が携帯電話かどうかを確認してみましょう体内に直接注射されるため、どの携帯電話を持っているかを気にする必要はなく、ただ直接使用するだけで済みます。

これは依存性注入です。

第 4 章: シャオ ミンの洞察

シャオ ミンの生活はよりシンプルになり始め、節約できたすべての時間をメモを書くことに費やしました。これをノートに書きましょう

私は以前、支配欲が強く携帯電話に頼りすぎていたため、携帯電話と自分との連動性が高く、携帯電話に少しでも問題がある限り、これは本当に時間の無駄です。間違いを犯しやすいのです。私が創造主に制御を委ねて以来、創造主は毎日私を起こす前にすでに携帯電話を選んでいますので、私はそれがどんな携帯電話であるかは気にせず、いつものようにそれで遊ぶだけで済みます。携帯電話に問題があっても、創造主が直接解決してくれるので、自分で改造する必要はありません。私は今、携帯電話を7台購入し、創造主に渡しています。毎日1台ずつ変えています。とても幸せです!

私はまた、次の洞察を得ました。クラス A の関数実装がクラス B の助けを必要とする場合、クラス B はクラス A の依存関係であると言われます。クラスがクラス A 内でインスタンス化される場合、Bの場合、2 つの間に高度な結合が存在します。クラス B に問題が発生すると、クラス A も変換する必要があります。そのような状況が多く、各クラス間に多くの依存関係がある場合は、次のような問題が発生します。一度の攻撃で全身が影響を受けると、プログラムの維持が非常に困難になり、問題が発生しやすくなります。この問題を解決するには、クラスBからクラスAの制御を取り出して第三者に引き渡す必要があり、第三者に制御を逆転させることを制御の反転(IOC Inversion Of Control)といいます。制御の反転は問題を解決できるアイデアと考えられる結果であり、依存関係の注入 (Dependency Injection) はその最も代表的な実装方法です。サードパーティ (これを IOC コンテナと呼びます) が依存関係を制御し、コンストラクター、属性、またはファクトリー パターンなどのメソッドを通じて依存関係をクラス A に注入することで、クラス A とクラス B を大幅に分離します。

推奨チュートリアル: 「PHP チュートリアル

以上が依存関係注入がどのように分離を実現するかを深く理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はzhihu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。