簡體   English   中英

代碼重復(或不重復) - JAVA

[英]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聲明為子類。

  • 進一步了解子類化,思考哪個實體需要哪些方法,並構建子類樹。 注意:如果您不能仔細設計,這將妨礙進一步的調整。

  • 使用實用程序類:具有公共靜態方法的類和私有構造函數來實現所需的功能。

如何找出實體的類型:

  • 使用instanceof(好吧,它很難看)
  • 在接口中實現方法,將類型返回為Enum或測試屬性:getType()== STRING或isString()
  • 在接口中實現您想要的方法:checkIfStringAndAddIt()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM