Шаблон стратегии для модификации внутренних органов вызывающего абонента?

Возможно, стратегия не то, что я после. Скажем, мой код выглядит так (псевдо версия):

class Machine
{
    private Stack<State> _internals;

    public void DoOperation(Thingy x)
    {
        switch (x.operation)
        {
            case Op.Foo:
                DoFoo();
                break;

            case Op.Bar:
                DoBar();
                break;

            case Op.Baz:
                DoBaz();
        }
    }

    private void DoFoo()
    {
        // pushing and popping things from _internals, doing things to those States
    }

    private void DoBar()
    {
        // similarly large method to foo, but doing something much different to _internals
    }

    private void DoBaz()
    {
        // you get the idea...
    }
}

Foo, Bar и Baz - довольно сложные методы (не очень длинные, просто заслуживают разделения), поэтому я хочу разбить их на классы с общим интерфейсом, в стиле стратегии. Проблема в том, что я не могу инкапсулировать _internals в этих классах. Я имею в виду, я мог бы передать это в Execute метод на тех классах, но это кажется плохим путем. Внутренние элементы сохраняются дольше, чем одна операция, поэтому классы стратегии не могут "владеть" внутренними элементами сами. Множество разных операций может быть выполнено на этой машине, с передачей разных Thingy.

Вы можете предложить другой маршрут?

редактировать

Это своего рода конечный автомат, но не в том смысле, что одна операция действительна только в определенном состоянии. _internals это стек состояний, а не только текущее состояние. Любая из трех операций может быть выполнена в любое время.

1 ответ

Ваша стратегия "стратегия" кажется разумной. Пока код выглядит хорошо, вам нужно объявить интерфейс, но я думаю, что вы его получили.

Я не понимаю, почему вы не можете пройти _internals. Это будет частью определения интерфейса. Чтобы члены могли принимать тип ": _internals_data" или любой другой.

Вы могли бы немного обернуть это, я определяю интерфейс как

казнить

sendinlimitedsubsetofinternals

Returnsmodifiedsubsetofinternals

Тогда эти два метода данных могут быть просто массивом строк или чем-то, что действительно ограничивает взаимодействие. Тогда вы можете использовать сериализацию посередине позже или что-то в этом роде.

Другие вопросы по тегам