it-swarm-es.com

¿Prefieres la concisión o la legibilidad en tu código?

Los atajos de idioma a menudo se pueden usar para hacer que el código sea más conciso.

Por ejemplo, los operadores de fusión ternarios y nulos pueden reducir la cantidad de código, pero posiblemente en detrimento de la legibilidad:

C ª#:

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

es funcionalmente equivalente a:

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

pero obviamente mucho más detallado.

¿Dónde traza la línea cuando se trata de concisión vs legibilidad?

21
Damovisa

Ambos.

Su primer ejemplo es ciertamente más detallado y posiblemente más explícito ... pero también requiere que escanee cinco líneas en lugar de una. Peor aún, resta importancia a su propósito, asignando un valor a newGuy.Boss.

Su segundo ejemplo puede costarme un segundo si no estoy familiarizado con el operador de fusión nula, pero no puede haber ninguna duda sobre su propósito, y si estoy escaneando una rutina más grande en busca de la fuente de un valor, lo hará. será mucho más fácil para mí elegir este.

Ahora, contrasta esto:

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

...con:

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

El último ejemplo es de nuevo mucho más corto, pero ahora oscurece su propósito al hacer que las tareas desencadenadas por la misma prueba parezcan distintas. Aquí, siento que la verbosidad del primero está justificada.

63
Shog9

Si bien ambos son buenos objetivos, siempre estaré del lado de Legibilidad cuando me vea obligado a elegir uno.

Yo diría que su ejemplo mejora tanto la legibilidad como la brevedad . Considere, sin embargo:

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

opuesto a

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

Este último es conciso, pero es difícil de leer. El primero es detallado, pero el flujo de la lógica es claro.

En última instancia, la brevedad no sirve para mucho más que la capacidad de encajar más en la pantalla. La legibilidad facilita la depuración y, por tanto, debería preferirse.

16
Fishtoaster

Yo diría que, como regla general, nunca sacrifique la legibilidad debido a la concisión, pero nunca juzgue la legibilidad basándose en la falta de conocimiento de otros programadores sobre ese tema.

La concisión y la legibilidad no son opuestos. Como esta respuesta, a veces más corta es más legible.

11
Brian R. Bondy

Yo diría que prefiero la legibilidad, aunque eso a veces significa usar un código conciso. (Es decir, ternario para condicionales relativamente simples dentro de un bloque condicional más grande).

Básicamente, si es innecesariamente difícil de entender, no lo haga.

4
George Marian

La legibilidad es lo primero cuando entra en conflicto con la concisión, porque el código se modifica con más frecuencia de lo que se escribe inicialmente. Por otra parte:

  1. El ruido sintáctico y el código repetitivo a menudo oscurecen las intenciones y, por lo tanto, perjudican la legibilidad. A veces, el código más conciso también es más legible. Por ejemplo, piense en funciones lambda o delegados/funciones de primera clase frente a clases de método único que implementan una interfaz de método único.

  2. La legibilidad debe evaluarse en función de lo fácil que sea leer el código para un programador con experiencia razonable que conozca el lenguaje y sus características únicas/avanzadas bastante bien, no un mono de código apenas competente que solo conoce el mínimo común denominador.

3
dsimcha

Un aspecto que no creo que haya sido mencionado todavía: ¿cuáles son tus metas?

Si lo único que le importa es la seguridad laboral, opte por la concisión y la compacidad por encima de todo lo demás. Omita también comentar su código.

Si desea poder entregar fácilmente su código a otra persona mientras trabaja en un nuevo proyecto interesante, busque legibilidad, claridad y muchos comentarios sólidos.

Nota: lo anterior no se trata de usted personalmente, @Damovisa; es para cualquiera que elija entre las dos posiciones.

2
Dori

Hay una cosa que la versión detallada tiene una ventaja.

Tiene más líneas, y la mayoría de los depuradores son orientados a líneas! Es muy difícil establecer un punto de interrupción en el medio de una expresión, pero generalmente es trivialmente simple establecerlo dentro de una declaración de bloque.

En otras palabras, ¿cuál le gustaría ver en su editor si desea que su depurador se active cuando boss == null?

(Dicho esto, me gusta el operador ?? -)

2
user1249

La legibilidad debe ser lo primero, a largo plazo, la mayoría de las personas pasan la mayor parte del tiempo modificando o ampliando el código existente; la legibilidad es una parte importante de la capacidad de mantenimiento.

Dicho esto, la concisión es algo que puede contribuir a la legibilidad. Por ejemplo, en su pregunta, el segundo fragmento es más legible y más conciso.

0
FinnNk