条件三元与方法调用 db
Conditional ternary with method call to db
所以过去几年我一直潜伏在这里,终于到了我在这里找不到现有答案的情况。不过问题本身很简单。
假设以下语句(无语言特定语法):
var result = fetchFromDb() == null ? defaultValue : fetchFromDb().property;
我想知道的是:Java 或 C# 中的编译器是否有优化此语句的方法,或者是否真的有两次调用 fetchFromDb()
方法意味着两次数据库访问调用, 两个执行计划等等?
我已经在 Java 中对此进行了测试,发现该方法被调用了两次,但我对后台的最终缓存或类似的事情一无所知。
所以:使用三元条件 with 方法是一种不好的做法吗?有没有办法缓存与内联比较的值,以保持这种风格的美感?
是的,永远是两个电话。事实上,在第一次调用和第二次调用之间,fetchFromDb()
的结果可能会发生变化。编译器无法预测值的变化,除非它是众所周知的确定性 function
。确定性是这里的关键词。即使那样,也可能没有针对此类事情的编译器优化。
在方法中使用三元条件本身并不是坏习惯,但它的可读性不如简单的 if 语句。
保证单个调用的唯一方法是对单个调用进行编码。
var result;
var fetchResult = fetchFromDb();
if (fetchResult == null) {
result = defaultValue;
} else {
result = result.property;
}
或者如果你坚持使用三元
var fetchResult = fetchFromDb()
var result = (fetchResult == null) ? defaultValue : result.property;
我真的觉得这比三元更清楚。将代码放在一行并不能推断出漂亮的代码。
其实
var result = fetchFromDb() == null ? defaultValue : fetchFromDb().property;
将在 else
情况下进行两次调用。为了避免重复调用:
var fetch = fetchFromDb();
var result = fetch != null ? fetch.property : defaultValue;
所以过去几年我一直潜伏在这里,终于到了我在这里找不到现有答案的情况。不过问题本身很简单。
假设以下语句(无语言特定语法):
var result = fetchFromDb() == null ? defaultValue : fetchFromDb().property;
我想知道的是:Java 或 C# 中的编译器是否有优化此语句的方法,或者是否真的有两次调用 fetchFromDb()
方法意味着两次数据库访问调用, 两个执行计划等等?
我已经在 Java 中对此进行了测试,发现该方法被调用了两次,但我对后台的最终缓存或类似的事情一无所知。
所以:使用三元条件 with 方法是一种不好的做法吗?有没有办法缓存与内联比较的值,以保持这种风格的美感?
是的,永远是两个电话。事实上,在第一次调用和第二次调用之间,fetchFromDb()
的结果可能会发生变化。编译器无法预测值的变化,除非它是众所周知的确定性 function
。确定性是这里的关键词。即使那样,也可能没有针对此类事情的编译器优化。
在方法中使用三元条件本身并不是坏习惯,但它的可读性不如简单的 if 语句。
保证单个调用的唯一方法是对单个调用进行编码。
var result;
var fetchResult = fetchFromDb();
if (fetchResult == null) {
result = defaultValue;
} else {
result = result.property;
}
或者如果你坚持使用三元
var fetchResult = fetchFromDb()
var result = (fetchResult == null) ? defaultValue : result.property;
我真的觉得这比三元更清楚。将代码放在一行并不能推断出漂亮的代码。
其实
var result = fetchFromDb() == null ? defaultValue : fetchFromDb().property;
将在 else
情况下进行两次调用。为了避免重复调用:
var fetch = fetchFromDb();
var result = fetch != null ? fetch.property : defaultValue;