【问题标题】:container class member interaction容器类成员交互
【发布时间】:2015-04-24 01:12:26
【问题描述】:

我想就如何改进我的整体程序设计获得一些建议。

我有一个主类,它有两个经常需要相互交互的成员。这个类似容器的类有一个 Initialize() 函数,用于初始化这两个成员,以及提供对外部世界的访问的其他函数:

class Foo {
public:
    bool InitializeAandB();
    void UseFoo();

private:
    TypeA a;
    TypeB b;
};

在调用UseFoo() 之后的某个时刻,a 将需要调用b 的公共函数之一。所以,假设 TypeA 有一个这样的成员函数:

void TypeA::Function() {
    if (true) {
        TypeB *bpointer;
        bpointer->Interact(); // Need pointer to b here.
    }
}

TypeATypeB 是独立的实体,不能组合成一个类。碰巧这些独立的实体需要在不同的时间相互交互。

我不想公开ab,因为它们不应该从外界看到。将TypeATypeB 添加为Foo 中的朋友似乎是一个hacky 修复。也不理想,因为TypeATypeB 需要了解Foo,而他们只需要了解彼此。公共 GetA()GetB() 访问器函数也是如此。

第三种选择是将TypeB* 成员添加到TypeA,并将TypeA* 成员添加到TypeB,它们是在InitializeAandB() 期间设置的。但这在某种程度上似乎是多余的,就像我缺少更好的整体设计一样。

有没有更好的设计方法?

【问题讨论】:

  • 查看“朋友”关键字。

标签: c++ design-patterns


【解决方案1】:

TypeB * 作为参数传递给TypeA::Function() 怎么样(反之亦然)?

【讨论】:

  • 它会使耦合更紧密。不是一个好的解决方案。但这取决于 AB 实际上是什么。
【解决方案2】:

依赖注入是我能想到的唯一选择。

【讨论】:

    【解决方案3】:

    我同意@CreativeMind。你应该在这里使用 DI 容器。

    将初始化阶段重构为单独的类,用AB 的实例填充您的DI 容器。从它们的实现中提取接口并将其作为合同放在某处。现在它们是服务,可以互相请求容器。

    Foo 现在可以以同样的方式使用 AB - 通过容器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 2021-09-15
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 2015-03-21
      相关资源
      最近更新 更多