ti-enxame.com

Você prefere concisão ou legibilidade em seu código?

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

Por exemplo, operadores de coalescência ternários e nulos podem reduzir a quantidade de código, mas possivelmente 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 prolixo.

Onde você traça o limite quando se trata de concisão vs. legibilidade?

21
Damovisa

Ambos.

Seu primeiro exemplo é certamente mais prolixo e indiscutivelmente mais explícito ... mas também requer que eu escaneie cinco linhas em vez de uma. Pior, ele não enfatiza seu propósito - atribuir um valor a newGuy.Boss.

Seu segundo exemplo pode me custar um segundo se eu não estiver familiarizado com o operador de coalescência nula, mas não pode haver dúvida quanto ao seu propósito, e se eu estiver fazendo uma varredura em uma rotina maior procurando a origem de um valor, será muito mais fácil para mim escolher este.

Agora, compare 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 ele obscurece seu propósito ao fazer as tarefas disparadas pelo mesmo teste parecerem distintas. Aqui, sinto que a verbosidade da primeira se justifica.

63
Shog9

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

Eu diria que seu exemplo melhora a legibilidade e a brevidade. Considere, entretanto:

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();

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

Em última análise, a brevidade não tem grande utilidade, a não ser a capacidade de caber mais na tela. A legibilidade facilita a depuração e, portanto, geralmente deve ser preferida.

16
Fishtoaster

Eu diria que, como regra geral, nunca sacrifique a legibilidade por causa da concisão, mas nunca julgue a legibilidade com base na falta de conhecimento de outro programador sobre o assunto.

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

11
Brian R. Bondy

Eu diria que prefiro a legibilidade, embora isso às vezes signifique usar um 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 o faça.

4
George Marian

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

  1. O ruído sintático e o código clichê muitas vezes 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 delegados/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 razoavelmente bem, e não um macaquinho de código pouco competente que conhece apenas o mínimo denominador comum.

3
dsimcha

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

Se você só se preocupa com a segurança no emprego, opte pela concisão e compacidade acima de tudo. Ignore os comentários do seu código também.

Se você deseja ser capaz de passar seu código facilmente para outra pessoa enquanto trabalha em um novo projeto legal, opte pela legibilidade, clareza e muitos comentários sólidos.

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

2
Dori

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

Possui mais linhas, e a maioria dos depuradores são orientados por linha! É muito difícil definir um ponto de interrupção no meio de uma expressão, mas geralmente é trivialmente simples defini-lo dentro de uma instrução de bloco.

Em outras palavras, qual você gostaria de ver em seu editor se quiser que seu depurador inicie quando boss == null?

(Dito isto, eu gosto da operadora ?? -)

2
user1249

A legibilidade deve vir em primeiro lugar, a longo prazo a maioria das pessoas passa a maior parte do tempo modificando ou estendendo o código existente - a legibilidade é uma grande parte da manutenção.

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

0
FinnNk