Você prefere concisão ou legibilidade no seu código? [fechadas]


21

Os atalhos de idioma geralmente podem ser usados ​​para tornar o código mais conciso.

Por exemplo, operadores coalescentes ternários e nulos podem reduzir a quantidade de código, mas sem dúvida em detrimento da legibilidade:

Em c #:

Person newGuy = new Person();
if (boss == null) {
    newGuy.Boss = GetDefaultBoss();
} else {
    newGuy.Boss = boss;
}

é funcionalmente equivalente a:

Person newGuy = new Person();
newGuy.Boss = boss ?? GetDefaultBoss();

mas obviamente muito mais detalhado.

Onde você desenha a linha quando se trata de concisão versus legibilidade?


3
Esta é uma pergunta subjetiva, alguém que implementou algo diria que seu caminho faz sentido, alguém que lê isso diria que não faz sentido e outra pessoa que lê isso diria que eu entendi, mas prefiro outro caminho. Isso é apenas preferência.
Chris

20
Eu acho que a segunda versão é mais legível.
precisa saber é o seguinte

2
Você está confundindo concisão com concisão. A concisão melhora a legibilidade. A dispersão a diminui.
Ferruccio

1
@ ThorbjørnRavnAndersen: A audiência do código C # geralmente é "desenvolvedores com experiência em C #". Pelo que vi, o consenso aqui em programmers.se parece ser que você não deve evitar o uso de recursos úteis de linguagem apenas porque alguém pode não estar familiarizado com eles. (Veja também: programmers.stackexchange.com/q/101513/33843. )
Heinzi

1
duplicado ?: programmers.stackexchange.com/q/58630/15464 .. Oh, este é mais antigo. :)
Steven Jeuris

Respostas:


63

Ambos.

Seu primeiro exemplo é certamente mais detalhado e sem dúvida mais explícito ... mas também exige que eu digitalize cinco linhas em vez de uma. Pior ainda, enfatiza seu objetivo - atribuir um valor a newGuy.Boss.

Seu segundo exemplo pode me custar um segundo se eu não estiver familiarizado com o operador coalescente nulo, mas não há dúvida quanto à sua finalidade e, se estiver percorrendo uma rotina maior procurando a fonte de um valor, será muito mais fácil escolher esse aqui.

Agora, contraste isso:

if (boss == null) {
    newGuy.Boss = GetDefaultBoss();
    newGuy.IsTemp = true;
    newGuy.AddTask("orientation");
} else {
    newGuy.Boss = boss;
    newGuy.IsTemp = false;
}

...com:

newGuy.Boss = boss ?? GetDefaultBoss();
newGuy.IsTemp = boss == null;
if ( boss == null ) newGuy.AddTask("orientation");

O último exemplo é novamente muito mais curto, mas agora obscurece seu objetivo, fazendo com que as tarefas acionadas pelo mesmo teste pareçam distintas. Aqui, sinto que a verbosidade do primeiro é justificada.


3
Excelente resposta! - Não se trata tanto de verbosidade quanto de propósito.
Damovisa 6/09/10

2
@ Damovisa: exatamente - o objetivo do código é a comunicação, e não há nenhuma razão geral para que isso não deva ser feito da forma mais concisa possível (mas não mais).
Shog9

1
Aprender o operador coalescente nulo levará mais de um segundo - mas se você não o conhece, deve aprender!
Casebash

2
Ah "??" seria bom em Java.

Embora o último exemplo seja mais curto em termos de código, ele está na verdade avaliando bosstrês vezes, em comparação com apenas uma vez no exemplo detalhado. Essa é apenas outra razão pela qual o código mais curto, apenas por ser mais curto, é uma má idéia. Eu acho que a concisão deve ser a segunda do objetivo principal, seja legibilidade / manutenção (para código complexo) ou desempenho (para seções críticas de loops internos, etc.). Em outras palavras, não otimizar puramente para concisão - a menos que você planeja enviar seu código através de uma conexão 1bps;)
user193130

16

Embora ambos sejam bons objetivos, sempre ficarei do lado do Legibilidade quando forçado a escolher um.

Eu argumentaria que seu exemplo melhora a legibilidade e a brevidade. Considere, no entanto:

