O operador ternário deve ser usado fora das declarações de atribuição?

9

Editar Não se trata de saber se o operador ternário é prejudicial . É sobre se existe ou não um consenso sobre se deve ou não ser usado fora das declarações de atribuição. /Editar

Baseado em um valor booleano, desejo chamar uma de duas funções diferentes (sem valor de retorno). Eu escrevi este bit de javascript:

(condition) ? doThis(arg) : doThat(arg)

Acho que parece mais limpo do que escrever uma declaração if-else:

if(condition) {
    doThis(arg);
}
else {
    doThat(arg);
}

Meus colegas acreditam firmemente que declarações ternárias devem ser usadas apenas em declarações de atribuição. Não consigo encontrar guias de estilo que discutam isso, provavelmente porque linguagens como Java e C # não permitem isso (seus compiladores exigem que operadores ternários retornem um valor). Isso deve ser considerado um mau uso da declaração ternária? Por quê?

BobbyA
fonte
Lembre-se de que os Jason Voorhees podem ser designados para manter esse código seu.
David Hammen
2
@gnat - não é uma duplicata dessa pergunta, que é sobre o uso geral de?: em expressões, enquanto isso é especificamente sobre como usá-lo como um substituto para if-else quando não há um valor único sendo calculado.
Jules
Embora eu esteja pensando sobre a adequação da duplicata proposta, essa questão ainda é primariamente baseada em opiniões, por isso não vejo sentido em reabri-la.
Ixrec 27/08/2015
Por que você acha que isso parece mais limpo? Quebrar convenções como essa é o oposto de limpo.
precisa saber é o seguinte

Respostas:

10

De um modo geral, o operador condicional pretende fazer uma declaração if com um valor . w = x ? y : z. Portanto, se você o estiver usando para efeitos colaterais, é contra-intuitivo. Válido, mas contra-intuitivo; e lembre-se de que você está escrevendo um código para seus colegas de equipe lerem.

asthasr
fonte
Isso parece certo. Quase todos os exemplos de uso que encontro, incluindo a Wikipedia, usam o operador para executar tarefas condicionais.
BobbyA
3

Alguns casos, que não são atribuições, nos quais considero úteis operadores ternários são:

Em argumentos de função: na minha opinião

f( e1, .. cond ? em : dm, .. en);

é menos propenso a erros do que

if ( cond) f( e1, .. em, .. en); else f( e1, .. dm, .. en);

Quando você deseja chamar uma função ou outra com argumentos idênticos: novamente eu acho

(cond ? f : g)( /* long and complex argument list */);

menos propenso a erros do que

if ( cond) f( /* long and complex argument list */);
else g( /* long and complex argument list */);

A meu ver, o principal em cada caso é que? forma tem menos repetição. A repetição abre a possibilidade de mudar uma instância e esquecer de mudar a outra.

dmuir
fonte
5
Nesses casos, você ainda está usando o operador ternário para retornar um valor que, de acordo com a resposta de syrion acima, é um uso esperado.
BobbyA
@BobbyA e as funções de cancelamento?
pllee