¿Qué tan importante es reducir la cantidad de líneas en el código?

85

Soy un desarrollador de software que trabaja en J2SE (core java).
A menudo, durante nuestras revisiones de código, se nos pide que reduzcamos la cantidad de líneas en nuestro código.

No se trata de eliminar código redundante, se trata de seguir un estilo que se enfoca en hacer las mismas cosas con menos líneas en el código, mientras que creo en tener claridad en el código incluso si eso significa aumentar el número de líneas.

¿Cuál crees que es la forma correcta de hacer las cosas?
Si LOC (líneas de código) es un número pequeño, ¿cómo afecta al código? Si LOC es un número mayor, ¿cómo afecta el código?

ejemplo del sitio web: "javaranch" -

public static void happyBirthday(int age)
{  
    if ((age == 16) || (age == 21) || ((age > 21) && (((age % 10) == 0) || ((age % 25) == 0))))        
    {
        System.out.println("Super special party, this year!");
    }
    else
    {
        System.out.println("One year older. Again.");
    }
}

VS

public static void happyBirthday(int age)
{

    boolean sweet_sixteen = (age == 16);
    boolean majority = (age == 21);
    boolean adult = (age > 21);
    boolean decade = (age % 10) == 0;
    boolean quarter = (age % 25) == 0;

    if (sweet_sixteen || majority || (adult && (decade || quarter)))
    {
        System.out.println("Super special party, this year!");
    }
    else
    {
        System.out.println("One year older. Again.");
    }
}
    
pregunta Ankit 22.10.2014 - 22:46

20 respuestas

74

El problema con las mediciones, no importa lo bien intencionadas que sean, es el hecho de medir el elemento lo hace importante, y el corolario, el hecho de no medir un elemento lo hace poco importante. Es absolutamente esencial medir lo que es importante y no medir lo que no es importante.

La medición de SLOC (que es lo que efectivamente hacen tus revisiones), hace que SLOC sea importante ... ¿Es importante SLOC? - Absolutamente no, nunca lo he estado (Fuera de Concursos de programación ofuscados ), nunca estará en una organización comercial.

Hágase una pregunta simple: ¿de qué manera "Reducir el SLOC de esta rutina" hace que el código de cualquiera sea mejor? Lo que probablemente está sucediendo en este caso es que SLOC se está utilizando como una forma ingenua de medir la complejidad. Lo que debe evitar a toda costa es contar los frijoles fáciles de contar: medidas objetivas como SLOC, en lugar de contar las importantes, pero difíciles de contar, por ejemplo. Facilidad de lectura, complejidad, etc.

    
respondido por el mattnz 13.04.2017 - 14:38
83

Estoy de acuerdo con los revisores de tu código, pero con un asterisco. Cada declaración que escriba en su código es una responsabilidad técnica, es un posible punto de falla. Si escribe un método con 10 declaraciones y su compañero de trabajo escribe una que logre la misma funcionalidad con 5 declaraciones, es probable que su 'mejor' se mida por la probabilidad de problemas (hay el doble de lugares en los que su código puede estar equivocado, excesivamente complejo, o problemático).

Aquí está el asterisco, sin embargo. No se trata del número real de líneas de código en la idea porque puede reducir el número de líneas con algo como:

void someMethod() {   
 someobject.doSomething(someSingleton.getInstance().with().a().lot().of().law().of().demeter().violations()).and().if().that().werent().enough().theres().more();
}

Esta es una línea de código, pero es un lugar donde una gran cantidad de cosas pueden salir mal. Por lo tanto, diría que se centre en hacer lo máximo posible con la menor cantidad de declaraciones: escriba todo el código que necesite para hacer las cosas y no más. Al menos, creo que eso es a lo que se dirigen los revisores de su código.

Personalmente, creo que hay un equilibrio que debe alcanzarse. Como dije, cada declaración que escriba es una responsabilidad, pero si sacar una variable local con un nombre descriptivo hace que su método sea mucho más claro y más legible, entonces también hay un caso para eso. Creo que puedes entrar fácilmente en situaciones en las que las personas discuten sobre diferencias estéticas relativamente menores, pero en general, creo que tus críticos tienen la idea correcta: favorecen la reducción de la cantidad de cosas que pueden salir mal.

    
respondido por el Erik Dietrich 05.04.2013 - 22:02
32

