標籤:inter 不同 架構設計 方式 div 避免 str ace bsp
建議111:避免雙向耦合
雙向耦合是指兩個類型之間相互引用。下面的代碼是一種典型的雙向耦合:
class A { private B b; public void MethodA() { b.MethodB(); } } class B { private A a; public void MethodB() { a.MethodA(); } }
雙向耦合在同一項目下,不會存在太多的問題,帶來的只是設計問題。不過,如果兩個類在不同的項目中時,就必須考慮解耦了,因為.NET不允許項目之間相互引用。如果嘗試兩個項目相互引用將出現錯誤提示。
常見的解耦方式就是提煉出一個介面。如果A、B類型分別在兩個項目中,則提煉出來的介面要放在新起的項目中,然後讓A、B所在的兩個項目分別引用這個介面所在的項目。
解耦後的代碼如下所示:
interface ISample { void MethodA(); } class A : ISample { private B b; public void MethodA() { b.MethodB(); } } class B { ISample a; public void MethodB() { a.MethodA(); } }
介面ISample規範了類型A的行為,同時讓類型A繼承自ISample。在類型B中,我們針對介面編程,也就是說,在B中的欄位a不再是A類型,而是將其修改為ISample類型。
一般來說,類型之間不應該存在雙向耦合,如果有此類情況出現,則應該考慮重構。有一些第三方的架構都支援對項目進行解耦,如微軟企業庫(Enterprise Library)中的Unity和Spring.NET。在實際的編碼中,可以考慮使用這些架構設計我們的項目。
轉自:《編寫高品質代碼改善C#程式的157個建議》陸敏技
【轉】編寫高品質代碼改善C#程式的157個建議——建議111:避免雙向耦合