变量保存的最佳实践

时间:2017-07-18 09:25:47

标签: java

有两个代码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可以使远程调试变得容易。

1 个答案:

答案 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);

通常,更喜欢内联版本,直到您看到该行过长且复杂。然后提取局部变量(或提取方法)使其更整洁。如果存储一个值以避免重复昂贵的计算是有意义的,那么就这样做。