我将从我在互联网上找到的应用程序的代码剪辑开始。它是用C ++编写的,但主题可以解决任何编程语言:
search.salesrep
在分配之前,您真的需要检查当前值是否与新值不同? 它只是一种编程风格,效率,良好的方式,还是什么?
一般来说,在类的set方法中,您是否需要检查新值是否与当前值不同?
答案 0 :(得分:3)
在分配之前,您真的需要检查当前值是否与新值不同?它只是一种编程风格,效率,良好的方式,还是什么?
对我来说看起来像cruft。
当你在编写代码时混合两个想法时,你通常会得到这样的代码(“我们只在必要时更新状态”而不是“setter只设置值”),示例代码最终没有表达或者想法清楚。
我不能说 - 我必须阅读你从中获取代码的文章。
一般来说,在类的set方法中,您是否需要检查新值是否与当前值不同?
当您进行优化时,或者您需要在代码中表达的想法是“在必要时执行更新”时,您可以这样做。
考虑这个(人为的和有效的)代码:
/// object in 2D space
class TwoDObject
{
/// shift object position
void shift_position(int x, int y)
{
if(x != x_ || y != y_)
{
x_ = x;
y_ = y;
render_shadows();
}
}
private:
// render the shadows cast by this object (slow implementation)
void render_shadows();
int x_;
int y_;
};
在这种情况下,您有内部状态更新,然后是副作用(更改位置时阴影已更改)。
因为渲染阴影的方法很慢,所以你只想在必要时调用它。
答案 1 :(得分:2)
这在很大程度上取决于所分配成员的类型。如果它是原始类型或同样轻量级的东西,那么检查很可能是一种悲观:分配可能比条件跳转便宜得多。请记住,基本上所有现代处理器都是基于流水线的,如果分支预测失败,条件跳转可能导致流水线需要中止。这会影响效率。
如果分配的类型成本高得多,答案就不那么明确了。例如,复制大型数据缓冲区是一项昂贵的操作。但是,所以比较它是否相等。要调用是否盲目分配或首先进行比较,您需要了解相关类型的特性,并评估相同值分配的频率。可能会发生,他们识别的速度有多快,以及这种识别与“盲目”复制相比的代价是多少。另外请记住,如果比较表明它们的值不同,您将同时支付:比较,然后复制。
最后,有些情况需要进行检查:当作业有副作用时。例如,如果成员的类型是每次分配时都会发出通知,那么您很可能需要进行比较以避免虚假通知(当然,假设您不需要这些通知)。
总而言之,没有严格的规则,但我会说平均来说,如果你有充分的理由,你应该只包括比较。
答案 2 :(得分:0)
这实际上取决于你的设置,我的意思,如果你要设置会传播变化的东西,这一点很重要。如果在这种情况下,该更改的成本非常大(重新排序整个数组,在某个网络位置更新数据,重写大文件),并且如果程序需要实时性能,则检查不必要的更改是一个好习惯。如果改变没有副作用,那么只需改变它并避免额外的分支。