Ho ricevuto una revisione del codice da uno sviluppatore senior che oggi mi chiede "A proposito, qual è la tua obiezione alle funzioni di dispacciamento tramite un'istruzione switch?" Ho letto in molti punti come il pompaggio di un argomento attraverso il passaggio ai metodi di chiamata sia un OOP errato, non tanto estensibile, ecc. Tuttavia, non riesco a trovare una risposta definitiva per lui. Vorrei sistemarmi tutto per me una volta per tutte.
Ecco i nostri suggerimenti sul codice in competizione (php usato come esempio, ma può essere applicato più universalmente):
class Switch {
public function go($arg) {
switch ($arg) {
case "one":
echo "one\n";
break;
case "two":
echo "two\n";
break;
case "three":
echo "three\n";
break;
default:
throw new Exception("Unknown call: $arg");
break;
}
}
}
class Oop {
public function go_one() {
echo "one\n";
}
public function go_two() {
echo "two\n";
}
public function go_three() {
echo "three\n";
}
public function __call($_, $__) {
throw new Exception("Unknown call $_ with arguments: " . print_r($__, true));
}
}
Una parte della sua argomentazione era "It (metodo switch) ha un modo molto più pulito di gestire i casi predefiniti rispetto a quello che hai nel generico metodo magico __call ()."
Non sono d'accordo riguardo alla pulizia e di fatto preferisco chiamare, ma mi piacerebbe sentire cosa hanno da dire gli altri.
Argomenti che posso presentare a sostegno dello schema Oop
:
- Un po 'più pulito in termini di codice che devi scrivere (meno, più facile da leggere, meno parole chiave da considerare)
- Non tutte le azioni delegate a un singolo metodo. Non c'è molta differenza nell'esecuzione qui, ma almeno il testo è più compartimentato.
- Allo stesso modo, un altro metodo può essere aggiunto ovunque nella classe invece che in un punto specifico.
- I metodi sono spazi dei nomi, il che è bello.
- Non si applica qui, ma considera un caso in cui
Switch::go()
ha operato su un membro anziché su un parametro. Dovresti prima cambiare membro, quindi chiamare il metodo. PerOop
puoi chiamare i metodi in modo indipendente in qualsiasi momento.
Argomenti che posso presentare a sostegno dello schema Switch
:
- Per ragioni, un metodo più pulito per gestire una richiesta predefinita (sconosciuta)
- Sembra meno magico, il che potrebbe far sentire gli sviluppatori non familiari più a proprio agio
Qualcuno ha qualcosa da aggiungere per entrambe le parti? Mi piacerebbe avere una buona risposta per lui.