Language agnostic 使用组合在类中公开成员(成员的,成员的…)以提供其功能的术语是什么?

Language agnostic 使用组合在类中公开成员(成员的,成员的…)以提供其功能的术语是什么?,language-agnostic,oop,composition,Language Agnostic,Oop,Composition,更新:我最初的问题不是很清楚。我正在寻找下面的示例代码违反的原则的名称 我已经更新了代码示例,以更好地模拟我所讨论的场景。我包含的原始代码示例可以在底部找到。这是一个选择不当的例子,因为它说明了一个分层结构,实际上应该在任意深度级别提供对子成员的访问,而且几乎与组合无关,这正是我想问的 我很确定这有一个术语,我只是想不起来 错误代码示例: 更好的代码示例: 我很确定我听说过直接公开成员对象,这样它的所有属性/方法都可以公开访问,这是一件坏事,因为[insert name of principle

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

我已经更新了代码示例,以更好地模拟我所讨论的场景。我包含的原始代码示例可以在底部找到。这是一个选择不当的例子,因为它说明了一个分层结构,实际上应该在任意深度级别提供对子成员的访问,而且几乎与组合无关,这正是我想问的

我很确定这有一个术语,我只是想不起来

错误代码示例:

更好的代码示例:

我很确定我听说过直接公开成员对象,这样它的所有属性/方法都可以公开访问,这是一件坏事,因为[insert name of principle here]。我要找的词是什么

请注意,我不是在问为什么这是/不是一件坏事;我只是在找这个词,我一辈子都记不起来了

原始错误代码示例:


它似乎符合几个条件:信息链、中间人、不雅曝光,也许还有功能嫉妒。


如果经常使用这种模式,您可能需要一个名为Great孙子的属性来进行内部查找。

它似乎符合以下几个条件:消息链、中间人、不雅曝光,可能还有功能嫉妒。

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

它被称为well。。。在本例中,可能是属性链接。 这与我们的生活息息相关

其中一个应该是您要寻找的术语。

它被称为well。。。在本例中,可能是属性链接。 这与我们的生活息息相关


其中一个应该是您正在寻找的术语。

违反?

违反?

适用于此示例的原则是:

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

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

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

接口隔离原则:一个类对另一个类的依赖性应该取决于最小的接口

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

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

得墨忒尔定律:只和你的直系朋友说话

德米特定律不鼓励像p.Child.Child.Child这样的深度访问层次结构。为什么?因为客户机随后假设他们正在与之交谈的对象具有深层结构知识,这增加了客户机和这些对象之间的耦合。话虽如此,我认为世界上有很多例子表明这种耦合是可以接受的;你需要决定它是否也适用于你的情况


编辑:通过您修改后的示例,我认为德米特定律更接近您的要求。

适用于此示例的原则有:

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

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

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

接口隔离原则:一个类对另一个类的依赖性应该取决于最小的接口

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

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

得墨忒尔定律:只和你的直系朋友说话

德米特定律不鼓励像p.Child.Child.Child这样的深度访问层次结构。为什么?因为客户机随后假设他们正在与之交谈的对象具有深层结构知识,这增加了客户机和这些对象之间的耦合。话虽如此,我认为世界上有很多例子表明这种耦合是可以接受的;你需要决定它是否也适用于你的情况



编辑:在你修改过的例子中,德米特定律在我看来更接近于你所寻找的。

也许这样更合适:Person great孙子=p.Children[Jim].Children[Tom].Children[Rick]@是的,我发布的这类课程设计得非常糟糕,每人一个孩子?;这只是为了提供一个例子。所有这些都是很好的答案。然而,我真的很傻,在我最初的问题中加入了一个坏例子;我真正想要的原则是得墨忒尔定律。错误代码示例是我的错。也许这样更合适:Person great孙子=p.Children[Jim].Children[Tom].Children[Rick]@是的,我发布的这类课程设计得非常糟糕,每人一个孩子?;这只是为了提供一个例子。所有这些都是很好的答案。然而,我真的很傻,在我最初的问题中加入了一个坏例子;我真正想要的原则是得墨忒尔定律。我的错误是错误的代码示例。这就是我要找的!得墨忒尔定律。谢谢。界面隔离原则和德米特定律有什么区别?ISP在逻辑上不意味着LoD吗?e、 g.如果一个类调用self.fieldA.fieldB.method违反LoD,那么self可能依赖于fieldA和fieldB的接口,两个接口而不仅仅是一个。@GregoryFenn我想它们是重叠的,可以相互补充,但我不认为其中一个必然意味着另一个,因为它们是关于一些不同的事情。如果一个对象需要调用self.fieldA.fieldB.method,LoD可能会说您需要将部分或全部fieldB接口提升到fieldA中,以完成self所需的功能。ISP可能会说你应该最小化这种提升,或者如果可以的话重新设计一些东西,这样提升就没有必要了。这就是我想要的!得墨忒尔定律。谢谢。界面隔离原则和德米特定律有什么区别?ISP在逻辑上不意味着LoD吗?e、 g.如果一个类调用self.fieldA.fieldB.method违反LoD,那么self可能依赖于fieldA和fieldB的接口,两个接口而不仅仅是一个。@GregoryFenn我想它们是重叠的,可以相互补充,但我不认为其中一个必然意味着另一个,因为它们是关于一些不同的事情。如果一个对象需要调用self.fieldA.fieldB.method,LoD可能会说您需要将部分或全部fieldB接口提升到fieldA中,以完成self所需的功能。ISP可能会说,你应该尽量减少吊装,或者如果可以的话,重新设计一些东西,这样吊装就没有必要了。请同时保留原始示例,以便原始答案有意义:-@欧文:打得好。我已经添加了原始的错误代码示例,以便早期的答案仍然有意义。请同时保留原始示例,以便原始答案有意义:-@欧文:打得好。我已经添加了最初的坏代码示例,以便早期的答案仍然有意义。好的答案。这是我的错,在我最初的问题中包含了一个糟糕的代码示例。回答得好。这是我的错,因为我在最初的问题中包含了一个糟糕的代码示例。
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;