[英]Code duplication (or not) - JAVA
我有一個代碼重復的情況(或者是嗎?),我不知道如何避免它,但仍然保持我的代碼清晰。
讓我大大簡化一下情況:
// 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)語句的情況下切換各種類型的操作數?
查找模板模式。 您可以重構並為任何重復的代碼添加Abstract類。 如果這是特定於兩個類的,那么您可以只使用這兩個類來擴展Abstract類。
為了避免instanceof
我不確定什么是最好的,但你可以鏈接一個特定於實體類的額外方法,然后在必要時調用super / abstract類。
最后,研究仿制葯提供的可能性。
你的add(Entity operand)
方法必須根據傳遞的操作數決定做什么,所以你可以通過回調操作數來實現這一點。 例如
// 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
或類似的。 以上是類型安全和完整的。 例如,添加新的操作數類型將導致一組明顯的重構。
您可以使用抽象類並為其提供具體的add方法。
到目前為止,我沒有看到你的方法存在問題。
由於實體是一個實例,您可以通過以下方式解決代碼重復問題:
簡單地忽略它並重復,因為它會給你一個干凈的解決方案。 如果只有少數情況發生這種重復,以這種方式實現它可能會更好。
如前所述,實現一個抽象類,例如AbstractEntity,將所有方法實現為受保護的成員方法,並將MyInteger和MyString聲明為子類。
進一步了解子類化,思考哪個實體需要哪些方法,並構建子類樹。 注意:如果您不能仔細設計,這將妨礙進一步的調整。
使用實用程序類:具有公共靜態方法的類和私有構造函數來實現所需的功能。
如何找出實體的類型:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.