2015-05-13 53 views
2

搜索相關的緊耦合(當一組類是高度依賴於彼此) 例1有關組合物

class CustomerRepository 
     { 
      private readonly Database database; 

      public CustomerRepository(Database database) 
      { 
       this.database = database; 
      } 

      public void Add(string CustomerName) 
      { 
       database.AddRow("Customer", CustomerName); 
      } 
     } 
     class Database 
     { 
      public void AddRow(string Table, string Value) 
      { 
      } 
     } 

上面的類CustomerRepository不同的論壇後鬆耦合是依賴於數據庫類,以便它們緊密耦合。我認爲這個類也是Compostion的一個例子,然後我搜索了鬆耦合,所以改變了上面的類,以便消除緊耦合依賴。 例題

class CustomerRepository 
     { 
      private readonly IDatabase database; 

      public CustomerRepository(IDatabase database) 
      { 
       this.database = database; 
      } 

      public void Add(string CustomerName) 
      { 
       database.AddRow("Customer", CustomerName); 
      } 
     } 

     interface IDatabase 
     { 
      void AddRow(string Table, string Value); 
     } 

     class Database : IDatabase 
     { 
      public void AddRow(string Table, string Value) 
      { 
      } 
     } 

我已搜查該組成支持鬆耦合現在我的問題是如何例1是緊耦合的,因爲它是基於成分?其次是鬆散耦合與構圖之間的關係是什麼?

任何幫助將不勝感激。

回答

3

你在那裏有沒有真正緊密的耦合。緊耦合會是這樣:

class CustomerRepository { 
    private readonly Database database; 

    public CustomerRepository() { 
     this.database = new Database; 
    } 
} 

類有對特定Database類不能被取代的硬編碼依賴性。這是非常緊密的耦合。

您顯示的構圖示例已經鬆散耦合,因爲完全可以用任何其他Database繼承類來替換注入到構造函數中的依賴項。

你的第二個例子更加鬆散耦合,因爲它使用接口而不是具體的類;但這是一個小細節。

+0

謝謝,我想知道什麼是鬆散耦合和組合之間的關係? 構件如何支持鬆耦合,因爲它已完成類的訪問? – Ali

+2

組合描述將一個類的實例作爲屬性放在另一個類上。第二類是「由......組成」本身和另一類;即它可以使用其他類的功能而不需要「正在」另一個類(比如'extend')。 「鬆耦合」通常描述了*不硬編碼依賴關係*並允許它們被替換的想法。構圖是實現這一點的一種典型方式。 – deceze

2

@deceze的解釋你的大部分問題。我只是把我的2美分添加到他的答案中。

兩個示例都是鬆散耦合的,但程度不同。

示例-1您可以通過其構造函數注入具體類型的對象。

示例-2您可以通過其構造函數注入抽象類型的對象。

什麼讓示例2更加鬆散耦合是由於Dependency Inversion Principle。它的主要思想是 - 應該「取決於抽象。不要依賴於結核。「

第二個例子依賴於接口,而不是像第一個類的具體類。現在來了混亂 - 爲什麼接口是特殊的,爲什麼不他們兩個人都做同樣的事情?

讓我們假設明天如果要刪除Database類並將其替換爲新類FlatFile,則需要在第一個示例中更改CustomerRepository類,但不是第二個示例。在第二個示例中,僅創建CustomerRepository實例的人應該擔心用FlatFile類替換Database類。這是鬆散復活的意義Database類不應該強迫你改變CustomerRepository類。

要回答你的最後一個問題

什麼是鬆散耦合和組成之間的關係?

沒有直接的關係,你仍然可以使用組合,並通過不執行依賴倒置原則來搞亂類之間的耦合。所以你應該問的正確的問題是 -

如何使一個緊密耦合的代碼鬆散耦合?

按照依賴倒置原則。