Вызовите несколько методов в определенном порядке - PullRequest
0 голосов
/ 02 декабря 2018

Представьте себе случай, подобный этому:

У меня есть действие контроллера (или метод обслуживания), когда мне нужно вызывать три метода в последовательном порядке, каждый метод несет одну ответственность.

public return_type MyMethod(_params_) {
    // .. some code

    Method_1 (...);
    Method_2 (...);
    Method_3 (...);

    // ... some more code
}

Разработчик может совершить ошибку, вызвав Method_2 до Method_1, или, по крайней мере, мы можем сказать, что ничто не заставляет его следовать этому приказу или получить исключение, если он не выполняется.

Сейчасмы можем вызвать Method_2 внутри Method_1 и Method_3 внутри Method_2, но это не кажется правильным, когда каждый метод обрабатывает совершенно разные обязанности.

Существует ли шаблон проектирования для этой ситуации?Или какой-нибудь "чистый" способ справиться с этим?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Полагаю, вам следует оставить контроль над выполнением для себя и дать возможность просто установить, что должно быть выполнено.

public interface IMethodsExecutor
{
    void Execute();
    void ShouldRunMethod1();
    void ShouldRunMethod2();
    void ShouldRunMethod3();
}

public class MethodsExecutor: IMethodsExecutor
{
    private bool _runMethod1;
    private bool _runMethod2;
    private bool _runMethod3;

    public MethodsExecutor()
    {
        _runMethod1 = false;
        _runMethod2 = false;
        _runMethod3 = false;
    }

    public void ShouldRunMethod1()
    {
        _runMethod1 = true;
    }
    public void ShouldRunMethod2()
    {
        _runMethod2 = true;
    }
    public void ShouldRunMethod3()
    {
        _runMethod3 = true;
    }

    private void Method1()
    {
    }
    private void Method2()
    {
    }
    private void Method3()
    {
    }
    public void Execute()
    {
        if (_runMethod1)
        {
            Method1();
        }
        if (_runMethod2)
        {
            Method2();
        }
        if (_runMethod3)
        {
            Method3();
        }
    }
}

Так что использование будет:

IMethodsExecutor methodsExecutor = new MethodsExecutor();
methodsExecutor.ShouldRunMethod1();
methodsExecutor.ShouldRunMethod3();
methodsExecutor.Execute();
0 голосов
/ 02 декабря 2018

Это именно то, что делают фасады.Попробуйте извлечь три метода из другого класса и сделать их закрытыми.Предоставьте единственный метод MyMethod, который вызывает другие методы в нужном порядке.Клиенты должны использовать Facade.MyMethod

Подробнее: https://en.m.wikipedia.org/wiki/Facade_pattern

...