Java 重构和避免代码重复
我遇到了一个新问题。基本上,其他人已经编写了a级。重要部分如下所示Java 重构和避免代码重复,java,refactoring,code-duplication,Java,Refactoring,Code Duplication,我遇到了一个新问题。基本上,其他人已经编写了a级。重要部分如下所示 class A{ // some instance variables public A(){ // Calls methods build(); // Calls more methods } private build(){ item = makeItem(); anotherItem = makeAnotherItem(); // more code } private make
class A{
// some instance variables
public A(){
// Calls methods
build();
// Calls more methods
}
private build(){
item = makeItem();
anotherItem = makeAnotherItem();
// more code
}
private makeItem(){
// Does some things and calls updateItem()
}
private updateItem(){
// Does some things with instance variables of class A
// and calls yet another method in class A.
}
我的问题是build()完全满足我的需要,但我需要在另一个类中使用它。下面是问题:
我猜这个问题实际上有一个名称,但我不知道它叫什么,因此只搜索了一些基本术语。要在类B中使用build(),我可以做些什么?总是分小步进行重构。e、 g.把属于同一类的东西放在一起,可能需要另一个C类,它包含makeItem、makeAnotherItem和相应的实例变量。没有一般的答案,这取决于您的代码到底是什么样子的您在两个类中使用构建方法的代码,但继承没有用吗?然后您可以使用组合重用构建方法的代码。(提示)创建一个新的类C,其中包含build方法。类别C由类别A和类别B通过合成使用。它们委托给类C的build方法 请参阅Martin Fowler的重构方法 也看到
首先如果类A中的build()使用的是类A的其他私有方法,那么闻起来您需要类A本身 一个选项是创建包含常用方法(包括build方法)的抽象类,并通过类A和类B扩展这个抽象类。这样您就不会有重复的代码 如果出于某种原因,您不想接触A类,我建议您创建一个如下界面:
public interface Builder{
void build()
}
然后通过类B实现这个接口,并扩展类A,以便实现构建方法
public class B extends A implements Builder{
// build() of class A will be used
// do other staff
}
在这样做的过程中,类A完全没有变化(如果它是遗留代码或其他东西,这可能是需要的)+Builder可以用作您想要公开的API中的类型 将其
公开
,删除不必要的方法,创建A
的实例并使用build()
。或者,如果状态不重要,则将其设置为一个静态
类,并直接使用build()
。第一种方法:在单独的抽象类AbstractA中提取公共代码,使a和B扩展AbstractA。第二种方法:在具体的C类中提取公共代码,并在a和B中使用C作为代理。可能还有其他解决方案,但如果没有具体的代码,就不可能提供更多帮助。“a类比我写的东西做得多得多”-在下兔子洞之前确保这是有意义的。除此之外,您可能会看到一个Builder
模式。将代码减少到只剩下要“复制”的代码的程度。将此设置为类,现在您可以创建另一个类并使其扩展a
,您可以在此处包含新函数。请添加更多信息。到目前为止给出的大多数答案在许多情况下都是有意义的,但也可能是误导性的。只要我们没有更多关于A和B之间关系的信息,我们只能推测。