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

标签 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):

    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(); }
        ..
        ..
        ..
    }
    

您如何看待这个解决方案?有没有更好的设计来满足这个需求?

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

最佳答案

  1. 接口(interface)不是个好主意,因为它的实现者只为接口(interface)提供的方法的子集提供功能。
  2. decorator pattern这里不能用,因为是用来增加功能的,不能像增加方法那样用来改变API。参见 this answer了解更多信息。
  3. 如果您在不同的类中有相同的方法和相同的代码,则应将其提取到自己的类中供其他人使用。目前,您的类(class)很可能违反了 single responsible principle .

关于c# - 如何解决此代码重复+添加另一种方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6984050/

相关文章:

c# - .NET Core 中的 MethodInfo ReflectedType

php - 在 CQRS 中构造带有可选参数的命令对象

vb.net - 设计基于权限的安全模型

javascript - 防止 MVC 提供 .js、.css 等静态文件

C#逻辑内存配置 View

c# - userControl1.Dispose() 会处理它的所有一次性对象吗?

c# - 返回 IList 与 List 或 IEnumerable 与 List<Class> 之间有什么区别。我想知道返回哪个更好

.net 2.0 wsdl.exe 目录必须在全局首选项中设置

java - 扩展或重写外部基类以添加随后也存在于外部子类中的功能

c# - 自学C#/C/C++应该做什么样的项目?