官术网_书友最值得收藏!

Dependency inversion principle

The dependency inversion principle states that entities should depend on abstractions and not on concretions. That is, a high level module should not depend on a low level module, rather the abstraction. As per the definition found on Wikipedia:

"One should depend upon abstractions. Do not depend upon concretions."

This principle is important as it plays a major role in decoupling our software.

The following is an example of a class that violates the DIP:

class Mailer {
    // Implementation...
}

class NotifySubscriber {
    public function notify($emailTo) {
        $mailer = new Mailer();
        $mailer->send('Thank you for...', $emailTo);
    }
}

Here we can see a notify method within the NotifySubscriber class coding in a dependency towards the Mailer class. This makes for tightly coupled code, which is what we are trying to avoid. To rectify the problem, we can pass the dependency through the class constructor, or possibly via some other method. Furthermore, we should move away from concrete class dependency towards an abstracted one, as shown in the rectified example shown here:

interface MailerInterface {
    // Implementation...
}

class Mailer implements MailerInterface {
    // Implementation...
}

class NotifySubscriber {
    private $mailer;

    public function __construct(MailerInterface $mailer) {
        $this->mailer = $mailer;
    }

    public function notify($emailTo) {
        $this->mailer->send('Thank you for...', $emailTo);
    }
}

Here we see a dependency being injected through the constructor. The injection is abstracted by a type hinting interface, and the actual concrete class. This makes our code loosely coupled. The DIP can be used anytime a class needs to call a method of another class, or shall we say send a message to it.

主站蜘蛛池模板: 前郭尔| 分宜县| 鄱阳县| 磴口县| 济宁市| 奉化市| 丰县| 都昌县| 庆云县| 公安县| 梅州市| 甘洛县| 台南市| 墨江| 屯门区| 九龙县| 澄江县| 太白县| 邻水| 青阳县| 巴彦县| 二手房| 麦盖提县| 贵溪市| 宝坻区| 宁晋县| 资源县| 安溪县| 旺苍县| 武清区| 正阳县| 平陆县| 如皋市| 岳阳县| 谢通门县| 开原市| 湄潭县| 东港市| 察雅县| 南郑县| 宁河县|