2011-08-08 66 views
2

我有3類:如何解決這個重複代碼+添加另一種方法

class First { 
    public void SetA(){ ... } 
    public void SetB(){ ... } 
    public void SetC(){ ... } 
    public void SetD(){ ... } 
    public void SetZ(){ ... } 
} 

class Second { 
    public void SetC(){ ... } 
    public void SetD(){ ... } 
    public void SetE(){ ... } 
    public void SetF(){ ... } 
    public void SetX(){ ... } 
} 

class Third{ 
    public void SetA(){ ... } 
    public void SetB(){ ... } 
    public void SetE(){ ... } 
    public void SetF(){ ... } 
    public void SetY(){ ... } 
} 

正如你所看到的,我在同樣的方法重複的代碼。
昨天我意識到,有時候我想在每種方法中添加另一個推薦。
所以我正在尋找解決這兩個問題的方法。一個解決方案,我想的是:

  1. 創建接口:

    interface IAllMethods { 
         void SetA(); 
         void SetB(); 
         void SetC(); 
         void SetD(); 
         void SetE(); 
         void SetF(); 
         void SetX(); 
         void SetY(); 
         void SetZ(); 
    } 
    
  2. 創建默認的實現:

    class DefaultAllMethods { 
         public void SetA(){ ... } 
         public void SetB(){ ... } 
         public void SetC(){ ... } 
         public void SetD(){ ... } 
         public void SetE(){ ... } 
         public void SetF(){ ... } 
         public void SetX(){ ... } 
         public void SetY(){ ... } 
         public void SetZ(){ ... } 
    } 
    
  3. ,以增加額外的命令,使用Decorator模式創建另一個實施:

    class ExtraAllMethods { 
         private IAllMethods _allMethods; 
         public ExtraAllMethods (IAllMethods allMethods) { 
          _allMethods=allMethods; 
         } 
         public void SetA(){ 
          _allMethods.SetA(); 
          extraMethod(); 
         } 
         public void SetB(){ 
          _allMethods.SetB(); 
          extraMethod(); 
         } 
         public void SetC(){ 
          _allMethods.SetC(); 
          extraMethod(); 
         } 
         .. 
         .. 
         .. 
    } 
    
  4. 在類First,Second和Third中使用慾望實現。例如:

    class Third{ 
        private IAllMethods _allMethods; 
        public Third(IAllMethods allMethods) { 
         _allMethods=allMethods; 
        } 
        public void SetA(){ _allMethods.SetA(); } 
        public void SetB(){ _allMethods.SetB(); } 
        .. 
        .. 
        .. 
    } 
    

你怎麼看待這個解決方案是什麼?這種需求有更好的設計嗎?

UPDATE
人們索要真正的業務,所以這裏是: 我有3種類型的傳輸:TransmissionA,TransmissionB,TransmissionC 每個傳輸有很多參數(成員或屬性)。例如,TransmissionA具有WorkerId,CustomerId,MessageName等。 TransmissionB具有WorkerId和MessageName但不包含CustomerId。 TransmissionC具有WorkerId,CustomerId但沒有MessageName。這些僅僅是示例 - 在我的情況下,每次傳輸都有更多的屬性。每個屬性都有Set方法。
現在有一個新的需求。系統某處有一個稱爲「更新任務」的選項。如果選項爲ON,那麼我需要在每個Set方法中更新相關任務。這就是爲什麼我想到裝飾模式。

+0

爲什麼您使用的方法,而不是設置屬性? –

+2

只需用該方法聲明一個抽象類並繼承該類即可。然後您可以簡單地覆蓋該方法。如果班級沒有使用它,則不要使用它或覆蓋它。 –

+0

這些類是否可以互換?換句話說,它就像狗和貓一樣,雖然不同,但都可以走路和咬人?我試圖準確理解他們是怎麼做的以及他們如何相互關聯。 – NotMe

回答

0

這將工作,但不是引入無所不知包含所有方法的接口和基本實現類(和因此具有的知識整個方法集合),你也可以採用更細化的方法,併爲每種方法制作一個接口和基本實現。這將更具可擴展性,如果你設置得當,你可以像插件一樣簡單地附加這些插件。

+0

你怎麼能想象出具有多重繼承每個方法基本實現? – sll

+0

@mtijn:你的意思是我應該添加9個接口和實現(在這個例子中)? – Naor

+0

是和不是,我正在考慮9個接口和9個具有特定實現的類,我正在考慮通過調用具有實際接口實現的類來實現它們所需接口的第一類,第二類和第三類。無論您希望First,Second和Third通過繼承顯式公開其功能還是通過保留受支持的插件的公共集合,都取決於您。 – mtijn

2
  1. 接口不是好主意,因爲它的實現者只提供接口提供的子方法的功能。
  2. decorator pattern此處不能使用,因爲它用於添加功能,它不能用於像添加方法一樣更改API。有關更多信息,請參見this answer
  3. 如果在不同的類中使用相同的代碼的方法相同,則應將其提取到其自己的類中,並由其他類使用。目前,您的課程很可能違反了single responsible principle
+0

1.這裏用於裝飾者的界面。 2.我使用裝飾器爲了在每個方法中添加額外的命令(如日誌命令)而不是添加方法。 3.在這個例子中,你能告訴我怎樣才能將課程提取到一個班級中? 4.其他類中的相同方法之間沒有關係。 – Naor

+1

@Naor:正如其他人已經指出:你的「示例代碼」是沒有多大用處的,因爲它是抽象。如果你在不同的類中有相同的代碼,這是一個設計缺陷。如何解決這個問題取決於你的實際代碼庫。關於你的答案:裝飾者應該實現與裝飾對象相同的界面,即'First','Second'和'Third'應該實現'IAllMethods'。這直接向你顯示接口是「錯誤的」,因爲這三個類都沒有提供接口的所有方法。這也會使您在展示裝飾器方法時失去資格。 –

+2

@Naor:要接收非理論答案,請提供實際代碼。 –

0

取決於這些方法在做什麼,因此解決方案可能會有所不同。 但是,如果這些方法不依賴一個到其他某種方式在邏輯上我會建議每個抽象方法,通過一個接口一樣

interface ILogicBAware 
    { 
     void DoB(); 
    } 

    interface ILogicCAware 
    { 
     void DoC(); 
    } 

    interface IAllMethods : ILogicBAware, ILogicCAware 
    { 
     void DoAll(); 
    } 

這樣你會得到更大的靈活性和較低的偶合。通過這種方式,您可以前進並決定如何封裝實際的邏輯。但同樣它依賴的是什麼類和您所提供的方法引擎蓋下...

+0

什麼是DoAll()? – Naor

+0

它執行的所有方法,波達方向,DOB ... – sll

0

你可以定義每個單一的方法和默認的實現爲每個接口的接口,使您的類實現只需要接口,並通過構造函數進行參數使用默認的實現來裝飾。

+0

請參閱更新。 – Naor

相關問題