C #.Как извлечь общую логику гибким способом - PullRequest
0 голосов
/ 08 мая 2019

У меня есть два класса, A и B. У них много общей логики, но в некоторых местах эта логика отличается, например:

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

Я не считаю лучший метод дляэто существует, но просто хочу знать, какие методы возможны.

Я нашел только два схожих способа: передать части, отличающиеся в конструктор CommonLogicClass, или заставить A и B реализовать интерфейс и реализовать методы Different1 () и Different2 (), и после этого использовать интерфейс вместо частейкоторые отличаются.

Есть некоторые проблемы с этими методами.Когда я создаю 3-й класс C тем же методом, мне может понадобиться дополнительная деталь, как в примере ниже:

CommonMethod() {
    common1
    different1
    common2
    different2
    additionalCodeOnlyForCClass
}

В этом случае мне придется добавить пустые действия или добавить метод для интерфейсаи реализовать его как пустой метод во всех классах, кроме C.

Или у меня может быть худший случай, когда common2 является общим для A и B, но не для C:

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

Iпотребуется исключить common2 из общего, сделать его другим и добавить один и тот же код для всех классов, кроме C.

Так что всегда есть много изменений, когда минимум логики изменен или добавлен.Каковы другие более гибкие способы извлечения общей логики?Может быть, есть какие-то шаблоны, которые я должен выучить, или несколько книг, которые я должен прочитать, чтобы ответить на такие вопросы об архитектуре?

1 Ответ

0 голосов
/ 08 мая 2019

Я думаю, вы, возможно, ищете шаблон шаблона: 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...