Oggi ho ricevuto una recensione del codice da uno sviluppatore senior che mi chiedeva "A proposito, qual è la tua obiezione alle funzioni di invio tramite un'istruzione switch?" Ho letto in molti posti su come pompare un argomento attraverso il passaggio ai metodi di chiamata è un OOP negativo, non così estensibile, ecc. Tuttavia, non riesco davvero a trovare una risposta definitiva per lui. Vorrei risolverlo una volta per tutte.
Ecco i nostri suggerimenti sul codice concorrenti (php usato come esempio, ma può essere applicato in modo più universale):
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));
}
}
Parte del suo argomento era "It (switch method) ha un modo molto più pulito di gestire i casi predefiniti rispetto a quello che hai nel metodo magico __call () generico".
Non sono d'accordo sulla pulizia e in effetti preferisco chiamare, ma mi piacerebbe sentire quello che gli altri hanno da dire.
Argomenti che posso trarre a sostegno dello Oop
schema:
- 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 in qualsiasi punto della classe anziché in uno spot specifico.
- I metodi sono spaziati, il che è carino.
- Non si applica qui, ma considera un caso in cui
Switch::go()
operato su un membro piuttosto che su un parametro. Dovresti prima cambiare il membro, quindi chiamare il metodo. PerchéOop
puoi chiamare i metodi in modo indipendente in qualsiasi momento.
Argomenti che posso trarre a sostegno dello Switch
schema:
- Per ragioni di argomento, un metodo più pulito per gestire una richiesta predefinita (sconosciuta)
- Sembra meno magico, il che potrebbe far sentire gli sviluppatori sconosciuti a proprio agio
Qualcuno ha qualcosa da aggiungere per entrambe le parti? Mi piacerebbe avere una buona risposta per lui.
Oop
permette di avere phpdoc per descrivere ogni metodo, che può essere analizzato da alcuni IDE (es. NetBeans).