- Modular Programming with PHP 7
- Branko Ajzele
- 267字
- 2021-07-14 10:06:01
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.
- Delphi程序設計基礎:教程、實驗、習題
- 趣學Python算法100例
- JS全書:JavaScript Web前端開發指南
- Python編程與幾何圖形
- Building a Quadcopter with Arduino
- Visual FoxPro 6.0程序設計
- Learning iOS Security
- Python開發基礎
- Moodle 3 Administration(Third Edition)
- 嵌入式Linux C語言程序設計基礎教程
- Python Social Media Analytics
- Android高級開發實戰:UI、NDK與安全
- AutoCAD基礎教程
- Python Penetration Testing Essentials
- BackTrack 5 Cookbook