【发布时间】:2013-06-13 06:06:18
【问题描述】:
我正在使用三个库 ITK VTK 和 Qt 创建一个应用程序。因为我想要事件循环中的所有功能以及信号和插槽的连接,所以我在 QMainWindow 定义下定义了所有功能。现在主窗口对象变得庞大,我尝试为不同的功能创建不同的类,但是main.cpp 中的所有东西都搞砸了,模块化的想法消失了。你能建议一个程序的结构吗?
【问题讨论】:
标签: qt vtk modularity itk god-object
我正在使用三个库 ITK VTK 和 Qt 创建一个应用程序。因为我想要事件循环中的所有功能以及信号和插槽的连接,所以我在 QMainWindow 定义下定义了所有功能。现在主窗口对象变得庞大,我尝试为不同的功能创建不同的类,但是main.cpp 中的所有东西都搞砸了,模块化的想法消失了。你能建议一个程序的结构吗?
【问题讨论】:
标签: qt vtk modularity itk god-object
我在main.cpp 中很少有比创建和显示我的QMainWindow,然后调用app.exec() 更多的东西。
如果您的QMainWindow 开始变得庞大,那么这意味着您可能应该将此代码组织到不同的连贯类中(而不是将其移动到main.cpp)。基本思想是修改如下代码:
class MainWindow : public QMainWindow
{
public:
void doSomething();
void foo1();
void foo2();
void foo3();
void bar1();
void bar2();
void bar3();
private:
// ...
}
如下代码:
class Foo:
{
public:
void doSomething1();
void doSomething2();
void doSomething3();
private:
// ...
}
class Bar:
{
public:
void doSomething1();
void doSomething2();
void doSomething3();
private:
// ...
}
class MainWindow : public QMainWindow
{
public:
void doSomething();
private:
Foo foo_;
Bar * bar_;
// ...
}
您如何选择Foo 和Bar 类以及将MainWindow 的哪些成员转移到这些新类当然取决于您的上下文。但想法是巧妙地组织你的代码,让每个类都有一个“职责”,然后MainWindow 可以将每项工作委托给负责这项工作的类。就像在一个房子里,有电工管理电力,管道工管理水等等……而管家的职责只是召集合适的人做合适的工作。在您的情况下,您可能希望一个类执行与ITK 相关的任何工作,以及一个执行与VTK 相关的任何工作的类,然后如果它们也变得庞大,请细分这些类。
【讨论】:
MainWindow 类比以前更干净:)(Foo 和Bar 类可以移动到不同的文件中)。不可避免地,代码必须位于某个地方,它不会由编译器发明。您的角色是将其组织在不同的类(以及文件)中,以使其更易于编写、阅读和维护。欲了解更多信息,您可以阅读以下内容:codeproject.com/Articles/22769/…
Point、Curve 或 AddressBook。但是,您的MainWindow 只是“使用”这些类作为工具很好(因此没有耦合)。这里最重要的想法是,你的新类可以比你的MainWindow独立存在,甚至可以重复用于其他项目,这证明它们不是“耦合”的。