O que é mais sustentável - atribuição booleana via if / else ou expressão booleana?

11

O que seria considerado mais sustentável?

if (a == b) c = true; else c = false;

ou

 c = (a == b);

Tentei procurar no código completo, mas não consigo encontrar uma resposta.

Eu acho que o primeiro é mais legível (você pode literalmente ler em voz alta), o que também acho que o torna mais sustentável. O segundo certamente faz mais sentido e reduz o código, mas não tenho certeza de que seja tão sustentável para desenvolvedores de C # (eu esperaria ver esse idioma mais em, por exemplo, Python).

Bret Walker
fonte
3
Os dois não são equivalentes. Você precisa de um else c = falsepara o primeiro ou fazer a atribuição um ||=no segundo.
17
Acho que o fato de você ter feito duas edições no primeiro formulário responde à sua pergunta!
30412 James
7
Eu concordo com @ James. A segunda forma, embora não seja tão detalhada, é muito simples de entender e não deixa ambiguidade quanto ao seu significado. Não há truques ou atalhos sendo usados, é apenas curto, porque o conceito é simples. O fato de você ter codificado o primeiro com um bug e ter que editá-lo para corrigi-lo, e ainda não é perfeito (uso inconsistente de chaves), é uma prova positiva de que não é tão simples quanto você pensa.
Eric Rei
5
Uau, os desenvolvedores de C # realmente consideram a primeira forma aceitável? Isso ... reduz seriamente minha confiança neles. Na minha experiência, o uso da primeira forma sugere fortemente um completo mal-entendido de expressões booleanas.
Andres F.
2
Só para manter as coisas interessantes, aqui está uma outra opção:c = a==b ? true : false;
FrustratedWithFormsDesigner

Respostas:

14

A segunda opção é melhor.

Há uma razão definida para desconfiar de atalhos de programação inteligentes que prejudicam a capacidade de manutenção, ocultando a intenção do código. Então, eu não culpo você por fazer a pergunta.

No entanto, não considero c = (a == b);um exemplo de truque inteligente. É uma representação direta de um conceito simples. O mais direto possível.

Uma adequada, "sustentável" a formatação de seu primeiro exemplo (sem as chaves desaparecidas e construção de uma linha, que eu fazem considerar um atalho inteligente) renderia este código:

if (a == b)
{
    c = true; 
}
else 
{
    c = false;
}

Na minha experiência, escrever lógica booleana simples de maneira tão detalhada e propensa a erros é um sinal de código "duvidoso". Isso me faria pensar como a lógica mais complexa está sendo manipulada nessa base de código.

Eric King
fonte
15

Primeiro, perceba que seus dois formulários não são equivalentes.

if (a == b) c = true;

cserá definido como true se afor igual a b, e se não, seu valor permanecerá o que já é.

c = (a == b);

cserá definido como true se afor igual a b, e se não for, será definido como false.

Se você quiser o equivalente ao segundo formulário, no estilo do primeiro formulário, precisará escrevê-lo assim:

if (a == b) {
  c = true;
} else c = false;

Agora está claro qual dos dois é mais legível, mais atualizável e com menor probabilidade de apresentar erros se algo for alterado. Fique com o segundo formulário.

Mason Wheeler
fonte
Absolutamente certo - atualizei minha pergunta.
Bret Walker
Considero a segunda forma excessivamente longa e complicada - se você quiser esse efeito, use uma atribuição booleana.
Reinstate Monica - M. Schröder
11

Eu discordo que seu primeiro formulário é mais legível - certamente não é C # idiomático ter duas instruções em uma única linha e não é recomendável ter uma ifdeclaração sem usar chaves.

Em segundo lugar, não vejo como a segunda forma é menos sustentável - não há nada a manter. É uma simples declaração da relação entre ae be não poderia ser expressa mais simplesmente.

Outro motivo para preferir o segundo formulário é que você pode declarar ce atribuí-lo em uma única declaração, ou seja,

bool c = (a == b);

A modificação de variáveis ​​pode facilmente levar a erros, então eu evitaria isso. O uso de uma ifinstrução requer que a variável seja declarada antes da condicional e depois modificada.

