1

更新:我最初的问题不是很清楚。我正在寻找像下面示例这样的代码违反的原则的名称。

(我更新了代码示例以更好地类似于我正在谈论的场景。我包含的原始代码示例可以在底部找到。这是一个选择不当的示例,因为它说明了一个实际上应该提供访问的层次结构任意“深度”级别的子成员,而且几乎与构图无关,这就是我要问的问题。)


我很确定这有一个术语,我只是想不出它。

错误代码示例

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

4 回答 4

3

可能适用于这个例子的原则是:

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

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

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

接口隔离原则:一个类对另一个类的依赖应该依赖于尽可能小的接口。

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

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

得墨忒耳法则:只和你最亲密的朋友交谈。

得墨忒耳法则不鼓励像 p.Child.Child.Child 这样的深度访问层次结构。为什么?因为客户端会假设他们正在与之交谈的对象具有深入的结构知识,并且它增加了客户端和这些对象之间的耦合。话虽如此,我认为世界上有很多可以接受这种耦合的例子。您需要确定它是否也适用于您的情况。

编辑:通过您修改后的示例,得墨忒耳定律在我看来更接近您正在寻找的东西。

于 2010-06-20T16:55:52.543 回答
2

它似乎符合以下几个条件:消息链、中间人、不雅曝光,也许还有功能嫉妒。 http://www.codinghorror.com/blog/2006/05/code-smells.html

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

于 2010-06-20T16:27:20.017 回答
2

它被称为方法链接(嗯......在这个例子中它可能是属性链接)。它与fulent interface密切相关。

其中应该是您要查找的术语。

于 2010-06-20T16:46:27.570 回答
0

违反封装

于 2010-06-20T16:55:14.463 回答