Этот код слишком хрупкий?

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

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

class StrategyManager { // simplified for the example
    public $selectedStrategies = array();
    public function __construct($userStrategies) {
        $this->selectedStrategies = array(
            'first'  => new $userStrategies['first'],
            'second' => new $userStrategies['second'],
            'third'  => new $userStrategies['third'],
            'fourth' => new $userStrategies['fourth']
        );
    }

    public function do_first() {
        $this->selectedStrategies['first']->execute();
    }

    public function do_second() {
        $this->selectedStrategies['second']->execute();
    }

    public function do_third() {
        $this->selectedStrategies['third']->execute();
    }

    public function do_fourth() {
        $this->selectedStrategies['fourth']->execute();
    }
}

Я пытаюсь избежать использования большого оператора switch. Меня беспокоит, что это похоже на Stringly Typed . Есть ли лучший способ достичь этой цели без использования условного или большого оператора switch?

BTW: Пользователь не вводит строку при выборе четырех стратегий. Мне нужно было бы вести список строк для представления пользователю в поле выбора и добавлять новые в список по мере добавления новых объектов стратегии.

Объяснение
ircmaxell выразило некоторую путаницу относительно что я пытаюсь сделать. В приведенном выше примере пользователь выбрал четыре стратегии из списка, и они передаются конструктору StrategyManager в виде массива строк. Соответствующие объекты стратегии создаются и сохраняются во внутреннем массиве, $ this-> selectedStrategies

"first", "second", "third" и "4th" являются ключами внутреннего массива для четырех различных выбранных стратегий. После создания объекта StrategyManager приложение использует метод execute из четырех стратегий в различные моменты в течение жизненного цикла процесса.

Итак, в двух словах ... каждый раз, когда приложению требуется для выполнения метода Стратегии номер «один» он выполняет это, и результаты будут разными в зависимости от того, какая стратегия была выбрана пользователем для Стратегии «один»

5
задан Community 23 May 2017 в 10:33
поделиться