gpt4 book ai didi

java - 委托(delegate)对象产生重复代码 : (inheritance vs delegates)

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:11:57 25 4
gpt4 key购买 nike

在 OOP Java 世界中,我遇到了一种情况,在找出构建代码以实现“测试能力”的理想方式时,这让我很困惑。我所做的研究大多指向委托(delegate),这是一个很酷、很直接的 pattern ,但是,我相信它会导致大量重复代码。

总而言之,我有一个包含一些冗长方法的类。我有第二个类,它“扩展”了前面提到的冗长类并覆盖了一些上述方法。第二个类在覆盖原始方法的同时调用 super 方法(因此第一个类对于减少代码是完全必要的)。

例子:精简的父级:

public class ParentClass {

public void methodX(final int source, final int target) {
++++
++++
++++
}
}

脱光衣服的 child :

public class ChildClass extends ParentClass {

@Override
public void methodX(final int source, final int target) {
super.methodX(source, target)
****
****
**** // extra logic
}
}

我的想法和问题:

为 ChildClass(扩展并覆盖其父方法的类)编写测试类非常困难,因为我们调用了一个 super 方法! super 方法对于避免重复测试代码非常关键,即测试 ParentClass 的代码必须在 ChildClass 中使用。我可以使用 Mockito 手动模拟很多这些内部方法,但这绝对是一种糟糕的做法。

我的问题:

这是使用 super 方法或像这样扩展类的公平方法吗(应避免子类——组合 > 继承)?是不是每次测试子类都要测试ParentClass?应该使用什么设计模式来适本地重构代码来避免这种情况?

最佳答案

我觉得你的输入有各种“味道”:

  • 您从违反 Java 编码约定开始。类名以大写字母开头;但这只是旁注。
  • 我看到的第一个真正的问题:methodX() 的多个实现;并将对 super 实现的调用作为子类覆盖中的必要部分。这在您的类之间引入了非常紧密的耦合。

我会从这一点开始 - 并考虑摆脱它;但以防万一你不能或不想;那么绝对有必要不要“ mock ”那个 super 电话。你想确保你的子类测试确实运行了它们所依赖的代码。

恰恰相反:如果你发现没有那些模拟技巧你就无法合理地测试你的子类;那么这就是另一个迹象,表明您的代码库中存在某些问题。

关于java - 委托(delegate)对象产生重复代码 : (inheritance vs delegates),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43260372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com