避免代码重复的良好做法 Java
Good practice to avoid code duplication Java
我有一个规范接口让我们称之为 Spec 和实现它的两个 类 让我们称之为 ImpA 和 ImpB。它工作得很好,直到我意识到 ImpA 和 impB 中很少有方法共享相同的实现。
我试图通过在 Spec 中声明默认方法并在其中正确实施它们来避免它,但我确信有更好的方法来做到这一点。
也许一些设计模式?
您可以将 Spec 设为超类,将 ImpA 和 ImpB 设为子类。您可以找到更多信息 on the JavaDoc
如果复制的代码不使用 class(实例变量)的状态,将代码放在接口的默认方法中是一种解决方案。
对于需要访问 class 实例变量的更复杂的情况,您可以使用公共代码创建一个额外的抽象 class。然后 ImpA
和 ImpB
将扩展摘要 class.
Java 中的集合使用了两者。例如,ArrayList
和 LinkedList
扩展了 AbstractList
,后者实现了 List
,其中包含一些默认方法。
虽然您可以按照您的建议制作它们 default
方法,但另一种可能的解决方案是使用 Delegation 设计模式。这意味着有第四个 class 完全是为了分离公共逻辑。如果该逻辑需要值来操作,那么它们应该被注入到委托中以允许它独立操作(并被测试)。
就个人而言,我发现更喜欢委托而不是组合的代码更优雅、更可测试并且更多 'refactorable'。但是,像许多其他设计问题一样,对此有许多不同且有效的意见。
interface Spec {
void method();
}
class Imp1 implements Spec {
private final Delegate delegate;
public Imp1() {
this.delegate = new Delegate(...);
}
public void method() {
delegate.setContext(...);
delegate.method();
}
}
我有一个规范接口让我们称之为 Spec 和实现它的两个 类 让我们称之为 ImpA 和 ImpB。它工作得很好,直到我意识到 ImpA 和 impB 中很少有方法共享相同的实现。 我试图通过在 Spec 中声明默认方法并在其中正确实施它们来避免它,但我确信有更好的方法来做到这一点。 也许一些设计模式?
您可以将 Spec 设为超类,将 ImpA 和 ImpB 设为子类。您可以找到更多信息 on the JavaDoc
如果复制的代码不使用 class(实例变量)的状态,将代码放在接口的默认方法中是一种解决方案。
对于需要访问 class 实例变量的更复杂的情况,您可以使用公共代码创建一个额外的抽象 class。然后 ImpA
和 ImpB
将扩展摘要 class.
Java 中的集合使用了两者。例如,ArrayList
和 LinkedList
扩展了 AbstractList
,后者实现了 List
,其中包含一些默认方法。
虽然您可以按照您的建议制作它们 default
方法,但另一种可能的解决方案是使用 Delegation 设计模式。这意味着有第四个 class 完全是为了分离公共逻辑。如果该逻辑需要值来操作,那么它们应该被注入到委托中以允许它独立操作(并被测试)。
就个人而言,我发现更喜欢委托而不是组合的代码更优雅、更可测试并且更多 'refactorable'。但是,像许多其他设计问题一样,对此有许多不同且有效的意见。
interface Spec {
void method();
}
class Imp1 implements Spec {
private final Delegate delegate;
public Imp1() {
this.delegate = new Delegate(...);
}
public void method() {
delegate.setContext(...);
delegate.method();
}
}