Tomar el consejo de los revisores, literalmente, no servirá de nada, porque el resultado directo obvio es la promoción de líneas cortas concisas (a pesar del límite de longitud de la línea). Sin embargo, creo que la lección que se debe aprender aquí es hacer que su código haga menos cosas .

En otras palabras, esto es un llamado a la simplicidad. Es bastante popular la afirmación de que el código es un pasivo, no un activo , por lo que reducir su cantidad y preservar la funcionalidad es un esfuerzo noble. Esto se puede lograr mediante un enfoque directo y más realista que resuelva el problema directamente y prefiera soluciones concisas.

Como dijo una vez Ken Thompson: Uno de mis días más productivos fue tirar 1000 líneas de código .

    
respondido por el Xion 05.04.2013 - 22:03
21

Tiendo a estar de acuerdo con tu posición de "tener claridad en el código, incluso si eso significa aumentar el número de líneas".

He visto demasiadas frases simples que son bastante concisas, pero no es evidente de inmediato lo que están haciendo. La legibilidad es la clave, ya que otros desarrolladores deberán mantener su código.

Yo diría que una cosa mejor para apuntar es métodos cortos. No es corto por el bien de unas pocas líneas de código, pero es corto porque hacen una sola cosa.

    
respondido por el jhewlett 05.02.2013 - 07:36
12

Actualmente trabajo como desarrollador senior de aplicaciones y analista de proyectos de negocios para una empresa importante y nunca ha sido el centro de interés el recuento de líneas de mi desarrollo. Sin embargo, creo que cuanto más condensado pueda ser un código, mejor, PERO no al costo de poder analizarlo rápidamente y corregirlo (o agregarlo). Para mí, cuando usted está a cargo de una aplicación crítica para el negocio que DEBE tener un gran nivel de escalabilidad y capaz de realizar alteraciones sobre la marcha en un entorno sin cambios, el código conciso y fácil de leer es uno de los elementos más importantes en el desarrollo. . Para crédito de respuesta de Erik Dietrich , esto:

void someMethod() {   
someobject.doSomething(someSingleton.getInstance().with().a().lot().of().law().of().demeter().violations()).and().if().that().werent().enough().theres().more();
}

sería completamente inaceptable para mí, sin embargo, encontré que altera el código existente de todas las compañías desde:

if (boolean == true){
value.prop = option1;
}
else{
value.prop = option2;
}

a:

value.prop =  boolean ? option1 : option2;

fue una excelente opción de condensación de código que no sacrifica la legibilidad.

¿En cuanto a cómo afecta el código? Nunca he notado un aumento o disminución en el rendimiento de, digamos, 100 líneas de código. El hecho simple es que es más el proceso que utiliza para llegar al producto final que la cantidad de líneas que se requieren para llegar allí. He visto algunos procesos escritos muy condensados, aunque ineficientes, funcionan de manera diferente a los códigos más largos con un mejor flujo de código.

    
respondido por el Joshua Volearix 12.04.2017 - 09:31
9

OMI, es una mala idea medir la efectividad del código mediante un conteo LOC trivial. Hay mucho más en lo que hace un código adecuadamente diseñado y efectivo.

En mi experiencia, código efectivo:

  • no rompe ninguno de los principios SOLID
  • es legible y se explica por sí mismo
  • pasa la prueba de simplicidad de Albert Einstein: "Todo debería ser lo más simple posible, pero no más simple".
respondido por el Dino Octavian 06.01.2016 - 10:42
6

Aquí hay muchas respuestas que abordan los pros y los contras técnicos de mantener el LOC bajo y si es o no una métrica de software de calidad significativa. De eso no se trata esta pregunta. De lo que se trata es cómo lidiar con la administración que insiste en una ingenua adhesión dogmática a una regla general de codificación en particular.

