如何在没有工具的情况下删除 类 之间的重复代码?
How can I remove duplicated code between classes without implements?
我写了很多函数的实现来计算给定位置的斐波那契数。
Fibonacci Class:这个 class 帮助我测试每个实现而无需重写相同的测试代码。我不想在这里添加“fibonacci(n - 2).add(fibonacci(n - 1));
”,因为某些实现不使用它(命令式迭代,函数式迭代)。
public interface Fibonacci {
BigInteger fibonacci(int n);
}
递归斐波那契Class
public class SimpleRecursiveFibonacci implements Fibonacci{
public BigInteger fibonacci(int n) {
if(n < 2) {
return BigInteger.ONE;
}
return fibonacci(n - 2).add(fibonacci(n - 1));
}
}
和 MemorizedRecursiveFibonacci Class
public class MemoizedRecursiveFibonacci implements Fibonacci{
private Map<Integer, BigInteger> cache = new HashMap<>();
public BigInteger fibonacci(int n) {
if(n < 2) {
return BigInteger.ONE;
}
if(!cache.containsKey(n)){
BigInteger currentFibonacci = fibonacci(n - 2).add(fibonacci(n - 1));
cache.put(n, currentFibonacci);
}
return cache.get(n);
}
}
据我所知,MemorizedRecursiveFibonacci 中有一些重复的代码 Class
if(n < 2) {
return BigInteger.ONE;
和
BigInteger currentFibonacci = fibonacci(n - 2).add(fibonacci(n - 1));
如何保持干爽?删除重复的代码?
MemorizedRecursiveFibonacci
可以委托给 RecursiveFibonacci
实例:
public class MemoizedRecursiveFibonacci implements Fibonacci {
SimpleRecursiveFibonacci simple = new SimpleRecursiveFibonacci();
private Map<Integer, BigInteger> cache = new HashMap<>();
public BigInteger fibonacci(int n) {
if(!cache.containsKey(n)) {
BigInteger currentFibonacci = simple.fibonacci(n);
cache.put(n, currentFibonacci);
}
return cache.get(n);
}
}
或者,更优雅地,使用 Java 8 的 Map#computeIfAbsent
:
public class MemoizedRecursiveFibonacci implements Fibonacci {
SimpleRecursiveFibonacci simple = new SimpleRecursiveFibonacci();
private Map<Integer, BigInteger> cache = new HashMap<>();
public BigInteger fibonacci(int n) {
return cache.computeIfAbsent(n, k -> simple.fibonacci(k));
}
抽象公共 parent 怎么样?
像这样:
public abstract class ParentFibonacci implements Fibonacci {
protected BigInteger getFirstValues(int n) {
if (n < 2) {
return BigInteger.ONE;
}
return BigInteger.ZERO;
}
}
这样你的斐波那契实现需要实现 Fibonacci.fibonacci(int n) 并且可以使用 parent 方法。
public class SimpleRecursiveFibonacci extends ParentFibonacci {
public BigInteger fibonacci(int n) {
if (n < 2) {
return getFirstValues();
}
return fibonacci(n - 2).add(fibonacci(n - 1));
}
}
我写了很多函数的实现来计算给定位置的斐波那契数。
Fibonacci Class:这个 class 帮助我测试每个实现而无需重写相同的测试代码。我不想在这里添加“fibonacci(n - 2).add(fibonacci(n - 1));
”,因为某些实现不使用它(命令式迭代,函数式迭代)。
public interface Fibonacci {
BigInteger fibonacci(int n);
}
递归斐波那契Class
public class SimpleRecursiveFibonacci implements Fibonacci{
public BigInteger fibonacci(int n) {
if(n < 2) {
return BigInteger.ONE;
}
return fibonacci(n - 2).add(fibonacci(n - 1));
}
}
和 MemorizedRecursiveFibonacci Class
public class MemoizedRecursiveFibonacci implements Fibonacci{
private Map<Integer, BigInteger> cache = new HashMap<>();
public BigInteger fibonacci(int n) {
if(n < 2) {
return BigInteger.ONE;
}
if(!cache.containsKey(n)){
BigInteger currentFibonacci = fibonacci(n - 2).add(fibonacci(n - 1));
cache.put(n, currentFibonacci);
}
return cache.get(n);
}
}
据我所知,MemorizedRecursiveFibonacci 中有一些重复的代码 Class
if(n < 2) {
return BigInteger.ONE;
和
BigInteger currentFibonacci = fibonacci(n - 2).add(fibonacci(n - 1));
如何保持干爽?删除重复的代码?
MemorizedRecursiveFibonacci
可以委托给 RecursiveFibonacci
实例:
public class MemoizedRecursiveFibonacci implements Fibonacci {
SimpleRecursiveFibonacci simple = new SimpleRecursiveFibonacci();
private Map<Integer, BigInteger> cache = new HashMap<>();
public BigInteger fibonacci(int n) {
if(!cache.containsKey(n)) {
BigInteger currentFibonacci = simple.fibonacci(n);
cache.put(n, currentFibonacci);
}
return cache.get(n);
}
}
或者,更优雅地,使用 Java 8 的 Map#computeIfAbsent
:
public class MemoizedRecursiveFibonacci implements Fibonacci {
SimpleRecursiveFibonacci simple = new SimpleRecursiveFibonacci();
private Map<Integer, BigInteger> cache = new HashMap<>();
public BigInteger fibonacci(int n) {
return cache.computeIfAbsent(n, k -> simple.fibonacci(k));
}
抽象公共 parent 怎么样? 像这样:
public abstract class ParentFibonacci implements Fibonacci {
protected BigInteger getFirstValues(int n) {
if (n < 2) {
return BigInteger.ONE;
}
return BigInteger.ZERO;
}
}
这样你的斐波那契实现需要实现 Fibonacci.fibonacci(int n) 并且可以使用 parent 方法。
public class SimpleRecursiveFibonacci extends ParentFibonacci {
public BigInteger fibonacci(int n) {
if (n < 2) {
return getFirstValues();
}
return fibonacci(n - 2).add(fibonacci(n - 1));
}
}