是否值得插入`const`-正确性
Posted
技术标签:
【中文标题】是否值得插入`const`-正确性【英文标题】:Is it worth to insert `const`-correctness 【发布时间】:2011-09-29 09:33:08 【问题描述】:我目前面临一个由一些高级程序员编写的 C++ 项目,其中包含大约 400 个文件和 200 个类。
代码精心设计,运行良好且稳定。
虽然我正在添加一些功能,但对我来说,关注const
-正确性只是普通的做法。
但是,如果我开始声明我的新成员函数const
,那么为了使事情正常进行,调整旧代码是没有止境的。
const
-正确性
进入这段代码?
更糟糕的是,我必须触摸和更改旧的成熟代码并解释
给前辈们我在代码审查期间所做的事情。值得吗?
【问题讨论】:
相关twitter.com/#!/ID_AA_Carmack/status/119254000431415296 如果他们是资深人士而您不是,您应该在对旧代码进行大量更改之前咨询他们,并准备一个很好的案例说明您为什么需要这样做。 【参考方案1】:常量正确性是静态类型的一种附加层,旨在更容易开发成熟、可靠和健壮的代码。你说你已经有了后者。在这种情况下,从实用的角度来看,在此类代码库中强制执行 const 正确性似乎并没有显着的附加价值。
【讨论】:
它是静态类型的一个组成部分,而不是它上面的一层。 @Tomalak:它是 C++ 静态类型的一个组成部分,但还有其他没有 const 的静态类型语言。因此,它是对静态类型一般概念的补充。 @Steve:嗯,是的,我确实是指“C++ 的静态类型”。 :) 我必须同意 Tomalak 的观点......有些语言没有无符号类型,我无法想象有人声称符号不是静态类型的一部分。连续性是静态类型系统的一部分,就像符号是静态类型的一部分一样:在重要的语言中。【参考方案2】:我应该投入大量时间在此代码中引入
const
-correctness 吗?
如果您觉得可以在合理的时间内完成所有工作,当然可以。 const
-correctness 是一件好事,所以如果你可以调整代码库以正确使用它,那永远不会是坏事。
这一切都取决于您有多少可用时间以及您可以做些什么,这更多是关于项目管理,更适合programmers.SE。
更糟糕的是,我必须触摸和更改旧的成熟代码,并向前辈解释我在代码审查期间做了什么。值得吗?
这对他们(以及,通过扩展,对其他所有人)当然是值得的。听起来他们会在代码审查中学到很多东西,这太棒了!
编辑
正如 molbdnilo 正确指出的那样,这是一个很大的变化,您绝对应该在开始之前进行一次小组讨论。这比在两周内完成代码审查更合适。
【讨论】:
【参考方案3】:努力是值得的……除非你有更重要的事情要做。
【讨论】:
【参考方案4】:这是一个难题。改造 const 正确性是一项重要的工作 工作(正如你所注意到的)。如果代码是干净的并且 可维护的,它可能不应该掉以轻心。在另一 手,在某些情况下,const 正确性几乎是必不可少的——或者会 是,如果所有编译器都强制执行关于不初始化 使用临时引用非常量。
如果您不是代码的唯一所有者,那么要做的就是 与其他相关人员讨论问题,共同决定 是否重要,并计划必要的时间来做它,如果它 被认为很重要。你不应该做的只是开始介绍它 你自己,作为你被授权做的改变的“副作用”。 这是一个项目级别的决定。
【讨论】:
【参考方案5】:是的,是的。 const 正确性是一件好事,原因有很多,其中它有助于防止错误。实际上,我在与您类似的情况下应用 const 正确性时已经发现了错误。
【讨论】:
+1 因为我在添加 const 正确性时发现错误的情况相同。它迫使你重新思考,这绝不是一件坏事。【参考方案6】:是的。一旦您克服了将当前代码转换为 const 正确的障碍,它就会成为第二天性。
此外,如果您开始遵循 MISRA 之类的规范,则它要求您的代码是 const 正确的(以及许多其他内容)。
【讨论】:
【参考方案7】:强制 const 正确性有两个技术步骤。
不过,在开始之前,您需要让您的团队成员参与进来,并解释const
-正确性的好处。如果你不能说服你的队友,那真的不值得投入这个……
现在,由于我们使用的是 ***,而不是 SE,我宁愿专注于技术方法。
这两个步骤源于以下事实:
您不能在const
对象上调用非const
函数
您可以在非`const 对象上调用const
函数
因此:
-
标记为
const
的函数
const
-ify 变量/参数/属性
第一步是非侵入性的,并且已经产生了自己的好处,因为它可以防止在标记方法中意外修改类的内部属性。
即使您在团队中遇到轻微阻力,您仍然可以将您开发或接触的方法标记为const
,而不会对团队其他成员造成任何阻碍。
【讨论】:
这是迄今为止最好的建议!不是过度侵入,不是一项艰巨的任务,易于证明和低风险。我非常怀疑在成熟的代码库中引入全面的代码正确性能否成为第一或第二优先级,因此 OP 时间肯定会有更好的用途。以上是关于是否值得插入`const`-正确性的主要内容,如果未能解决你的问题,请参考以下文章
const 正确性: const char const * const GetName const (//stuff);