Lamentablemente, es bastante común que las personas se adhieran a cosas que son un buen consejo cuando se usan en el contexto adecuado y se aplican de manera pragmática, las sacan de ese contexto y las aplican dogmáticamente mientras no aprecian los problemas que existen para mitigarlos. El primer lugar.

La intención de los consejos con respecto a mantener el LOC bajo es evitar la creación de métodos que intentan hacer demasiado de una sola vez, y desalentar la creación de "clases de dios", que saben demasiado sobre aspectos de un diseño que no están No es su responsabilidad directa y de la que dependen todas las demás clases en el sistema. Otra ventaja del código más corto es que es más legible, aunque, como lo has señalado, puedes exagerar hasta el punto en que la legibilidad realmente comienza a sufrir.

Los recuentos LOC bajos presentan ventajas obvias (los métodos pequeños encajan en su cabeza más fácilmente que los grandes, menos cosas en el código significan que hay menos cosas que salen mal, etc.), pero también están sujetos a la ley de rendimientos decrecientes . Refactorizar un método de 150 líneas en un número de métodos de 20 líneas es una ganancia mucho más grande que refactorizar un método de 10 líneas en un método de 7 líneas.

Cuando dicha refactorización se produce a expensas de alguna otra faceta del buen diseño del software (como la legibilidad), ha llegado a un punto en el que puede justificar que no lo haga. Eliminar las variables que dan contexto a lo que significa el código y reemplazarlos con literales que no lo hacen es algo muy malo. El buen código casi no tiene literales. Sin embargo, estas variables (y las constantes nombradas) son líneas de código que no contribuyen directamente al programa y, por lo tanto, si LOC se está adorando como una especie de dios, dichas líneas de clarificación están en gran peligro de ser eliminadas para una victoria rápida. Algunos elogios equivocados de la gestión.

Creo que eres lo suficientemente inteligente como para darte cuenta de esto, de hecho, esa es la orientación de tu pregunta original. El problema no es su comprensión de cuándo la reducción del código es buena y cuando no lo es, el problema es el dogmatismo en la aplicación de lo que normalmente es una práctica razonable indiscriminadamente.

Recomendaría tomarse el tiempo para conversar con su gerencia, explicando su posición y por qué cree que lo que se le pide que haga dañe el código en lugar de ayudarlo. Trate de evitar la confrontación, pero trate de mantenerse racional y calmado durante tal discusión. Es importante que su gerencia entienda que la programación es una actividad pragmática, y los consejos de mejores prácticas solo son útiles si se aplican de manera pragmática. La mejor práctica está escrita en un libro, no está tallada en piedra, y cuando entra en conflicto (código corto versus código legible), entonces depende del programador aplicar su criterio en cuanto a qué mejor práctica seguir. Esperemos que sean personas razonables que aprecian comentarios como este.

También debe ser un poco valiente, porque si se le presiona para que reduzca la LOC cuando crea que es innecesario o inapropiado, entonces es natural que haga el cambio de todos modos por una vida tranquila. Tienes que resistirte a hacer esto, y tienes que "apropiarte" de esa decisión. En una situación en la que la administración es razonable, no debería tener que cumplir exactamente con sus directrices, pero debería poder justificar cualquier circunstancia en la que no lo haga.

