有两个代码1:
if(isApplicable() || isGood()) {
//something
}
private boolean isApplicable() {
}
private boolean isGood() {
}
代码2:
boolean applicable = isApplicable();
boolean good = isGood();
if(applicable || good) {
//something
}
private boolean isApplicable() {
}
private boolean isGood() {
}
哪种方法是优秀的java练习? 对我来说,code1接缝更干净,代码2接缝有额外的代码。 code2可以使远程调试变得容易。
答案 0 :(得分:1)
为了概括你的问题,你要问的是两种形式:
// local variable form
Foo foo = methodReturningFoo();
Bar bar = methodTakingFoo(foo);
// inlined form
Bar bar = methodTakingFoo(methodReturningFoo());
大多数现代IDE都有一个快捷方式,可以在击键时重构这些内容:“inline”和“extract local variable”。两种重构都存在的事实表明两种情况都适用于不同的情况。
将内联到单个语句会使代码更紧凑,有时更具可读性。您可以查看正在发生的所有事情,而无需阅读以找出变量的设置位置。
这是一个很好的内联候选人:
String name = customer.getName();
String greeting = createGreeting(name);
// ... becomes ...
String greeting = createGreeting(customer.getName());
提取局部变量可将长语句转换为两个(或更多)较短的语句。它也可能允许您重复使用值而不是计算两次。
这是一个例子,我们只是将一个语句分成更小的块。
String greeting = createGreeting(greetingFactory.get(customer.getTitle()), customer.getName());
// ... becomes ...
Title title = customer.getTitle();
String name = customer.getName();
String greeting = createGreeting(greetingFactory.get(title), name));
...这是我们重用计算值的例子。
// doing the work twice
CustomerCategory category = findCategory(totalOrderValues(
customer.getOrders(currentMonth)));
List<Promotion> eligiblePromotions = findEligiblePromotions(totalOrderValues(
customer.getOrders(currentMonth)));
// ... becomes ...
BigInteger totalOrderValues = totalOrderValues(
customer.getOrders(currentMonth))
CustomerCategory category = findCategory(totalOrderValues);
List<Promotion> eligiblePromotions = findEligiblePromotions(totalOrderValues);
通常,更喜欢内联版本,直到您看到该行过长且复杂。然后提取局部变量(或提取方法)使其更整洁。如果存储一个值以避免重复昂贵的计算是有意义的,那么就这样做。