【问题标题】:Forward declaration container used to simplify class constructors用于简化类构造函数的前向声明容器
【发布时间】:2011-01-10 02:54:06
【问题描述】:

我从事一个庞大的遗留项目。有许多类基本上只创建一次(它们应该是单例,但是哦,好吧)然后传递给程序中几乎所有其他类。

所以有很多这样的代码,其中类在其构造函数中具有几乎无穷无尽的指针列表

Foo(A* a, B * b, C * c, ...) 
   : Foo2(a,b,c),
     _a(a),
     _b(b),
     _c(c),
     ...,
{} 

我想如果我使用一个类来包含所有指针并使用前向声明来避免创建更多包含依赖项,我可以清理它。每个类都可以使用 getter 来提取他们需要的任何内容并包含适当的标题。

//No includes required
class A;
class B;
class C;
class InterfaceMngr
{
public:
      InterfaceMngr(A * a, B * b, C* c)
       :_a(a),
        _b(b),
        _c(c)
      {
      }
     A * GetA() const { return _a; }
     B * GetB() const { return _b; }
     C * GetC() const { return _c; }

private:
     A * _a;
     B * _b;
     C * _c;
};

所以 foo 示例现在看起来更像这样

Foo(Interface * inf) 
 : Foo2(inf),
   _a(inf->GetA()),
   _b(inf->GetB()),
   _c(inf->GetC())
{}

好处是每当一个新的类 API 出现时,我可以将它添加到接口中,而无需再次更改数百个构造函数......

有人看到这个问题吗?我觉得我过度暴露了对某些类的访问权限,但它确实简化了代码的编辑。

【问题讨论】:

  • A、B、C 是相互关联的,还是正交的?

标签: c++


【解决方案1】:

我认为您正在查看 Context 设计 [anti-] 模式。

【讨论】:

  • +1 感谢您的链接,尼古拉。我对我在这里学到的所有新东西感到惊讶。 :-)
  • 我想知道这是否是面向方面的编程应该解决的问题?我还没有深入了解 AO。
【解决方案2】:

不要这么快就为缺少单身人士而悲叹。通过将对象实例传递给构造函数,可以更轻松地执行单元测试。

如果您要像这样聚合类指针,也许您应该考虑创建逻辑组而不是一个大的包罗万象的接口聚合。这将防止一切都依赖于其他一切。

Facade pattern 也可能对您有用。

【讨论】:

  • +1 用于提及单元测试,以及单例如何使其几乎不可能。
  • 为了使单例的单元测试更容易,您可以给自己留一个“后门”,以便测试工具可以切换单例实例,以便它引用其他东西(如模拟对象)。但是,当您进行集成测试时,这可能会开始崩溃。我没有太多机会探索这种“解决方法”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多