【问题标题】:Avoiding non symbolic constants in Qt避免 Qt 中的非符号常量
【发布时间】:2016-05-09 22:06:17
【问题描述】:

在我参与的代码审查中经常出现的一件事是代码中内联的“幻数”是一件坏事。

首选是在某处分配一个符号。

现在我正在使用的是 QT sdk。类成员 QButtonGroup.checkedId() 将返回 -1 作为一个幻数,表示所选组中没有单选按钮。

如果我写类似

if ( buttongroup->checkedId() == -1 )
{
   //yadda yadda
}

它将出现在代码审查中。

虽然我当然可以定义一个const static int 符号来给我-1,但如果它定义了相关的常量,我更愿意在Qt 命名空间中使用它。

这样的符号已经定义了吗??

【问题讨论】:

  • 我不知道它是否有帮助,但通常我使用“
  • imo, enum { INVALID_ID = -1 } 会比 const static int 解决方案更好。但有同样的缺点:无论你在哪里使用,你都必须在定义中包含文件。与零进行比较也是一个不错的选择。
  • 贵公司/组织对处理来自外部库的幻数有什么政策?请注意,Qt 中的许多类使用 -1 来表示“未定义”、“错误”等,因此 QButtonGroup 不是唯一的。
  • 我通常会在 .cpp 文件中添加一个匿名命名空间并在其中放置一个常量,但这纯粹是为了一个只能在该 .cpp 中使用而在其他任何地方都不会使用的值。如果您在其他地方使用 checkedId() 调用,您可能希望将其作为预定义常量移出到某个 Utility 标头?
  • 我通过选择使用isChecked() 来避免这个特殊问题,这将返回一个指向选中的(抽象)按钮的指针,或者为零。所以现在我可以比较零或NULL,这是一场完全不同的代码审查象征性的持续战争。 NULL 被载入内部编码标准,但 0 被载入标准,例如纯虚拟。但它已经出现在讨论中

标签: c++ qt


【解决方案1】:

代码审查是关于您的代码而不是第 3 方库的代码,因此您不能也不应该处理它。 Qt 没有任何命名实体可供比较,因此您必须将生成的代码与-1 进行比较。不过,它有一个好的一面:-1 是一个广为人知的幻数,所以不应该有任何误解——它被用于许多不同的语言和库中。不管它有多糟糕,它都在这里,我们必须忍受它。

【讨论】:

  • 虽然这个答案有更多细节,但@JonHarper 是第一个,所以我对此表示赞同,但将他的答案标记为正确,因为他首先回答正确。
  • @infixed:接受更好的答案不会伤害我的感受。他给出了更好的回应。我也投了赞成票。 ;-)
  • 速度也很重要 :) 我的意思是这并没有阻止我,但假设速度也很有价值
【解决方案2】:

没有预定义这样的符号;你必须自己定义它。

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 2019-08-30
    • 2010-09-07
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    相关资源
    最近更新 更多