2011-08-08 35 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

相关问题