【发布时间】:2011-01-07 05:32:45
【问题描述】:
我的应用程序包含几个模块(大类),如网络 io、数据存储、控件等。其中一些可以协作。什么是声明和绑定模块的好方法?我看到了几种可能性:
1) 所有模块都声明为全局的,所以我们在 main.cpp 中有
#include ...
ModuleA a;
ModuleB b;
ModuleC c;
例如,如果 a 想与模块 c 对话,我们将在 a.cpp 中包含以下内容:
#include "c.hpp"
extern ModuleC c;
等等;
2) 在 main() 中声明的所有模块,因此它们是本地的。绑定是在构造函数中进行的:
int main() {
ModuleC c;
ModuleA a(c);
ModuleB b;
}
但是这种方式很难绑定相互想要的对象(a(c),c(a))
3) 第一阶段:本地声明,第二阶段:用指针绑定:
int main() {
ModuleA a;
ModuleB b;
ModuleC c;
a.Connect(&b);
b.Connect(&a);
c.Connect(&a, &b);
}
有没有更好的方法?我希望它采用 cpp 风格。第三种方式保持指针有点混乱(尽管指针的有效性不会有问题,尽管模块一直存在,但仍然存在)并且有两阶段初始化,这不能保证我们不会忘记初始化一些模块,然后哎呀——一个无效的指针。如果某些对象需要交叉绑定,第二种方式(我认为)可能会使所有想法崩溃。第一种方式似乎很自然(因为模块代表应用程序本身),但它不是一种糟糕的风格吗?我看到了一些项目,其中模块是在某个 Universe 类中声明的,它们通过这个 Universe 进行合作,就像它们都是全局的一样。你怎么看?
谢谢。
【问题讨论】:
-
一般来说,大 class== 糟糕的设计