簡體   English   中英

OOP依賴關系:依賴注入與注冊表

[英]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 ,但通常可以使用幾種不同的方法來完成 - 這些方法也可以共存。 這是一個(不完整的)列表:

  • 使用依賴注入容器
  • 將類依賴項作為構造函數或方法args傳遞
  • 使用中央注冊表(只要它是可配置的)
  • 使用setter方法設置依賴項
  • 使用配置文件
  • 用戶輸入
  • ...

需要依賴注入,因為對象需要某些數據才能正確執行其功能。

依賴注入可以通過三種不同的方式執行:

  • 如果對象A依賴於對象B,則可以在創建對象B時創建對象A.
  • 您可以使用一些外部類(如注冊表,配置文件等)來加載依賴項對象,這將使對象的創建與依賴項創建分離。 這稱為定位器模式,其中您的對象創建依賴於加載對象的定位器。
  • 您可以在其他位置創建依賴項,並將其直接提供給依賴對象。 這稱為“手動注射”

無論何時執行這些操作,您都在進行依賴注入:

構造函數注入

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM