我经常在编码时遇到这个问题。
以下哪个例子是更好的做法?我知道其他因素会影响一个或另一个是否更好。但总的来说,一个优于另一个的优点是什么。
if(object.getA().Value != null) {
return object.getA().Value;
}
return null;
Vs以上。
string x = string.null;
x = object.getA().Value;
return (x != null) ? x : null;
这是另一个类似的例子:
var a = object.method(x).Value;
var b = object.method(x).Key;
Vs以上。
var y = object,method(x);
var a = y.Value;
var b = y.Key;
换句话说,我的问题是:
两次调用方法并减少一个变量是否更好? 要么 将它保存到变量并调用该方法两次更好吗?
当然,如果该方法导致大量处理,那么调用它可能是明智的,但对于一般情况下,方法不是太苛刻且变量的空间不是太大,哪一个更好,为什么?或者哪一个是其中一个的好处?
它们之间的差异可能没有太大的区别,但我正在努力寻找更好的实践,并希望听到一些有经验的程序员的意见。
非常感谢
答案 0 :(得分:2)
在变量中缓存值是一个基本优化(与memoizing相关)。
当真正需要时,如果对函数的第二次调用在堆栈中占很大比例的话。
例如,如果第二次调用是在堆栈的10%或20%的时间,那么这是通过缓存第一个结果可以节省多少总时间。
You can keep doing things like that, until the code is as fast as possible.
如果我能举个例子,很久以前我就开发了一个代码如下的应用程序:
if (!Done()){
do some stuff
}
....
if (!Done()){
do some other stuff
}
由于Done()
是一个如此简短,干净且简单的调用函数,因此它被调用了很多。
不要紧,它做了很多工作,包括从数据库中查询大量的东西并把大部分东西扔掉。
Stackshots立即发现问题。
答案 1 :(得分:1)
这取决于你是否想要线程安全,以及函数是否可以在不同的调用之间改变。
e.g。与
if(object.getA().Value != null) {
return object.getA().Value;
}
return null;
如果属性getter Value
的实现在第二次调用时返回null,则会有不同的答案。它可以通过实现该方法在第二次调用时返回null,或者如果另一个线程在if和return语句之间使用了更新,该更新使得属性的结果为null。
此测试实际上是多余的,因为如果它为null,则返回null。我猜你的意思是if (object.getA() != null)
。然后前一段仍然适用于getA()而不是Value,但如果getA()在第二次调用时返回null,则if body将抛出空引用异常。
所以关注你是否担心调用之间的价值变化。
答案 2 :(得分:1)
一般规则:避免额外的变量(不必要地引入状态)。 (如果两次调用函数会破坏规则会增加太多开销)