C#。如何灵活地提取常用逻辑

时间:2019-05-08 10:50:05

标签: c# architecture refactoring

我有两个类,A和B。它们有很多共同的逻辑,但是这种逻辑在某些地方是不同的,例如:

CommonLogicClass {
    CommonMethod() {
        common1
        different1
        common2
        different2
    }
}

我不认为最好的方法存在,而只是想知道什么方法是可能的。

我发现只有两种相似的方式:将不同的部分传递到CommonLogicClass的构造函数中,或者使A和B实现接口并实现方法Different1()和Different2(),然后使用该接口代替不同的部分。

这些方法存在一些问题。当我使用相同的方法创建3-d类C时,可能需要一个额外的部分,例如下面的示例:

CommonMethod() {
    common1
    different1
    common2
    different2
    additionalCodeOnlyForCClass
}

在这种情况下,我将不得不添加空操作或添加接口方法,并将其实现为除C之外的所有类中的空方法。

或者当common2仅对A和B通用而不对C通用时,我可能会遇到更糟糕的情况:

CommonMethod() {
    common1
    different1 \
    different2 - (or just different1)
    different3 /
}

我将需要从common中排除common2,使其与众不同,并为除C外的所有类添加相同的代码。

因此,当最少的逻辑更改或添加时,总是会有很多更改。还有哪些更灵活的方法来提取通用逻辑?也许我应该学习一些模式或者我应该读一些书来回答关于这样的体系结构的问题?

1 个答案:

答案 0 :(得分:0)

我认为您可能正在寻找模板方法模式:https://en.wikipedia.org/wiki/Template_method_pattern

制作一个抽象基类,该基类实现常见的功能。在子类中实现差异。

void Main()
{
    LogicBase a = new ClassA();
    a.CommonMethod();

    Console.WriteLine("----------------------------");

    LogicBase b = new ClassB();
    b.CommonMethod();
}

public class LogicBase
{
    public void CommonMethod()
    {
        DoSomething_1();
        DoSomething_2();
        DoSomething_3();
    }

    protected virtual void DoSomething_1()
    {
        // Default behaviour 1
        Console.WriteLine("DoSomething_1 - Hello from LogicBase");
    }

    protected virtual void DoSomething_2()
    {
        // Default behaviour 2
        Console.WriteLine("DoSomething_2 - Hello from LogicBase");

    }

    protected virtual void DoSomething_3()
    {
        // Default behaviour 3
        Console.WriteLine("DoSomething_3 - Hello from LogicBase");
    }
}

public class ClassA : LogicBase
{
    protected override void DoSomething_2()
    {
        // Behaviour specific to ClassA
        Console.WriteLine("DoSomething_2 - Hello from ClassA");
    }
}

public class ClassB : LogicBase
{
    protected override void DoSomething_3()
    {
        // Behaviour specific to ClassB
        Console.WriteLine("DoSomething_3 - Hello from ClassB");
    }
}

运行代码将给出以下输出:

DoSomething_1 - Hello from LogicBase
DoSomething_2 - Hello from ClassA
DoSomething_3 - Hello from LogicBase
----------------------------
DoSomething_1 - Hello from LogicBase
DoSomething_2 - Hello from LogicBase
DoSomething_3 - Hello from ClassB