如何解决此代码重复+添加另一种方法

时间:2011-08-08 14:57:10

标签: c# .net design-patterns architecture

我有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. 使用装饰器模式创建另一个实现,以添加额外的命令:

    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(); }
        ..
        ..
        ..
    }
    
  5. 您对此解决方案有何看法?有没有更好的设计来满足这种需求?

    更新
    人们要求真正的业务,所以这就是: 我有3种类型的传输:TransmissionA,TransmissionB,TransmissionC 每次传输都有许多参数(成员或属性)。例如,TransmissionA具有WorkerId,CustomerId,MessageName等。 TransmissionB具有WorkerId和MessageName但没有CustomerId。 TransmissionC具有WorkerId,CustomerId但没有MessageName。这些只是示例 - 在我的情况下,每个传输我有更多的属性。每个属性都有Set方法 现在有了新的需求。在系统的某个地方有一个名为“更新任务”的选项。如果选项为ON,那么我需要更新每个Set方法中的相关任务。这就是我想到装饰模式的原因。

4 个答案:

答案 0 :(得分:2)

  1. 接口不是一个好主意,因为它的实现者只为接口提供的方法的子集提供功能。
  2. 此处不能使用decorator pattern,因为它用于添加功能,因此无法像添加方法一样更改API。有关详细信息,请参阅this answer
  3. 如果在不同的类中使用相同的代码具有相同的方法,则应将其提取到自己的类中并由其他类使用。目前,您的课程很可能违反single responsible principle

答案 1 :(得分:0)

取决于这些方法正在做什么,因此解决方案可能会有所不同。 但是,如果这些方法在某种程度上并没有在某种程度上相互关联,我会建议通过像

这样的接口来抽象每个方法。
    interface ILogicBAware
    {
      void DoB();
    }

    interface ILogicCAware
    {
      void DoC();
    }

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

通过这种方式,您可以获得更大的灵活性和更少的耦合。通过这种方式,您可以继续前进并决定如何封装实际逻辑。但是,这又取决于你提供的课程和方法的内幕......

答案 2 :(得分:0)

这将有效但不是引入包含所有方法的全知的接口和基本实现类(因此了解整个方法集合),您还可以采用更细粒度的方法并只创建一个接口和每个方法的基础实现。这将是更具可扩展性的,如果你正确地设置它,你可以像插件一样简单地附加它们。

答案 3 :(得分:0)

您可以为每个单独的方法和每个接口的默认实现定义一个接口,并使您的类只实现所需的接口,并通过构造函数进行参数化,并使用默认实现进行装饰。