[英]OOP Dependencies: Dependency Injection vs. Registry
我知道一些OOP並且已經讀過這個和那個,但是我不是一個硬核OOP人並且沒有正式的訓練並且無法解釋為什么某些東西應該使用依賴注入,並且可能無法識別設計中的所有依賴項因此我的問題。
在這里回答一個問題( 在其他對象的方法中使用對象 )我開始懷疑自己。 就依賴性而言,其中一種更好還是更差,還是兩者都可以接受? 任何設計限制?
我已閱讀並理解兩者,但從未遇到過比較。 為什么在設計中更好地使用它等等。
依賴注入:
class myClass {
private $db;
public function __construct($db) {
$this->db = $db;
}
}
注冊表(也許還有別的):
class myClass {
private $db;
public function __construct() {
$this->db = Registry::get('db');
}
}
它與可測試性有很大關系。
在您的示例中,第一個(依賴注入)更好。 它更好的原因是因為它接受db
作為參數,這意味着這是可測試的,你可以使用模擬db
進行測試和測試myClass
做正確的事情。
不建議使用第二個示例(注冊表),因為不僅myClass
依賴於db
,它現在還依賴於Registry
,最糟糕的是它知道如何獲取db
。 它太聰明了,它應該像第一個一樣愚蠢,愚蠢的東西更容易測試,聰明的東西不是。
兩種方法都是依賴注入的可能實現。 基本上,依賴注入意味着定義一種配置(注入)要在運行時使用的類的方法,以便與在代碼中使用硬編碼類名和構造函數相比,使代碼更靈活。 依賴注入遵循稱為inversion of control
原則。
這對於測試代碼尤其有用,但可以用於您希望使應用程序靈活和可維護的各種其他場景中。
雖然依賴注入主要被稱為DI container
,但通常可以使用幾種不同的方法來完成 - 這些方法也可以共存。 這是一個(不完整的)列表:
需要依賴注入,因為對象需要某些數據才能正確執行其功能。
依賴注入可以通過三種不同的方式執行:
無論何時執行這些操作,您都在進行依賴注入:
構造函數注入
public class ClassA
{
// declares the dependency in the constructor
public function ClassA( dependency1:String )
{}
}
// and the dependency is created while instantiating the object
var objA:ClassA = new ClassA("Hello World");
公共財產注入
public class ClassA
{
// declares the dependency as a public property
public var helloStr:String;
}
var obj1:ClassA = new ClassA();
// dependency is fulfilled by setting a public property after instantiation:
obj1.helloStr = "The Zen Master";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.