設(shè)計原則之迪米特法則
迪米特法則減少了依賴性,并幫助構(gòu)建了松耦合的組件,以實現(xiàn)代碼重用,更易于維護和可測試性
迪米特法則是開發(fā)軟件應用程序的設(shè)計指南。該原理于1987年在東北大學首次討論,它指出一個對象永遠不應該知道其他對象的內(nèi)部細節(jié)。它旨在促進軟件設(shè)計中的松耦合。
注意,耦合可以被定義為軟件模塊之間存在的相互依賴程度以及這種模塊彼此之間的緊密連接程度。應用程序中組件之間的耦合越多,隨著時間的推移修改和維護它就越難。通過確保應用程序中的組件之間松散耦合,設(shè)計易于測試和維護的系統(tǒng)始終是一個好習慣。您可以在這里從我的文章中學到更多有關(guān)內(nèi)聚和耦合的知識。
了解迪米特法則原理
原理指出,模塊不應該了解其操作對象的內(nèi)部細節(jié)。換句話說,軟件組件或?qū)ο蟛粦摿私馄渌麑ο蠡蚪M件的內(nèi)部工作。讓我們通過一個例子來理解德米特定律。
考慮三個類-A,B和C-以及這些類的對象-分別為objA,objB和objC?,F(xiàn)在假設(shè)objA依賴于objB,而objB則由objC組成。在此場景中,objA可以調(diào)用objB的方法和屬性,但不能調(diào)用objC。
Demeter定律原理利用封裝來實現(xiàn)這種隔離并減少應用程序組件之間的耦合。這有助于提高代碼質(zhì)量,并提高靈活性和代碼維護難度。遵守Demeter定律的好處是您可以構(gòu)建易于維護且可適應未來變化的軟件。
考慮一個具有方法M的類C?,F(xiàn)在假設(shè)您創(chuàng)建了一個名為O的類C的實例。Demeter定律指定方法M可以調(diào)用以下類型的。,或者類的屬性應該調(diào)用以下類型僅成員:
相同的對象,即對象“ O”本身
作為參數(shù)傳遞給方法“ M”的對象
本地對象,即在“ M”方法內(nèi)部創(chuàng)建的對象
對象“ O”可訪問的全局對象
對象“ O”的直接組成對象
這是一個代碼清單,它說明了遵循Demeter法則的類及其成員。為了清楚起見,我在任何地方都提到了評論。
public class LawOfDemeterExample
{
//This is an instance in the class scope
//and hence this instance can be accessed by any members of this class
AnotherClass instance = new AnotherClass();
public void SampleMethodFollowingLoD(Test obj)
{
DoNothing(); //This is a valid call as you are calling a method of the same class
object data = obj.GetData(); //This is also valid since you are calling a method
//on an instance that has been passed as a parameter
int result = instance.GetResult(); //This is also a valid call as you are calling
//a method on an instance locally created
}
private void DoNothing()
{
// Write some code here
}
}
這是編譯以上代碼所需的其他兩個類。
public class AnotherClass
{
public int GetResult()
{
return -1;
}
}
public class Test
{
public object GetData()
{
return null;
}
}
現(xiàn)在,請參考上面顯示的LawOfDemeterExample類。該代碼是不言自明的?,F(xiàn)在,您可能想知道Demeter定律是否僅適用于方法。答案是不”。得墨Law耳定律原理也適用于性能。
違反Demeter原則的法律
在前面解釋的第一個代碼示例中,我們通過遵循Demeter原理來開始對此主題的討論。讓我們了解不遵循這一原則會發(fā)生什么??紤]下面的代碼示例。
var data = new A().GetObjectB().GetObjectC().GetData();
在此示例中,客戶端將必須依賴于類A,B和C。換句話說,它與類A,B和C的實例耦合。如果將來這些類發(fā)生更改,您將遇到麻煩您將自己暴露于將來任何此類課程中可能發(fā)生的變化。
