Devo creare un modello di strategia in cui un utente seleziona quattro strategie da un elenco di venti o trenta oggetti di strategia univoci. L'elenco delle strategie verrà ampliato con la maturazione del progetto e gli utenti potranno modificare la strategia selezionata in qualsiasi momento.Questo codice è troppo fragile?
Ho intenzione di memorizzare i nomi delle strategie che hanno selezionato come stringhe e quindi utilizzare un metodo come questo per caricare le classi di strategia che corrispondono alle stringhe selezionate.
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();
}
}
Sto cercando di evitare una dichiarazione switch di grandi dimensioni. La mia preoccupazione è che questo sembra tipo Stringly Typed
. Esiste un modo migliore per raggiungere questo obiettivo senza utilizzare un'istruzione switch condizionale o di grandi dimensioni?
BTW: L'utente non inserisce una stringa quando seleziona le quattro strategie. Avrei bisogno di mantenere un elenco di stringhe da presentare all'utente in una casella di selezione e aggiungerne di nuovi all'elenco mentre aggiungo nuovi oggetti strategia.
Spiegazione
ircmaxell espresso un po 'di confusione per quanto riguarda ciò che è che sto cercando di fare. Nell'esempio precedente, l'utente ha selezionato quattro strategie da un elenco e passate al costruttore StrategyManager come una serie di stringhe. Gli oggetti strategia corrispondenti vengono create e memorizzate in una matrice interna, $this->selectedStrategies
"primo", "secondo", "terzo" e "quarto" sono le chiavi dell'array della matrice interna per i quattro differenti strategie selezionate. Dopo che l'oggetto StrategyManager è stato creato, l'applicazione utilizza il metodo execute
delle quattro strategie durante i vari momenti della durata del processo.
Quindi, in poche parole ... ogni volta che l'applicazione deve eseguire il metodo del numero di strategia "uno" lo fa, ed i risultati sono diversi a seconda di quale strategia è stata scelta dall'utente per Strategia "uno"
Sono confuso. Sono "prima", "seconda", "terza" e "quarta" diverse strategie possibili, o sono una serie di comandi per la strategia selezionata (che vengono scelti prima di costruire il manager). E se così fosse, un modello di Chain of Responsibility (http://sourcemaking.com/design_patterns/chain_of_responsibility) o [Command] (http://sourcemaking.com/design_patterns/command) funzionerà meglio? Potresti spiegare cosa stai cercando di fare esattamente (e cosa fa il codice, perché esistono le diverse strategie)? – ircmaxell
aggiornerò la domanda. – Stephen
Ci sono sempre 4 strategie? E vengono sempre eseguiti in sequenza? O sono quattro strategie altrimenti non correlate che stai solo cercando di gestire insieme? – ircmaxell