gpt4 book ai didi

qt - Qt 的 GUI 编程中的单例是邪恶的吗?

转载 作者:行者123 更新时间:2023-12-04 13:03:26 24 4
gpt4 key购买 nike

我刚刚开始我的第一个相当大的 Qt 项目,它主要是一堆带有按钮、选项卡小部件和 Qwt Plots 的屏幕。 Qt Quarterly 27 中描述的面板集模式对我的应用程序来说似乎很不错。我的每个屏幕都是一个封装在面板中的 QWidget,它由 QStackedWidget 显示/隐藏。但是它使用 单例模式 对于每个面板,以便它们不会在应用程序启动时立即全部创建,并且每个屏幕不会创建多个。

所以我开始编码。使面板堆栈正常工作。添加了一些代码,以便动态更新小部件不会一直动态更新。让我的历史堆栈/后退按钮为面板工作。一切似乎都很好,但我有一个烦人的担忧:

  • 我的代码有味道。

  • 我无处可辩驳这里和博客上关于单例模式的任何仇恨。我想我明白了,我写的代码确实让我觉得所有的样板行和全局对象有点脏。但是我不喜欢在切换到屏幕并将其添加到我的历史堆栈之前不必担心我是否已经实例化了屏幕。我只是说切换到那个屏幕,它被添加到我的历史堆栈中,并且魔法起作用了。

    从我读过的内容来看,在某些情况下,单例也是值得的。这是那些特殊情况之一吗?魔术屏幕切换/历史堆栈让我觉得"is",但我将要创建的不同单例类的绝对数量让我觉得“不不不不不”。

    我只是想弄清楚如何从我的代码中获取单例模式 现在 这样我以后就不必这样做了。但我不想摆脱我所有的单例类(class)只是为了摆脱我的单例类(class),因为它们是邪恶的[需要引用]。

    非常感谢任何输入!

    最佳答案

    我并不真的讨厌单例,但这听起来像是一个对他们没有用的案例。我不明白为什么那篇文章中有这么多单例。

    首先,PanelStack 本身就是一个单例。为什么?如果那是您的主要小部件,那么只需在 main() 的堆栈上创建它,这样既干净又快捷。如果它是更复杂 UI 的一部分,则将其作为该 UI 的成员放在那里。一个普通的类在这里很好,使它成为单例只会限制它的可能用途。

    那么,每个面板也是单例吗?在这一点上,即使是单例爱好者也应该开始觉得他们已经太多了。这可能就是你首先问这个问题的原因。让我们看看单例在这里有什么真正的优势。好吧,我可以从那篇文章中发现的唯一优势是能够在需要时懒惰地动态创建面板。这其实是一件好事,但其实懒惰创建和单例是不同的模式,虽然一个经常使用另一个。

    为什么不把所有这些面板放在一些通用的容器中呢?在这种情况下,PanelStack 看起来像是一个完美的候选者。毕竟,这是存放面板的地方。让我们在 PanelStack 中创建一堆方法,而不是一堆单例:

    class PanelStack : public QWidget
    {
    Q_OBJECT

    public:
    int addPanel(AbstractPanel *);
    void showPanel(int);
    RecordingsPanel *getRecordingsPanel();
    ReecrdingDetailsPanel *getRecordingDetailsPanel();

    private:
    ...
    };

    等等。这些 get*Panel()方法仍然可以根据需要懒惰地创建面板。现在,它与拥有一堆单例基本相同,但增加了一些优势:
  • 如果我们使面板成为堆栈的子项,则在删除堆栈时会自动删除它们。无需担心内存管理,这对于单例来说总是很痛苦。
  • 您甚至可以在 PanelStack 中实现某种“垃圾收集器”,以删除一段时间未使用的面板。或者当达到某种“最大事件面板”限制时。

  • 现在,我能想到的唯一缺点是我们现在在堆栈和面板之间存在依赖关系。但更糟糕的是,将实例存储在一个类中,引入依赖项,还是全局存储它们?如果你认为堆栈应该独立于面板,这听起来很合理,那么我们可能只需要另一个类来放置所有这些东西。它可以是 QApplication 的子类,或者只是一些随机的“UI 管理器”类,但是将所有内容存储在一个地方仍然比将所有内容存储在全局范围内要好。

    在这里使用单例只会破坏封装并限制整个 UI 的可能用途。如果我们想要两个带有这些面板的窗口怎么办?还是多个选项卡(想想网络浏览器)?单例会咬紧牙关。只有当实例在许多不相关的类中被广泛访问时,它们才真正有用(想想数据库连接、记录器、池和其他典型的单例用途)。它们在 UI 中大多无用,因为使用 UI 几乎总是很明显“这个东西属于那里,可能没有其他地方”。

    关于qt - Qt 的 GUI 编程中的单例是邪恶的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5081220/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com