if( a > b )
{
    foo = bar
}
else
{
    if( c.isThing() ){
        foo = somethingElse;
    }
    else{
        foo = someFurtherThing.GetFoo();
    }
}

em oposição a

foo = a > b ? bar ?? whatever.something : c.isThing() ? somethingElse : someFurtherThing.GetFoo();

O último é conciso, mas é difícil de ler. O primeiro é detalhado, mas o fluxo da lógica é claro.

Por fim, a brevidade não serve muito a um propósito, além da capacidade de se encaixar mais na tela. A legibilidade facilita a depuração e, portanto, geralmente deve ser preferida.


11
A formatação adequada pode melhorar facilmente a legibilidade do segundo exemplo. Esta é uma comparação injusta. Quando formatado assim , não tenho certeza se é tão ruim assim.
Steven Jeuris

Os exemplos de código não são equivalentes: o primeiro está ausente ?? whatever.something.
John B. Lambe

11

Eu diria que, regra geral, nunca sacrifica a legibilidade por causa da concisão, mas nunca julga a legibilidade com base na falta de conhecimento de outros programadores sobre esse assunto.

Concisão e legibilidade não são opostos. Como esta resposta, às vezes menor é mais legível.


4
+1 por não assumir a falta de conhecimento de outro programador. No exemplo dado, a segunda opção é menos legível se você não estiver familiarizado com o operador coalescente nulo. Eu nunca escreveria meu código com base na suposição de que meus colegas de trabalho não conhecem a sintaxe da linguagem. Mesmo que eles não soubessem o que ??significa, se eu usá-lo e depois aprenderem, nós dois nos beneficiamos. E não é difícil digitar "?? operator" no msdn.com
Tim Goodman

4

Eu diria que prefiro legibilidade, embora isso às vezes signifique usar código conciso. (Ou seja, ternário para condicionais relativamente simples dentro de um bloco condicional maior.)

Basicamente, se for desnecessariamente difícil de entender, não faça isso.


3

A legibilidade vem em primeiro lugar quando entra em conflito com a concisão, porque o código é modificado com mais frequência do que é inicialmente escrito. Por outro lado:

  1. O ruído sintático e o código padrão geralmente obscurecem as intenções e, portanto, prejudicam a legibilidade. Às vezes, o código mais conciso também é mais legível. Por exemplo, pense em funções lambda ou delegadas / funções de primeira classe versus classes de método único que implementam uma interface de método único.

  2. A legibilidade deve ser avaliada com base na facilidade de leitura do código para um programador razoavelmente experiente que conhece a linguagem e seus recursos exclusivos / avançados bastante bem, não para um macaco de código pouco competente que conhece apenas o menor denominador comum.


2

Um aspecto que acho que não foi mencionado ainda: quais são seus objetivos?

Se tudo o que importa é a segurança no emprego, procure concisão e compacidade em relação a todo o resto. Pule também o comentário do seu código.

Se você deseja entregar seu código facilmente a outra pessoa enquanto trabalha em um novo projeto interessante, procure legibilidade, clareza e muitos comentários sólidos.

Nota: o acima não é sobre você pessoalmente, @Damovisa; é para quem escolhe entre as duas posições.


Isso soa como uma segurança de trabalho , mas se você quiser ser um programador, é uma segurança de trabalho na empresa errada ...;)
Alois Mahdal

2

Há uma coisa que a versão detalhada tem como vantagem.

Ele tem mais linhas e a maioria dos depuradores é orientada a linhas ! É muito difícil definir um ponto de interrupção no meio de uma expressão, mas geralmente é trivialmente simples configurá-lo dentro de uma instrução de bloco.

Em outras palavras, qual você gostaria de ver em seu editor se quiser que seu depurador entre em ação boss == null?

(Disse que eu gosto do operador ?? -)


0

A legibilidade deve vir primeiro, a longo prazo, a maioria das pessoas gasta mais tempo modificando ou estendendo o código existente - a legibilidade é uma grande parte da capacidade de manutenção.

Dito isto, concisão é algo que pode contribuir para a legibilidade. Por exemplo, em sua pergunta, o segundo trecho é mais legível e conciso.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.