ユーザーが20または30の一意の戦略オブジェクトのリストから4つの戦略を選択する戦略パターンを作成する必要があります。プロジェクトが成熟するにつれて戦略のリストが拡張され、ユーザーはいつでも選択した戦略を変更できます。
選択したストラテジー名を文字列として保存し、このようなメソッドを使用して、選択したストリングに対応するストラテジークラスをロードする予定です。
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ステートメントを使用せずにこの目標を達成するためのより良い方法はありますか?
ところで:ユーザーは4つの戦略を選択するときに文字列を入力しません。選択ボックスでユーザーに表示する文字列のリストを維持し、新しい戦略オブジェクトを追加するときにリストに新しい文字列を追加する必要があります。
説明
ircmaxellは、私がやろうとしていることに関して少し混乱を示しました。上記の例では、ユーザーはリストから4つの戦略を選択し、それらは文字列の配列としてStrategyManagerコンストラクターに渡されます。対応するストラテジーオブジェクトが作成され、内部配列に格納されます。$this->selectedStrategies
「first」、「second」、「third」、「fourth」は、選択した4つの異なる戦略の内部配列の配列キーです。StrategyManagerオブジェクトが構築された後、アプリケーションはexecute
、プロセスの存続期間中のさまざまな瞬間に4つの戦略のメソッドを使用します。
つまり、一言で言えば...アプリケーションがストラテジー番号「1」のメソッドを実行する必要があるたびに実行され、ストラテジー「1」に対してユーザーが選択したストラテジーによって結果が異なります。