簡體   English   中英

從多種策略中刪除重復代碼的最有效方法

[英]Most efficient way to remove duplicated code from multiple strategies

我們的項目中有3種類型的屬性: CategoryAttributeProductAttributeProductTypeAttribute 它們來自自動生成的類,因此超出了我們的控制范圍,並且可能包含不同類型的屬性值,例如, 文本數字圖像 現在,每個屬性都有其自己的策略來檢索attributeValue。 為了簡單起見,我們假設所有這三個對象都具有TextStrategyNumberStrategyImageStrategy

策略示例:

@Component
public class CategoryImageAttributeStrategy implements CategoryAttributeStrategy {

  @Override
  public boolean isApplicable(CategoryAttribute attribute) {
      return attribute.getImage() != null;
  }

  @Override
  public Object getAttributeValue(CategoryAttribute attribute) {
      //return attribute value here 
      //may be different or may be the same 
      //for ProductImageAttributeStrategy and ProductTypeImageAttributeStrategy
  }

}

雖然獲取圖像值對於所有這些對象可能都不同,但是獲取文本值卻是相同的,我們最終得到3個幾乎相同的代碼類,我真的真的不喜歡復制代碼。

我考慮過為每種策略類型創建一個抽象類/默認接口,例如DefaultTextStrategy ,所有這三種文本策略都將繼承該策略,或者使用更高級別提供的默認代碼,或者使用自己的實現覆蓋它,但是我對此方法並不滿意。需要為這樣一個簡單的任務創建更多的類。

甚至有可能將相同類型(例如圖像)的策略組合成一個策略?

我真的很想聽聽更多有經驗的人們在這件事上要說什么,我想學習和改進。

在此先感謝您的時間。

應該只有3種策略。 TextStrategy,NumberStrategy和ImageStrategy擴展了基本策略。 屬性和策略的混合會使它們感到困惑,因為兩者實際上是獨立的,並且彼此之間存在多對多的關系。

讓3個屬性擴展單個Attribute類:CategoryAttribute,ProductAttribute和ProductTypeAttribute。

讓策略根據傳遞給它的Attribute類對象決定需要做什么。 對於文本策略,將只有一個實現。 對於圖像策略,您可能需要對一個類進行特殊處理。

這是我所做的:

首先,我為名為“ AttributeValueStrategy ”的所有類型的策略創建了一個接口。 然后添加了3個回調 (特定於類型,例如NumberValueCallback等)。 現在,每種策略都實現其類型的回調接口和AttributeValueStrategy接口。 然后是DefaultStrategyMethods類,其中包含每種類型的默認“ getAtrribute”,而實際策略則調用defaultStrategyMethods(如下所示)或僅實現其自己的代碼。

@Override
public Object getAttributeValue(Object attribute) {
    return defaultStrategyMethods.getNumberValue(attribute, this);
}

之所以創建回調,是因為只有實際的策略才知道應將其強制轉換為哪個類(並具有執行該方法的方法),並且DefaultStrategyMethods需要使用它,所以這就是為什么我將“ this”作為第二個參數傳遞的原因(這是回調本身)。

不再重復,一切都干凈整潔。

暫無
暫無

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

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