2010-06-20 22 views
1

UPDATE:我原來的問題不是很清楚。我正在尋找原理的名稱,該代碼如下面的示例違反揭露成員(成員,...)成員使用組合提供其功能的術語是什麼?

(我已經更新了代碼示例以更好地類似於我正在談論的場景,我所包含的原始代碼示例可以在底部找到,這是一個選擇不好的示例,因爲它實際上是一個層次結構, 提供在任意的「深度」級別的訪問子成員,而且幾乎沒有任何關係組成,這就是我的意思是問一下。)


我敢肯定有這是一個術語,我只是無法想到它。壞代碼

例子:

public interface IJumper 
{ 
    void Jump(); 
} 

public class Creature 
{ 
    public IJumper Jumper; 
} 

var c = new Creature(); 
c.Jumper.Jump(); 

更好的代碼例如:

public class Creature : IJumper 
{ 
    private IJumper _jumper; 

    public void Jump() 
    { 
     _jumper.Jump(); 
    } 
} 

var c = new Creature(); 
c.Jump(); 

我敢肯定,我聽說過這個(曝光成員對象直接使其所有的屬性/方法都可以公開訪問),這是由於[在這裏插入原則名稱]。我在找什麼詞?

(請注意,我不要求爲什麼這是/不是一件壞事,我只是尋找的期限,這對我的生活我不記得了。)


原件()的代碼示例

public class Person 
{ 
    public Person Child; 
    // ... 
} 

Person p = new Person("Philip J. Fry"); 

// what is the term for this? 
Person greatGrandchild = p.Child.Child.Child; 
+0

請保留原始示例以便原始答案有意義。 :-) – 2010-06-20 17:00:35

+0

@Owen S:很好的電話。我已經添加了原始(不好)的代碼示例,以便早期的答案仍然有意義。 – 2010-06-20 19:24:32

回答

3

原則是:

信息隱藏:·隔離設計細節在你的代碼有可能發生變化。創建一個穩定的接口,保護程序的其餘部分免於實現。

封裝:劃分構成其結構和行爲的抽象元素。將抽象的契約界面與其實現分開。使用標準語言機制將數據與接口捆綁在一起。

請注意,我給出的信息隱藏和封裝的定義非常相似,不同的人對它們的含義有不同的定義。我從維基百科拉了這些。

接口隔離原理:一個類與另一個類的依賴關係應取決於最小的可能接口。

您必須確定問題是編寫類這種方式,其中Child本身就是接口的一部分,是一個穩定最小接口,爲客戶依賴。在大多數情況下,OO程序員更喜歡依賴一組顯式的方法作爲接口而不是數據成員,以便他們可以隨意更改數據成員。有些人會推薦這種技巧作爲口號。它可能適用或不適用於你的情況。

有可能會或可能並不適用於你的例子另一個原則:

法德米特的:只有跟你的朋友即時。

德米特法律不鼓勵像p.Child.Child.Child這樣的深層訪問層次結構。爲什麼?因爲客戶隨後對他們正在談論的對象採取了深刻的結構性知識,並且增加了客戶與這些對象之間的耦合。話雖如此,我認爲世界上有很多這樣的耦合可以接受的例子。你需要決定它是否適用於你的情況。

編輯:通過修改後的例子,德米特定律讓我看起來更接近您要找的東西。

+0

這就是我一直在尋找的!德米特法則。謝謝。 – 2010-06-20 17:00:00

2

這似乎符合幾個:信息鏈,中男人,不雅的曝光,也許特徵嫉妒。 http://www.codinghorror.com/blog/2006/05/code-smells.html

如果頻繁使用該模式,您可能需要一個名爲GreatGrandChild的屬性,該屬性在內部查找它。

+0

也許這樣更合適: 'Person greatGrandchild = p.Children [「Jim」]。Children [「Tom」]。Children [「Rick」];' – ChaosPandion 2010-06-20 16:43:55

+0

@ChaosPandion:是的,一類我發佈的排序會非常可怕(每個人一個孩子?);這只是爲了提供一個例子。 – 2010-06-20 16:47:39

+0

所有優秀的答案。真的,我很愚蠢,在我的原始問題中包含了一個不好的例子,我真正*尋找的原則是德米特法則。我的錯誤代碼錯誤的例子。 – 2010-06-20 19:27:04

2

它叫做method chaining(在這個例子中,它可能是財產鏈)。 它與fulent interface有很強的聯繫。

對這些應該是你正在尋找的術語。

+0

很好的答案。這是我的錯,因爲在我最初的問題中包含了錯誤的代碼示例。 – 2010-06-20 19:27:33

相關問題