Java重构代码闻起来

时间:2015-05-19 10:40:00

标签: java coding-style refactoring

我得到了反馈,我需要改进我的重构/消除代码气味技巧。

  1. 我需要简短的练习来检测和如何改善最常见的代码气味 在

  2. 答案
  3. 示例:

    public class Calculator {
    
        public long sum(int min, int max) {
            long result = 0;
            for (int i = min ; i <= max ; i++)
                result += i;
            return result;
        }
    
        public long sumOfSquares(int min, int max) {
            long result = 0;
            for (int i = min ; i <= max ; i++)
                result += i * i;
            return result;
        }
    
    }
    
  4. 然后是最好/最有说服力的解决方案。 顺便说一句,你可以马上给我看这个重复的最佳解决方案/ \或者使用运算符lambda“ - &gt;”

    谢谢!

1 个答案:

答案 0 :(得分:2)

您可以在一个方法中尝试合并这两种方法。因为它们都看起来像

public long sum(long min, long max) {
    long result = 0;
    for (int i = min ; i <= max ; i++)
        result += someOperation(i);
    return result;
}

您可以允许用户提供一些计算i的操作,因此可以是ii+2i*i

此类策略可以是LongUnaryOperator接口的实现,其中用户需要实现long applyAsLong(long operand)方法。

因此,您可以使用两种方法来代替

public static long sum(long min, long max, LongUnaryOperator mapper) {
    long result = 0;
    for (long i = min ; i <= max ; i++)
        result += mapper.applyAsLong(i);
    return result;
}

你可以像

一样使用它
sum(1, 4, i -> i * i)//sum of squares

i->i*i是lambda表达式,它实现了函数接口LongUnaryOperator,并提供了将在我们的代码中使用的抽象applyAsLong方法的实现。换句话说,它会将i映射到i*i

更多用法示例:

sum(1, 4, i -> 2 * i)//sum of doubled values
sum(1, 4, i -> i)//sum of original values
//i->i can be also returned with `LongUnaryOperator.identity()`
//so you can rewrite your code into something like 
sum(1, 4, LongUnaryOperator.identity())

您还可以使用

等流程重写代码
public static long sum(long min, long max, LongUnaryOperator mapper) {
    return LongStream.rangeClosed(min, max).map(mapper).sum();
}