Lamentablemente, las personas pueden ser irracionales, especialmente cuando se trata de personas más bajas en el orden jerárquico que cuestionan sus decisiones y las reglas que te han impuesto. Pueden elegir no ser razonables. Necesitas estar preparado para eso también. Si puede demostrar los casos en que la mejor práctica de LOC entra en conflicto directo con otras mejores prácticas y por qué está dañando el producto, y si puede hacerlo en partes del código base para el cual tuvieron poca o ninguna participación personal (por lo que no No parezca un ataque personal a su trabajo o el trabajo que supervisaron, entonces esto puede ayudar a reforzar su argumento. Una vez más, debes estar preparado para justificarte de manera calmada y racional y ser capaz de "poseer" los argumentos que estás formulando.

Siempre que su administración sea una persona razonable, deben apreciar que lo que usted dice tiene mérito si puede proporcionar evidencia para respaldar sus reclamaciones.

    
respondido por el GordonM 07.04.2013 - 09:29
2

Creo que deberías esforzarte por tener funciones con una pequeña cantidad de SLOC.

  

Si LOC (líneas de código) es un número pequeño, ¿cómo afecta al código y si LOC es un número mayor, cómo afecta el código?

Idealmente, debería ser más fácil comprender 8 líneas de código de un vistazo que comprender 30.

Eso no significa que 30 LOC comprimidos en 8 líneas serán más fáciles de entender.

  

¿Cuál crees que es la forma correcta de hacer las cosas?

Normalmente, en una función, trato de agruparla por niveles de abstracción ("Código IO aquí", "validación aquí", "cálculo aquí", etc.).

Luego, lo dividí en bloques, separados por una línea en blanco. Si el código tiene más de alrededor de diez líneas, extraigo cada bloque en una función diferente (lo hago de todos modos para el código que aparece más de una vez). He escuchado un argumento acerca de romper el rendimiento de esta manera (llamadas a funciones innecesarias) pero en la práctica nunca he tenido un cuello de botella en el rendimiento causado por esto.

Dicho esto, he tenido funciones con esta extracción realizada, y después de eso, la función tenía ~ 40 líneas de largo (código C). Si el código está lo más agrupado posible, no veo un problema con las funciones más largas.

    
respondido por el utnapistim 05.02.2013 - 12:12
2

Creo que es más importante centrarse en el código limpio y autodocumentado, que en LOC. Sin embargo, no me gusta mucho tu ejemplo, porque explica lo que está haciendo el código, sin decir por qué. Por ejemplo, esto:

boolean sweet_sixteen = (age == 16);

es bastante redundante. Cualquiera que lea "age == 16" sabe eso. Preferiría escribir el código así:

public static boolean companyShouldThrowABigParty(int age) {
    return (age == 16) || (age == 21) || ((age > 21) && (((age % 10) == 0) || ((age % 25) == 0))); 
}

public static void happyBirthday(int age)
{  
    System.out.println(companyShouldThrowABigParty(age) ? "Super special party, this year!" : "One year older. Again.");
}

La lógica sobre decidir cuándo organizar la fiesta es independiente de System.out, se puede probar y es fácil de entender. Sin embargo, lo más importante es que alguien que lee el código puede entender la razón por la que se escribió de esa manera ("la compañía quiere organizar una gran fiesta para algunas de las personas").

    
respondido por el Eduardo Scoz 06.01.2016 - 12:23
1

No creo que haya menos líneas de código == código más legible. Sin embargo, la realidad, que es muy diferente de la teoría, es que el código con un gran número de líneas a menudo se escribe sin un diseño adecuado. En consecuencia, el requisito de menos líneas PUEDE forzar a algunos programadores a diseñar un mejor diseño si son capaces. El problema es que muchos programadores no lo son, entonces el requisito no ayuda mucho.

    
respondido por el zhouji 05.02.2013 - 19:19
1

No vería el número de líneas como un problema en circunstancias normales, pero puede señalar problemas. Si alguien te muestra una clase con 1000 líneas de código, entonces algo debe estar mal con la forma en que se realizó o diseñó la clase.

Su ejemplo apunta a un caso donde tiene sentido un mayor número de líneas de código. Pero ese es ese ejemplo. Todos los días veo ejemplos en los que el número de líneas se adjunta a la falta de planificación

    
respondido por el IvoC 06.02.2013 - 20:21
1

Creo que menos líneas de código = código más legible

Pero, por supuesto, hay un cierto límite, cuando comienzas a minimizar / ocultar tu código solo para obtener menos líneas.

/** Pad a number with 0 on the left */
function zeroPad(number, digits) {
    var num = number+"";
    while(num.length < digits){
        num='0'+num;
    }
    return num;
}

Esto es una minificación, la lógica sigue siendo la misma, pero menos legible. Esto no debe ser hecho por humanos, esta minificación es hecha por una máquina para ser leída por una máquina.

function zP(e,t){var n=e+"";while(n.length<t){n="0"+n}return n}

Si puedes eliminar algún fragmento de código y el algoritmo sigue haciendo lo que se supone que debe hacer, está bien, adelante. Simplemente no minimice su código, hay mejores herramientas para hacerlo.

    
respondido por el Vitim.us 05.02.2013 - 15:54
0

LOC es una métrica más útil al principio de un proyecto que durante la implementación real, creo. Conociendo la LOC por punto de función le permite estimar el esfuerzo del proyecto, y de ahí cuánto tiempo tomará el proyecto y el número óptimo de desarrolladores.

También puede influir en el diseño y la elección del idioma: reducir los puntos de función o cambiar a un idioma con un LOC / FP más bajo debería reducir el esfuerzo del proyecto, todo lo demás es igual.

    
respondido por el James Jensen 07.04.2013 - 05:02
0

Las líneas de código en sí mismas no son muy importantes. Una forma de verlo es compararlo con la prosa. La primera conclusión es que una propiedad importante tanto del código como de la prosa (suponiendo que sea correcta) es la legibilidad. La legibilidad (y la comprensibilidad) ayudan con otras propiedades como la mantenibilidad y la corrección.

Hay ventajas en poder ajustar una función en un pequeño número de líneas. Pero tener texto sin párrafos reduce su legibilidad. El uso de conceptos difíciles, palabras difíciles (raras) y formas de expresión complejas generalmente reduce la cantidad de palabras necesarias para expresar una idea, pero al mismo tiempo mueve el nivel de lectura del texto desde el nivel de secundaria hasta los académicos profesionales (en el caso de prosa).

En general, es útil agregar abstracciones en su código y usar ayudantes, etc. pero, nuevamente, esas abstracciones pueden llegar a ser demasiado numerosas. Lo que también puede suceder es que mueva la complejidad a otra parte del código. A veces, como cuando usted como experto está diseñando un marco / biblioteca para ser usado por programadores junior (o estudiantes), es una buena idea hacer esto. Pero no esperes que los juniors sean capaces de dar sentido a cómo funciona tu código, solo haz que sea muy difícil para ellos usarlo incorrectamente.

Al escribir código, sobre todo, no evite agregar líneas vacías en su código. Funcionan como párrafos y lo ayudan a separar diferentes partes de su función (incluso si aún no deberían incluirse en ayudantes).

    
respondido por el Paul de Vrieze 07.04.2013 - 19:51
-1

El gran problema con cada método formal de evaluación de código es que seguramente fallará en algún código. Esto se debe a que la programación es un tipo de arte y, como tal, no pueden existir estándares claros para la evaluación. Por supuesto, hay diferentes tipos de artes: también existe la producción en masa de pinturas, y tal vez en este negocio es importante la cantidad de pintura que se gasta en una pintura. :)

    
respondido por el johnfound 05.02.2013 - 08:55
-1