Lee
fonte
Eu li as duas declarações em uma linha de código pseudo
Jimmy Hoffa
1
+1 para " Another reason to prefer the second form is that you can declare c and assign it in a single statement"
Andres F.
0

"mais sustentável" pode ser muito subjetivo.

Normalmente, prefiro legibilidade e intenção ao invés de redução de código. Eu acho que você salva 8 caracteres digitados usando o formulário reduzido.

Tomar o idioma e a cultura ao redor do idioma é uma característica da 'legibilidade' na minha opinião.

Há momentos em que o desempenho pode ser a causa da redução do código para otimizar o código de bytes resultante, mas isso deve ser feito com cuidado após alguns perfis.

Johnnie
fonte
Assunto: Duh. Redução de código: também pode (se não for exagerado) melhorar a clareza e comunicar melhor a intenção. Desempenho: sem nenhuma preocupação (a otimização às vezes é vital, mas isso não se enquadra na otimização, porque praticamente nunca importa - provavelmente nem mesmo se você estiver escrevendo kernels ou drivers).
4
A primeira forma tinha pelo menos 1 bug que precisava ser corrigido, oculto em sua verbosidade. A segunda forma era simples e direta e não apresentava erros. Eu descanso meu caso. De qualquer forma, o objetivo principal não era digitar menos caracteres! E essa pergunta não era sobre desempenho, o que é irrelevante neste caso.
Andres F.
@ Delnan exatamente o que quero dizer, Duh. a redução de código de alguém é a clareza de outra pessoa. Não citei a otimização como a principal preocupação ... usei-a como exemplo. Seu motivo para adicionar truques inteligentes ou sair da norma deve ser equilibrado pelo que você / cultura / empresa considerar como legível.
Johnnie
1
Escrever uma expressão booleana limpa não é um truque inteligente!
Andres F.
Acho que eu daria mais mérito ao seu comentário se você realmente abordasse o espírito da pergunta e não uma analogia insana usada para sustentar um conceito subjacente.
quer
0

O segundo. Tem menos repetição (seco) e é mais fácil de entender o que está acontecendo, que cdetém a valor de haver ou não ae ser bsão iguais.

IMHO, melhor ainda seria

c = a == b

Assim como eu escreveria

  • 1 + 2 + 3 ao invés de ((1 + 2) + 3)
  • 5 + 3 * 7 ao invés de (5 + (3 * 7))

O código óbvio e trivialmente desnecessário não é uma virtude. Está confuso.

Paul Draper
fonte
-4

Para baixo eleitores, por favor, elabore o que está errado com a minha resposta revisada.

Sim, c = (a == b);pode ser difícil de ler (pior ainda, o StyleCop reclama dos parênteses desnecessários), mas ainda gosto da simplicidade de a == b. Portanto, aqui é o que eu gosto de usar quando ambos ae bsão os mesmos:

private static bool NoPeriod
{
    get
    {
        return this.MyWaveLength == this.HerWaveLength;
    }
}

E então você pode fazer: em this.c = this.NoPeriodvez de:

this.c = this.MyWavelength == this.HerWaveLength;
Trabalho
fonte
1
então você quis dizer return this.MyWaveLength = this.HerWaveLength;ou return this.MyWaveLength == this.HerWaveLength;não?
Jesse C. Slicer
5
O que!? c = (a == b);não é propenso a erros. A primeira forma na pergunta original é muito mais suscetível a erros , como demonstrado pelo próprio OP tendo que editar sua pergunta para corrigir bugs!
Andres F.
Eu acho que sua solução sugerida tem um bug = vs. ==
Ondra
@Ondra Morský, obrigado ... o compilador teria pego isso para mim.
6
Não conheço o StyleCop, mas se ele indicar que parênteses desnecessários são ruins, você deve desativá-lo. Parênteses desnecessários não são necessários para o compilador, mas podem ser muito, muito agradáveis ​​para os olhos humanos. Se você escreveu c = a == b; o compilador pode descobrir tudo bem, mas é mais difícil para um humano.
Michael Shaw