Pergunta

A discussão surgiu no meu escritório sobre o uso de operadores ternários. Há dois lados para esta discussão.

Side 1) Que os operadores ternários são fáceis de escrever e ler, portanto, a conveniência é um líquido de redução de custos.

Side 2) Que operadores ternários são difíceis de manter, porque eles exigem o excesso de code-churn deve eles nunca precisam ser modificado para ser mesmo o menor pouco mais complexa.

pontos de nerd extra se você pode citar qualquer estudo real feito por uma instituição de alto nível sobre este assunto ... Eu estou muito interessado em ver dados concretos sobre isso.


A minha teoria é que o melhor código é o código que pode mudar e adaptar-se com facilidade, e que a complexidade menos que a mudança requer, menor a chance existe para uma pausa. Exemplo:

$id = $user->isRegistered() ? $user->id : null;

Ok, então isso é completamente válida, mas o que acontece quando as necessidades de código para mudar para se tornar algo um pouco mais complexo?

$id = null;
if ($user->isRegistered() || $user->hasEmail()) {
    $id = $user->id;
}

Qualquer programador sensato iria olhar para o ternário e convertido ao padrão if / else. No entanto, isso exigia uma mudança 4-line contra começando com:

if ($user->isRegistered()) {
    $id = $user->id;
}

O que só exigiria uma mudança 1-line.

Foi útil?

Solução

Eu acho que uma vez que você se acostumar com a sintaxe ambas as opções são igualmente tão legível (desde que você não está indo ao mar com qualquer um) e de modo que não é um problema para mim.

Como para o que é mais tempo eficiente, eu vou responder com uma pergunta desagradável - por que você se importa? Qualquer opção leva menos de 20 segundos para converter para um equivalente if.

Pessoalmente acho que quando estou encontrando maneiras de segundos cinzel fora de meu tempo de programação é uma forma de procrastinação. Eu trabalho melhor quando estou concentrando-se em fazer as coisas e deixar os pequenos detalhes de legibilidade trabalhar-se para fora através da experiência.

Outras dicas

Eu ia ficar com o operador ternery no seu exemplo.

   $id = ($user->isRegistered() ||  $user->hasEmail())? $user->id : null;

Enquanto o único "ramo" é decidir o valor deve ser atribuído a uma variável, o operador ternery é mais legível do que if-else cláusulas, porque não potencialmente duplicar a função real que está sendo executada, (em neste caso - este é o código "$ id =") Se as condições lógicas tornar-se complexa, simplificá-los.

   bool $isReg    = $user->isRegistered(),
        $hasEmail = $user->hasEmail();
   $id = ($isReg || $hasEmail)?  $user->id : null;

Eu gosto de usar o operador ternário sempre que tenho uma expressão de uma linha onde o valor depende de uma condição booleana apropriada. Com efeito, se eu precisar escolher entre atribuir a uma variável, e eu posso escolher entre Expressão 1 e Expressão 2, então muitas vezes eu usar um ternário.

No entanto, se as expressões têm um efeito colateral, então eu vou reescrever imediatamente a coisa toda como uma declaração if (). Usando o operador ternário para controle de fluxo é bastante confuso para a maioria das pessoas.

operações ternários têm o seu lugar; geralmente é para simplificar o código ao executar uma tarefa trivial. Em algum momento, no entanto, pode ser necessário repensar a sua estratégia, se a instrução condicional se torna muito complexo. É determinar quando esse ponto é , que se torna o desafio. Somente a experiência pode guiá-lo em seguida.

Então, eu não acho que há uma resposta "certa" desde que o resultado final é limpo, legível e código de fácil manutenção. As linhas extras de código para a instrução if não deve mesmo ser considerado ao fazer essa determinação (já que o número de linhas de código não se correlaciona necessariamente 1-to-1 para a complexidade do código.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top