繁体   English   中英

Java重构代码的味道

[英]Java refactoring code smells

得到的反馈是,我需要提高重构/消除代码气味的技能。

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

  2. 例:

     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; } } 

然后是最佳/最便捷的解决方案。 顺便说一句,您可以立即向我展示该重复的最佳解决方案,/ \\也许使用运算符lambda“->”

谢谢!

您可以尝试两种方法合并为一个。 因为他们两个看起来像

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接口的实现,在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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM