【发布时间】:2017-09-21 00:02:16
【问题描述】:
以下基本代码是一个相当大的过程的一部分:
int x = foo();
if (x == 0) x = bar();
x 没有在其他任何地方修改,所以我可以这样做:
const int x = foo() == 0 ? bar() : foo();
但是foo() 是一个非常昂贵且复杂的函数,因此我不能调用它两次,因为它可能会产生竞争条件并因此获得不同的值(它可能涉及读取外部资源)。
我想让代码尽可能可读,并且尽可能简短。一种选择是:
const int foo_ = foo(), x = foo_ == 0 ? bar() : foo_;
另一方面,我想避免这种时间变量,主要是因为foo() 可能依赖于外部资源,所以在其余代码中使用foo_ 作为缓存值是无效的。
我正在发布我现在正在使用的解决方案,但我想知道是否有更好的选择(没有或很少有代码混乱,同一范围内没有时间变量,可读性......)。提前致谢!
PS:它必须至少遵循 C++11 标准,因为它属于跨平台项目。
我知道这可能是基于意见的,但鉴于前面关于简单性(不是混乱代码)和避免时间变量(不是为了可读性而是为了代码安全)的陈述,我想知道解决这个问题的选项。
【问题讨论】:
-
三元运算符在您编写时可能看起来更好,但是当您在一个月后回到代码时,它们是一个难以破译的噩梦,尤其是如果您不是自己编写的。短代码的可读性并不总是很好,添加 cmets 可能是为了
-
请解释为什么您认为“临时”变量会阻碍“代码安全”,尤其是比聪明、难以理解的“技巧”更严重?
-
我同意时间变量更容易理解,我只是想避免由于此类变量的存在而使用无效状态的机会(缓存
foo()的返回值)。这就是我问这个问题的原因,是否有机会兼得两全:可读性和安全性? -
如果您的程序“相当大”,您可能应该首先专注于将其拆分为更小的程序(如果您的目标是可维护性......)
-
@chtz 当然,这也是我们现在的目标之一!
标签: c++ c++11 initialization constants