¿Prefieres concisión o legibilidad en tu código? [cerrado]

21

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ía#:

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 trazas la línea cuando se trata de concisión versus legibilidad?

Damovisa
fuente
3
Esta es una pregunta subjetiva, alguien que implementó algo diría que tiene sentido, alguien que lo lea dirá que no tiene sentido y otra persona que lo lea dirá que lo entiendo, pero prefiero otra forma. Esto es meramente preferencia.
Chris
20
Creo que la segunda versión es más legible.
Vaibhav
2
Estás confundiendo concisión con brevedad. La concisión mejora la legibilidad. La terquedad le resta valor.
Ferruccio
1
@ ThorbjørnRavnAndersen: La audiencia para el código C # suele ser "desarrolladores con un fondo C #". Por lo que he visto, el consenso aquí en programmers.se parece ser que no debes evitar usar funciones de lenguaje útiles solo porque alguien no esté familiarizado con ellas. (Véase también: programmers.stackexchange.com/q/101513/33843. )
Heinzi el
1
duplicado ?: programmers.stackexchange.com/q/58630/15464 .. Oh, este es más antiguo. :)
Steven Jeuris

Respuestas:

63

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, enfatiza su propósito: asignar 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 buscando 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 nuevamente 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.

Shog9
fuente
3
Excelente respuesta! - No se trata tanto de verbosidad como de propósito.
Damovisa
2
@Damovisa: exactamente, el objetivo del código es la comunicación, y no hay una razón general por la que esto no deba hacerse de la manera más concisa posible (pero no más).
Shog9
1
Aprender el operador de fusión nula tomará más de un segundo, pero si no lo sabe, ¡debería aprenderlo!
Casebash
2
Ah "??" Sería bueno en Java.
Aunque el último ejemplo es más corto en términos de código, en realidad está evaluando boss3 veces en lugar de solo una vez en el ejemplo detallado. Esta es solo otra razón por la cual un código más corto solo por ser más corto es una mala idea. Creo que la concisión debe ser el segundo objetivo principal, ya sea legibilidad / mantenibilidad (para código complejo) o rendimiento (para secciones críticas de bucles internos, etc.). En otras palabras, nunca optimice únicamente por concisión, a menos que planee enviar su código a través de una conexión de 1bps;)
usuario193130
16

Si bien ambos son buenos objetivos, siempre apoyaré la legibilidad cuando me vean 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 clara.

En definitiva, la brevedad no sirve para un gran propósito, aparte de la capacidad de caber más en la pantalla. La legibilidad facilita la depuración, por lo que generalmente debería preferirse.

Fishtoaster
fuente
11
El formateo adecuado podría mejorar fácilmente la legibilidad del segundo ejemplo. Esta es una comparación injusta. Cuando se formatea así , no estoy seguro de que sea tan malo.
Steven Jeuris
Los ejemplos de código no son equivalentes: falta el primero ?? whatever.something.
John B. Lambe
11

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

La concisión y la legibilidad no son opuestos. Al igual que esta respuesta, a veces más corto es más legible.

Brian R. Bondy
fuente
44
+1 por no asumir la falta de conocimiento de otro programador. En el ejemplo dado, la segunda opción es menos legible si no está familiarizado con el operador de fusión nula. Nunca escribiría mi código basado en el supuesto de que mis compañeros de trabajo no conocen la sintaxis del idioma. Incluso si no supieran qué ??significa, si lo uso y luego lo aprenden, ambos nos hemos beneficiado. Y no es difícil escribir "operador" en msdn.com
Tim Goodman
4

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

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

George Marian
fuente
3

La legibilidad viene primero donde 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 versus 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 es leer el código para un programador con experiencia razonable que conoce 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.

dsimcha
fuente
2

Un aspecto que no creo que se haya mencionado todavía: ¿cuáles son sus objetivos?

Si lo único que le importa es la seguridad laboral, busque concisión y compacidad sobre 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 genial, 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.

Dori
fuente
Eso suena como una seguridad laboral, pero si quieres ser un programador, es una seguridad laboral en la empresa equivocada ...;)
Alois Mahdal
2

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

Tiene más líneas, y la mayoría de los depuradores están 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 instrucció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 ??)


fuente
0

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

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.

FinnNk
fuente