暴露成员(成员,...)在使用合成的类中提供其功能的术语是什么?

时间:2010-06-20 15:15:31

标签: language-agnostic oop composition

更新:我原来的问题不太清楚。我正在寻找原则的名称,代码如下所示违反

(我已经更新了代码示例以更好地类似我正在讨论的场景。我包含的原始代码示例可以在底部找到。这是一个选择不当的示例,因为它说明了一个实际< em>应该提供对任意“深度”级别的子成员的访问,而且几乎与组合无关,这就是我想要询问的内容。)


我很确定这是一个术语,我只是在思考它。

错误代码示例

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;

4 个答案:

答案 0 :(得分:3)

可能适用于此示例的原则是:

信息隐藏:在代码中隔离可能会发生变化的设计细节。创建一个稳定的接口,保护程序的其余部分不受实现的影响。

封装:划分构成其结构和行为的抽象元素。将抽象的契约接口与其实现分开。使用标准语言机制将数据与接口捆绑在一起。

请注意,我给出的信息隐藏和封装的定义非常相似,不同的人对这些含义有自己的定义。我从维基百科中提取这些内容。

接口隔离原则:一个类与另一个类的依赖关系应取决于可能的最小接口。

您必须确定的问题是,以这种方式编写课程,Child本身是界面的一部分,是稳定最小界面客户要依赖。在大多数情况下,OO程序员更喜欢依赖一组明确的方法作为其接口而不是数据成员,以便他们可以随意更改数据成员。有人会建议将这种技术作为一种格言。它可能适用于您的情况,也可能不适用。

另一个原则可能适用于您的示例,也可能不适用:

德米特法则:只与你的直接朋友交谈。

Demeter法则不鼓励深层访问层次结构,如p.Child.Child.Child。为什么?因为客户端正在假设他们正在谈论的对象的深层结构知识,并且它增加了客户端与这些对象之间的耦合。话虽如此,我认为世界上有很多可以接受这种耦合的例子;你需要决定它是否适用于你的情况。

编辑:根据您修改过的示例,Demeter法则让我更接近您所寻找的内容。

答案 1 :(得分:2)

似乎有资格获得几个:消息链,中间人,不雅曝光,以及可能的特征嫉妒。 http://www.codinghorror.com/blog/2006/05/code-smells.html

如果频繁使用该模式,您可能需要一个名为GreatGrandChild的属性,在内部查找它。

答案 2 :(得分:2)

它被称为method chaining(在这个例子中,它可能是属性链)。 它与fulent interface密切相关。

这些应该是你正在寻找的术语。

答案 3 :(得分:0)

违反encapsulation