【问题标题】:Get rid of god object of QMainWindow摆脱 QMainWindow 的上帝对象
【发布时间】:2013-06-13 06:06:18
【问题描述】:

我正在使用三个库 ITK VTKQt 创建一个应用程序。因为我想要事件循环中的所有功能以及信号和插槽的连接,所以我在 QMainWindow 定义下定义了所有功能。现在主窗口对象变得庞大,我尝试为不同的功能创建不同的类,但是main.cpp 中的所有东西都搞砸了,模块化的想法消失了。你能建议一个程序的结构吗?

【问题讨论】:

    标签: qt vtk modularity itk god-object


    【解决方案1】:

    我在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_;
        // ...
    }
    

    您如何选择FooBar 类以及将MainWindow 的哪些成员转移到这些新类当然取决于您的上下文。但想法是巧妙地组织你的代码,让每个类都有一个“职责”,然后MainWindow 可以将每项工作委托给负责这项工作的类。就像在一个房子里,有电工管理电力,管道工管理水等等……而管家的职责只是召集合适的人做合适的工作。在您的情况下,您可能希望一个类执行与ITK 相关的任何工作,以及一个执行与VTK 相关的任何工作的类,然后如果它们也变得庞大,请细分这些类。

    【讨论】:

    • 这是我要摆脱的东西
    • 我的回答解释了你是如何摆脱它的,不是吗?如果你比较这两个版本,你会发现现在MainWindow 类比以前更干净:)(FooBar 类可以移动到不同的文件中)。不可避免地,代码必须位于某个地方,它不会由编译器发明。您的角色是将其组织在不同的类(以及文件)中,以使其更易于编写、阅读和维护。欲了解更多信息,您可以阅读以下内容:codeproject.com/Articles/22769/…
    • 你的回答就是我实际做的。但我不确定这是正确的方式还是不会导致整体事物在单个对象上中继。好的,谢谢你的链接。
    • @QT-ITK-VTK-Help:所以答案是:是的,你做对了 :) 为了进一步推理,最终,一切都由处理器按顺序执行。但重要的是不要避免在一天结束时一切都在单个对象上中继,而是将这些任务组织成更小的任务,更易于程序员管理。
    • 否,因为您定义的其他类可以完全独立于 GUI。例如,您可以完全独立于任何 QtGui 类创建一个类 PointCurveAddressBook。但是,您的MainWindow 只是“使用”这些类作为工具很好(因此没有耦合)。这里最重要的想法是,你的新类可以比你的MainWindow独立存在,甚至可以重复用于其他项目,这证明它们不是“耦合”的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 2016-05-02
    • 1970-01-01
    • 2010-12-07
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多