2016-12-01 42 views
0

我有一个简单的方法,我已经应用了两个重构模式 - 内联temp和提取方法,然后用Query替换Temp。我想知道哪种模式更适合用于我们的方法。所以,这是原始的方法:在java中比较重构模式

public int mymethod(int a, int b) { 
    int t = a * b; 
    if (t > 100) { 
     return t * 0.65; 
    } else { 
     return t * 0.45; 
    } 
} 

这是内嵌温度重构的方法:

public int mymethod(int a, int b) { 

     if (a*b > 100) 
     { 
      return (a*b * 0.65); 
     } 
     else 
     { 
      return (a*b * 0.45); 
     } 
    } 

最后提取方法,接着是查询重构

public int mymethod(int a, int b) { 
    if (t() > 100) { 
    return t() * 0.65; 
    } 
    else { 
    return t() * 0.45; 
    } 
} 
int t() { 
    return a * b; 
} 

你认为哪一个更适合我们的方法?就我个人而言,我认为内联temp对于这种方法来说更好,因为Extract方法有一个新的方法,程序被迫查询那个影响性能的额外方法。我对吗 ?

+1

如何修复编译错误? –

+0

编译器可能会将第一个版本优化为第二个版本。至于第三个版本,如果你需要在很多地方计算这个产品,从代码的角度来看可能是有用的。 –

+0

在大多数情况下,可读性比最佳速度更重要 –

回答

2

这种重构没有意义。

请注意,在您的原始示例中,您计算​​变量t的值一次。这比你在每个“重构”例子中做的三次要好得多。此外,请注意,在第二个重构版本中,您不会将ab传递给您的t方法,并且在原始mymethod中加上返回类型是错误的。

我会建议看看其他的东西。考虑:

  1. 提取常量。
  2. 给予有意义的名字。
  3. 返回一次。

如果你申请你的那些方法可能改变这样的建议:

private static final int THRESHOLD = 100; 
private static final double MAX_MEANINGFUL_NAME_CONSTANT = 0.65; 
private static final double MIN_MEANINGFUL_NAME_CONSTANT = 0.45; 

public double myMethod(int a, int b) { 
    int multiplication = a * b; 
    double result; 
    if (multiplication > THRESHOLD) { 
     result = multiplication * MAX_MEANINGFUL_NAME_CONSTANT; 
    } else { 
     result = multiplication * MIN_MEANINGFUL_NAME_CONSTANT; 
    } 
    return result; 
} 

可读性它看起来更好。并且可读性相当于重要