我有代码重复的情况(或者是吗?)而且我不知道如何避免它,但仍然在我的代码中保持清晰。
让我大大简化过这种情况:
// let's say I have a interface Entity
interface Entity {
public Entity add (Entity operand);
}
// And two classes that implement this interface
class MyInteger implements Entity {
private int value;
public Entity add (Entity operand)
{
// here I have to manage the situation distinctly if operand is a MyInteger or MyString
}
}
class MyString implements Entity {
private String value;
public Entity add (Entity operand )
{
}
}
现在,我的问题是MyString中的方法添加与MyInteger中添加的方法相同。请记住,我有比这里提到的更多的类型,并且对于一些方法添加是不一样的。
此代码是否重复?如果是这样,有没有办法避免它?因为我似乎无法想到一个。
另外,在add方法中,如何在不使用if(instanceof)语句的情况下切换各种类型的操作数?
答案 0 :(得分:1)
查找模板模式。您可以重构并为任何重复的代码添加Abstract类。如果这是特定于两个类的,那么只需要这两个类扩展Abstract类。
为了避免instanceof
我不确定什么是最好的,但你可以链接一个特定于实体类的额外方法,然后在必要时调用超级/抽象类。
最后,研究仿制药提供的可能性。
答案 1 :(得分:1)
听起来您需要visitor或double-dispatch机制。
您的add(Entity operand)
方法必须根据传递的操作数决定做什么,因此您可以通过在操作数上调用 back 来实现此目的。 e.g。
// in MyInteger
public Entity add(Entity operand) {
operand.addInteger(this);
}
// in MyString
public Entity add(Entity operand) {
operand.addString(this);
}
请注意,上述实现会在所调用的类型上发生更改。通过重定向回操作数,您的调用路径由最初调用和所使用的操作数的实体确定。
每个实体都必须实施addInteger(MyInteger p)
,addString(MyString p)
等等。但是在这个阶段,您可以使用具体的类型,并且可以轻松地确定要做什么。
请注意,您不必使用instanceof
或类似内容。以上是类型安全和完整的。例如添加新的操作数类型将导致一组明显的重构。
答案 2 :(得分:1)
您可以使用抽象类并为其提供具体的add方法。
答案 3 :(得分:1)
到目前为止,我认为你的方法没有问题。
由于实体是一个实例,您可以通过以下方式解决代码重复问题:
简单地忽略它并进行复制,因为它会为您提供一个干净的解决方案。 如果您只有少数情况发生此类重复,则可能更好 以这种方式实现它。
如前所述,实现一个抽象类,例如AbstractEntity实现所有 方法一次作为受保护的成员方法,并将MyInteger和MyString声明为子类。
继续进行子类化,考虑哪个实体需要哪些方法 建立一个子类树。警告:如果您这样做会妨碍进一步的调整 不能做精心设计。
使用实用程序类:具有公共静态方法的类和私有构造函数 实现需要的功能。
如何找出实体的类型: