2010-01-27 30 views
0

我工作在一个庞大的传统项目上。有一些基本上只创建一次的类(它们应该是单例,但是很好),然后传递给程序中的几乎所有其他类。用于简化班级构造函数的前置声明容器

因此,有很多像这样的代码,其中的类具有指针的几乎不尽的名单在其构造

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

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

//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到图片我可以把它添加到界面,也不需要再次更改几百个构造函数....

有没有人看到这个问题?我感觉我已经暴露了对某些类的访问,但它确实简化了对代码的编辑。

+0

A,B,C是否相互关联,或者它们是正交的? – 2010-01-27 20:04:07

回答

2

我想你是看着Context设计[反]模式。

+0

+1感谢您的链接,尼古拉。我很惊讶于我在这里学习的所有新东西。 :-) – 2010-01-27 19:56:19

+0

我不知道这是面向方面的编程应该解决的问题吗?我还没有阅读过AO。 – 2010-01-27 20:01:53

+0

+1(间接)参考Demeter法。 – Ben 2010-01-27 20:17:56

2

不要那么快就会感叹缺乏单身。通过将对象实例传递给您的构造函数,可以更轻松地执行单元测试。

如果你打算聚集这样的类指针,也许你应该考虑创建逻辑组,而不是一个大的catch-all接口聚合。这将防止让所有东西都依赖于其他东西。

Facade pattern也可能对您有用。

+1

+1提单元测试,单身如何使它几乎不可能。 – Bill 2010-01-27 20:02:26

+0

为了使单元测试更容易,您可以将自己留在“后门”,以便测试工具可以切换单例实例,以便它引用其他内容(如模拟对象)。但是当你进行集成测试时,这可能会开始崩溃。我没有太多机会探索这个“解决方法”。 – 2010-01-27 20:11:54