【问题标题】:Mutual friendship and pointers: What Pattern or anti-pattern is this?相互友谊和指点:这是什么模式或反模式?
【发布时间】:2010-12-03 22:21:58
【问题描述】:

在研究一个大型应用程序的 C++ 源代码时,我发现了这种模式(示例的语法可能很粗略,但基本的细节在那里):

class A  :  X
   friend B;
   B *parent;
   ...stuff...

class B  : Y
   friend A;
   A *myhelper;
   ...stuff...

也许B类真的被命名为AHelper是有意义的,但我更好奇的是两个类之间这种相当对称的关系。这是标准 GoF 模式之一的一部分,还是已建立的反模式?除了细节之外,是否有一些概念或方式来理解这一点,整体大于部分?

将 A 和 B 合并为一个类有意义吗?每个类都继承自其他类 X、Y 的问题。我渴望重构这段代码,使其更易于维护和更小。

【问题讨论】:

    标签: c++ design-patterns refactoring class-design friend


    【解决方案1】:

    取决于类在做什么。如果它类似于迭代器模式(即std::vector<t>std::vector<t>::iterator),那么它可以用来做一些好事。

    另一方面,如果这些类在做根本不同的事情,最好只使用它们的公共接口相互公开它们。

    换句话说,我不认为它是一种模式或反模式——它完全取决于所讨论的实际类的使用。

    【讨论】:

      【解决方案2】:

      A 和 B 紧密耦合,但它们的生命周期可能不同。如果满足以下条件,可能值得归为一类:

      • A 和 B 具有相同的生命周期,因此一个总是与另一个同时存在。
      • 每个 B 实例总是有一个 A 实例,反之亦然。

      然而,情况可能并非如此。

      鉴于 A 派生自 X 而 B 派生自 Y,当我有联合耦合类时,通常是基类耦合,并且每个类不与另一个类的实际具体类交互。

      在那些情况下,它不是一个单一的生命周期关系,实际上我有一个主对象创建和加载较小的对象,这些对象返回到主对象以获取更多信息。

      我不知道模式是否有名字。我从不热衷于设计模式名称。

      【讨论】:

        猜你喜欢
        • 2011-02-24
        • 2021-12-06
        • 1970-01-01
        • 2010-11-02
        • 1970-01-01
        • 2016-09-13
        • 2014-09-30
        • 2023-03-11
        相关资源
        最近更新 更多