更新:我原来的问题不太清楚。我正在寻找原则的名称,代码如下所示违反。
(我已经更新了代码示例以更好地类似我正在讨论的场景。我包含的原始代码示例可以在底部找到。这是一个选择不当的示例,因为它说明了一个实际< 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;
答案 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)