Para ser perfectamente honesto, no me importa la medida de LOC. Claro, es bueno que una función o un procedimiento sea lo más corto posible, pero tomo el código legible en cualquier momento del día.

    
respondido por el Vladimir Kocjancic 22.10.2014 - 23:44
-2

Estoy de acuerdo en que siempre requerir una reducción de LOC daría lugar a un código difícil de leer.

Sin embargo, tal vez su estilo de codificación sea demasiado detallado y su revisor considere que una forma más concisa es mejor. Por ejemplo, un comentario que solo explica una afirmación que es bastante obvia gracias a la clara elección de los nombres de variables es inútil.

    
respondido por el MatthieuW 05.02.2013 - 11:49
-2

Solo hay una cosa que miden las líneas de código y esa es la cantidad de líneas de código que tienes. Todo lo demás es aire caliente, especulación y prejuicio.

En las otras respuestas hay muchos ejemplos excelentes de cómo tener menos líneas de código puede empeorar algo, no mejorar, pero parece haberse perdido un punto central, y eso es: ¿cuántas líneas realmente ¿Necesitas hacer este trabajo?

Si realizar su tarea necesita 10 líneas de código, que así sea, hágalo en 10 líneas. Si lograrlo requiere 10,000 líneas, entonces, así sea, lo haces en 10,000 líneas. El culto de "menos líneas de código" no hará que el último ejemplo sea mejor si lo haces en 1,000 o 2,000 o lo que sea. El trabajo necesitaba 10,000 líneas y esas 10,000 líneas pueden incluir capas de validación, verificación de errores, seguridad, etc. que se perderían si lo hiciera en menos.

