Recebi uma revisão de código de um desenvolvedor sênior hoje perguntando "A propósito, qual é a sua objeção a enviar funções por meio de uma declaração de switch?" Eu já li em muitos lugares sobre como bombear um argumento através da opção de alternar para chamar métodos é ruim OOP, não tão extensível, etc. No entanto, não consigo realmente encontrar uma resposta definitiva para ele. Eu gostaria de resolver isso para mim de uma vez por todas.
Aqui estão nossas sugestões de códigos concorrentes (php usado como exemplo, mas pode ser aplicado de maneira mais universal):
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 de seu argumento era "Ele (alternar método) tem uma maneira muito mais limpa de lidar com casos padrão do que o que você possui no método mágico genérico __call ()".
Discordo da limpeza e, de fato, prefiro telefonar, mas gostaria de ouvir o que os outros têm a dizer.
Argumentos que posso apresentar em apoio ao Oop
esquema:
- Um pouco mais limpo em termos do código que você precisa escrever (menos, mais fácil de ler, menos palavras-chave a serem consideradas)
- Nem todas as ações delegadas a um único método. Não há muita diferença na execução aqui, mas pelo menos o texto é mais compartimentado.
- Na mesma linha, outro método pode ser adicionado em qualquer lugar da classe, em vez de em um local específico.
- Os métodos são namespaced, o que é bom.
- Não se aplica aqui, mas considere um caso em que
Switch::go()
operado em um membro em vez de um parâmetro. Você precisaria alterar o membro primeiro e depois chamar o método PoisOop
você pode chamar os métodos de forma independente a qualquer momento.
Argumentos que posso apresentar em apoio ao Switch
esquema:
- Por uma questão de argumento, método mais limpo de lidar com uma solicitação padrão (desconhecida)
- Parece menos mágico, o que pode fazer com que desenvolvedores desconhecidos se sintam mais confortáveis
Alguém tem algo a acrescentar para ambos os lados? Eu gostaria de ter uma boa resposta para ele.
Oop
permite ter phpdoc para descrever cada método, que pode ser analisado por alguns IDEs (por exemplo, NetBeans).