2010-06-20 34 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