Editar

Debido a que esto ha generado algunos votos negativos, creo que necesito ser más específico sobre lo que estoy diciendo aquí. Lo primero que alguien debe hacer es leer this - el punto que le estoy pidiendo que retire es que el código de alto nivel que escribe puede tener poca o ninguna semejanza con el código de la máquina que realmente se ejecuta. La relevancia de este punto es que el enfoque en el código de alto nivel sin una comprensión de lo que realmente sucede debajo es erróneo.

Ahora considera lo siguiente:

  • Es posible escribir código realmente malo y lento con una sola línea. Observe el comentario del operador ternario al final del enlace que proporcioné.

  • Si una línea de código realiza una llamada a la API (u otra llamada a una biblioteca externa), por definición, tiene poco control directo sobre lo que se ejecuta o qué tan eficiente es.

  • La comprobación de errores, la limpieza, etc. agregan líneas de código adicionales y estoy bastante seguro de que ni el fanático más ardiente de menos líneas de código se opondría a esas .

Entonces, las líneas de código son una métrica rota. Menos líneas de código no garantizan un rendimiento adicional, ya que la API o la llamada a la biblioteca es una línea y puede estar fuera de su control. Una menor cantidad de líneas de código no garantiza una robustez adicional: la verificación de errores y la limpieza siempre requerirán líneas adicionales. Menos líneas de código ni siquiera garantizan una mayor legibilidad o facilidad de mantenimiento; solo necesita consultar IOCCC para saberlo.

Entonces, ¿qué garantizan menos líneas de código? Menos líneas de código, eso es todo.

Es profundamente erróneo centrarse en hacer el mismo trabajo en 2,000 líneas en lugar de en 10,000. En su lugar, concéntrese en el código que funciona, que es robusto, que funciona dentro de las tolerancias aceptadas y que es más fácil de leer y mantener en el futuro. A veces eso significa que puedes hacerlo en un conteo bajo de LoC, a veces significa que tienes que hacerlo en un conteo más alto de LoC, pero el conteo de LoC no debería ser lo que es importante aquí.

    
respondido por el mh01 11.06.2013 - 21:45
-3

¿Qué tan importante es reducir la cantidad de líneas en el código? En la mayoría de los casos, en absoluto. De hecho, en la mayoría de los casos, es más importante aumentar el número de líneas de código dividiendo las operaciones complejas en pasos más legibles, y comentando cada paso, así como agregando comentarios en general para hacer que el código sea más legible y extensible por otros desarrolladores que vienen después de ti.

    
respondido por el Infin8Loop 05.02.2013 - 22:52
-5

En un período anterior, se asumió que si el número de líneas de código que es loc es grande, entonces el código es efectivo y cumple todas las tareas para las que está acostumbrado, pero después de un tiempo se realizó que menos es la loc más tiene la eficiencia, ya que el costo en que incurre el sistema para ejecutar el código es muy inferior. Por lo tanto, la mejora de la localización del sistema fue menor. Desde entonces, se asumió que la localización debería ser menor. Para reducirla los siguientes factores deben tenerse en cuenta.

  1. Haz un diagrama de flujo de tu problema
  2. Intenta utilizar una cantidad menor de bucles como puedas
  3. Las llamadas a la función no deberían ser mucho
  4. Se deben usar nuevas estructuras de datos, como TRIE, en el caso de que se use la pila o la cola para almacenar la información relevante.
  5. Y trate de resolver el problema con un enfoque realista en lugar de uno imaginativo en el que está almacenando una gran cantidad de números en una matriz muy grande y luego intenta acceder a ella a través de la matriz.]
  6. Usa tantas macros como sea posible Además, el enfoque a utilizar también depende del problema. Si es realmente complejo, a veces, utilizar el enfoque simple también es equivalente al complejo.
respondido por el Vibhu Tiwari 02.06.2013 - 03:34

Lea otras preguntas en las etiquetas