【问题标题】:What's the rationale behind the Qt way of naming classes?Qt 命名类的方式背后的基本原理是什么?
【发布时间】:2009-08-28 10:43:28
【问题描述】:

我想知道为什么 Qt 在每个类名之前都使用 Q 而不是将所有内容都放在命名空间中。是否有任何特殊原因,例如让名称易于搜索,或者仅仅是品牌名称?

【问题讨论】:

  • 我知道这很挑剔,但“Rational”应该是“Rationale”。
  • 只是潜伏。就个人而言,作为一个非英语母语的人,我喜欢被纠正。我更喜欢被纠正而不是在不知不觉中继续使用错误的单词或短语。
  • @Matthew Talbert 我也同意 Stefano 的观点,不客气,Matthew
  • 我发现它比必须在所有内容之前输入“Qt::”要少得多。如果你说“哦,只使用命名空间”,那么它会与我的许多自定义/派生类发生冲突。

标签: api qt class naming-conventions namespaces


【解决方案1】:

我相信这是历史性的。命名空间在 1995 年左右被引入 C++。Qt 开发始于 1991 年,因此显然不能使用命名空间。

【讨论】:

    【解决方案2】:

    这可能是便携性问题。不是/不是每个编译器都支持命名空间,因此命名约定有助于减少命名冲突。

    【讨论】:

    • 默认情况下,Qt Designer 生成的代码使用 ui:: namespace ...我怀疑这可能不是问题
    • 是的,Qt 确实有一个Qt命名空间。它只是不包含类,只有一些枚举。
    【解决方案3】:

    Qt 的文档引用了 namespaces,尽管我没有检查代码是否真的是 c++ namespaces 或在类中带有公共声明的 hack。我猜想其余的都是试图避免导致每个人都需要重命名所有内容,尽管如果他们愿意,他们可以提供迁移路径,如下所示:

    namespace Qt
    {
    class Object { ... };
    }
    
    #ifndef NO_OLD_DECLS
    typedef Qt::Object QObject;
    #endif
    

    【讨论】:

      【解决方案4】:

      Qt 在它使用的 C++ 语言特性上非常保守。没有命名空间,exceptions or RTTI。另请参阅 this article 详细说明为什么在信号/槽处理中不使用模板。

      【讨论】:

      • 虽然我同意 Qt 是保守的,但您对无模板的链接是特定于信号/插槽机制的。 Qt 在很多代码中肯定使用模板。例外和 RTTI 的东西是由于在嵌入式设备上使用的,我敢打赌。许多嵌入式应用程序避免了这些,因为它们增加了开销。
      【解决方案5】:

      鉴于没有一个 C++ 编译器不实现命名空间,现在只有一个原因:品牌 :)

      【讨论】:

      • 可能没有当前编译器。但是还有很多人仍在使用不会/无法升级到最新版本的旧编译器。我并不是说这是一个很好的情况,但有时你只是因为各种技术/非技术原因而坚持使用蹩脚的旧编译器。
      • 即使每个人都使用了正确支持命名空间的新编译器(顺便说一句,我不同意你的说法——仍然有当前的编译器不能正确支持命名空间的所有细微差别),仍然有一个 lot 使用当前命名约定的 Qt 代码。您是否希望每个人都将所有 Qt 代码更改为新的命名约定,只是为了使用命名空间?
      • @Glen,Thomi:Qt 现在确实使用命名空间(自 4.0 起),因此任何没有至少基本支持的编译器都不再受 Qt 支持(无法支持)。
      【解决方案6】:

      Qt 使用 Q 前缀作为其编码风格的一部分。它的目的通常是为了更容易阅读代码并发现什么是什么。

      一个标识符:

      • 以“Q”为前缀,以“Private”为后缀,是用于实现细节的私有类,不是 API 的一部分(例如 QPainterPrivate)
      • 以“Q”为前缀,以“Private”为后缀是公共类(例如QWidget)
      • 前缀为“q”(小写)是一个公共全局函数(例如qRgb)

      采用一种编码风格并统一使用它可以让其他人更容易理解不是他们编写的代码。

      参考:Qt Coding Style

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-26
        • 2017-03-09
        • 1970-01-01
        • 1970-01-01
        • 2010-12-09
        • 2012-05-18
        • 1970-01-01
        相关资源
        最近更新 更多