Java 重构代码的味道
Java refactoring code smells
我收到反馈说我需要提高 refactoring/eleminating 代码嗅觉技巧。
我需要一些简短的练习来检测和改进最常见的代码异味
在java
中有答案
示例:
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;
}
}
然后是 best/most 方便的解决方案。
顺便说一句,你可以马上告诉我这个重复的最佳解决方案 /\ 也许使用 operator lambda "->"
谢谢!
您可以尝试合并这两种方法。因为他们俩长得像
public long sum(long min, long max) {
long result = 0;
for (int i = min ; i <= max ; i++)
result += someOperation(i);
return result;
}
您可以允许用户提供一些计算 i
的操作,因此它可以是 i
或 i+2
或 i*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
是实现功能接口 LongUnaryOperator
的 lambda 表达式,并提供将在我们的代码中使用的抽象方法 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();
}
我收到反馈说我需要提高 refactoring/eleminating 代码嗅觉技巧。
我需要一些简短的练习来检测和改进最常见的代码异味 在java
中有答案
示例:
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; } }
然后是 best/most 方便的解决方案。 顺便说一句,你可以马上告诉我这个重复的最佳解决方案 /\ 也许使用 operator lambda "->"
谢谢!
您可以尝试合并这两种方法。因为他们俩长得像
public long sum(long min, long max) {
long result = 0;
for (int i = min ; i <= max ; i++)
result += someOperation(i);
return result;
}
您可以允许用户提供一些计算 i
的操作,因此它可以是 i
或 i+2
或 i*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
是实现功能接口 LongUnaryOperator
的 lambda 表达式,并提供将在我们的代码中使用的抽象方法 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();
}