¿En qué punto / rango es un archivo de código demasiado grande?

36

Estoy encontrando muchos archivos de línea 2-3k, y realmente no parece que deberían ser tan grandes.

¿Cuál es un buen criterio para llamar objetivamente a un archivo de código fuente "demasiado grande" ?, ¿existe una cantidad máxima de líneas que debería tener un archivo de código fuente?

dukeofgaming
fuente
Su compañero le dice después de revisar el código. "No puede determinar esto usted mismo porque sabe más como autor que lo que el código dice por sí mismo. Una computadora no puede decirle, por las mismas razones que no puede decir si una pintura es arte o no. Por lo tanto, necesita otro humano capaz de mantener el software - para ver lo que ha escrito y dar su opinión ... "
mosquito
Algunos compiladores solían tener límites extraños en el tamaño del código fuente: longitud máxima de la línea o número máximo de líneas. Cuando el compilador se queja, este es un indicador objetivo de que el código es demasiado grande (o que es hora de actualizar).
Mouviciel
2
Dividir tanto como sea posible, pero sin romper la integridad de los archivos. Cada archivo (o par de archivos de encabezado / fuente) siempre debe ser un todo redondeado, independiente de la implementación interna de otros archivos. Si esto significa que algunos archivos serán grandes porque implementan algo complejo, que así sea.
Ambroz Bizjak
Tenga en cuenta que la complejidad no se trata solo de números, sino también de estructura. Por ejemplo, me gustaría decir que el zen de Python "plano es mejor que anidado": una lista plana de 100 casos es más simple que una jerarquía (no recordará los 100 casos pero recordará fácilmente que hay 100 alternativas) . Y una jerarquía "regular" donde las ramas tienen la misma estructura que sus hermanos son más simples que la jerarquía con subestructura irregular.
Juh_
"¿Es ese el código fuente?" "No, ese es el archivo MAKE, el código fuente está en los camiones que siguen detrás".
mckenzm

Respuestas:

26

Como modelo ideal, utilizo los siguientes criterios (con una lógica similar a la que sugirió Martin Beckett, es decir, pensar en términos de estructura lógica y no en términos de líneas de código):

Regla 1

Una clase por archivo (en C ++: una clase -> un encabezado y un archivo de implementación).

Regla 2

Siete se considera la cantidad de elementos que nuestro cerebro puede observar al mismo tiempo sin confundirse. Por encima de 7 nos resulta difícil mantener una visión general de lo que vemos. Por lo tanto: cada clase no debe tener más de 7-10 métodos. Una clase que tiene más de 10 métodos es probablemente demasiado compleja y debería intentar dividirla. La división es un método muy efectivo porque cada vez que divide una clase, reduce la complejidad de cada clase individual al menos en un factor de 2.

Regla 3

Un cuerpo de método que no cabe en una o dos pantallas es demasiado grande (supongo que una ventana de pantalla / editor tiene aproximadamente 50 líneas). Idealmente, puede ver todo el método en una ventana. Si este no es el caso, solo necesita desplazarse hacia arriba y hacia abajo un poco, sin olvidar la parte del método que se oculta. Por lo tanto, si tiene que desplazarse más de una pantalla hacia arriba o hacia abajo para leer todo el cuerpo del método, su método probablemente sea demasiado grande y puede perder fácilmente la descripción general.

Una vez más, dividir los métodos utilizando métodos de ayuda privados puede reducir la complejidad del método muy rápidamente (en cada división, la complejidad se reduce al menos a la mitad). Si introduce demasiados métodos de ayuda privada, puede considerar crear una clase separada para recopilarlos (si tiene más métodos privados que públicos, tal vez se oculte una segunda clase dentro de su clase principal).

Reuniendo estas estimaciones muy aproximadas:

  • Como máximo una clase por archivo fuente.
  • Como máximo 10 métodos públicos por clase.
  • Como máximo 10 métodos privados por clase.
  • Como máximo 100 líneas por método.

Por lo tanto, un archivo de origen que tiene más de 2000 líneas es probablemente demasiado grande y comienza a ser demasiado desordenado.

Esta es realmente una estimación muy aproximada y no sigo estos criterios sistemáticamente (especialmente porque no siempre hay tiempo suficiente para realizar una refactorización adecuada). Además, como sugirió Martin Beckett, hay situaciones en las que una clase es una gran colección de métodos y no tiene sentido dividirlos de manera artificial solo para hacer que la clase sea más pequeña.

De todos modos, en mi experiencia, un archivo comienza a volverse ilegible cuando no se respeta uno de los parámetros anteriores (por ejemplo, un cuerpo de método de 300 líneas que abarca seis pantallas o un archivo fuente con 5000 líneas de código).

Giorgio
fuente
1
También me gustaría luchar por métodos no más de 10 líneas ... ayuda con la lectura / comprensión de lo que está haciendo el método y reduce la complejidad que puede ocurrir fácilmente en los métodos de grandes ...
Zack Macomber
44
La regla 2 es absurda si la sigue hasta su conclusión. No debe tener más de 7 archivos en un directorio, por lo que debe mantener sus archivos grandes para que no se confunda entre las decenas o cientos de archivos en su proyecto. Del mismo modo, una estructura de directorio profundamente anidada es demasiado confusa, por lo que es mejor mantener algunos archivos grandes en un directorio que dispersar todo.
hasen
1
Lamento que esta respuesta se base en métricas totalmente arbitrarias. Los "7 elementos" son claramente una mierda, de lo contrario no podría usar el alfabeto. El tamaño del objeto debe basarse en la separación de preocupaciones, responsabilidad única, alta cohesión, bajo acoplamiento y principios similares, no números arbitrarios.
JacquesB
1
@JacquesB Los 7 elementos generalmente son indicativos de 7 piezas de información no relacionada. Si su cerebro puede asociar o agrupar información, en un sentido real, es 1 pieza de información que puede generar más si intenta recordar (de hecho, "alfabeto" es un símbolo, no las 26 letras). Un mejor ejemplo sería tratar de recordar un número de 7 dígitos que se le dijo por teléfono sin tener lápiz y papel disponibles. Los métodos claramente no son números arbitrarios, pero si esos métodos son relevantes para lo que está codificando, puede esperar después del 7, tendrá que buscarlo antes de poder recordarlo correctamente.
Neil
3
@Neil: Si los métodos en una clase son piezas de información no relacionadas al azar, entonces tiene mayores problemas en el diseño de su clase que la cantidad de métodos.
JacquesB
33

No, no en términos de líneas de código. El controlador debe ser agrupación lógica. Ciertamente no debería haber múltiples clases en un archivo grande, por ejemplo

Si tuviera una clase que legítimamente tuviera unos cientos de métodos (no es imposible, por ejemplo, en el modelado 3D), sería mucho menos conveniente dividir eso en archivos arbitrarios. Solíamos tener que hacer esto cuando la memoria era escasa y los procesadores más lentos, y era un problema, constantemente buscando la definición de la función.

Martin Beckett
fuente
2
¿No sería una clase con cientos de métodos un síntoma de envidia de clase, falta de cohesión, diseño deficiente, violación del principio de responsabilidad única, etc.?
Tulains Córdova
2
@ user1598390: generalmente, pero no siempre.
whatsisname
44
@ user1598390: común en el modelado gis / 3d para tener muchas operaciones que puede realizar, y luego hacer que se sobrecarguen para señal 2d, 3d, 4d, 3d +, luego flotante / doble / entero, etc. - las plantillas ayudan un poco, pero para la eficiencia muchas operaciones son a menudo mejores que una jerarquía de clase bonita
Martin Beckett
2
@ tp1: ¿y utiliza una fuente pequeña para que no ocupen tanto espacio?
Martin Beckett
2
@ tp1 Amigo, lo siento, no me refiero a ninguna falta de respeto, pero siento pena por quien trabaja contigo. Si tiene 1200 clases, use una convención de directorio, si tiene demasiados directorios, divídalos en módulos / bibliotecas independientes.
dukeofgaming
8

Cuando el código en él se vuelve imposible de mantener. es decir: no puede decir simplemente mirando el código si el método / clase / función que está buscando (y tiene que editar / depurar) está allí, o no, y si es así, dónde está.

Sin embargo, su elección y características de IDE / Editor influirán en la cuantificación real de este límite superior. Plegado de código , la función / método de lista, y la búsqueda será posponer el momento este desarrollo presenta un escenario.

Pero cuando lo hace, es hora de dividirlo.

ZJR
fuente
2

Aquí hay una vista alternativa: está preguntando cómo limitar el tamaño del archivo. Mi opinión es que hay muchos factores que hacen que los archivos de código grandes sean muy problemáticos. A veces, el archivo de código es enorme, pero su contenido está bien agrupado y es extremadamente limpio, de modo que el tamaño no causa problemas significativos. He visto muchos archivos que son muy legibles a pesar del alto LOC.

En lugar de aprovechar la métrica LOC, preferiría pensar en usar los datos del historial para comprender con qué frecuencia el código se rompe en esos archivos grandes. Por lo general, la razón es que los desarrolladores no tienen tiempo de paciencia para verificar los otros lugares relevantes en el mismo archivo y realizar el cambio con la mentalidad de "solución rápida" sin suficiente comprensión.

El mayor peligro es la presencia de código de copiar y pegar. La codificación de copiar y pegar, naturalmente, también acelera el crecimiento LOC. Creo que eliminar copiar y pegar es aún más importante que mantener LOC por debajo de algún número mágico. Además de copiar y pegar puro, también existe un segundo peligro en los archivos grandes: la funcionalidad superpuesta. Cuanto más grande es el archivo, más probable es que termines reimplementando algún fragmento que ya está en alguna otra sección del mismo archivo.

Por lo tanto, siempre y cuando la relación de corrección de errores (relación de confirmaciones de corrección de errores a todos los envíos) es baja para los archivos más grandes, la situación es tolerable. Inténtalo git logy revisa cuántas de las confirmaciones están relacionadas con errores. O utilice una herramienta que pueda analizarlo y visualizarlo automáticamente, por ejemplo, Softagram .

Ville Laitila
fuente
-1

Considera esto Metaphor. Cuando se trata de la longitud del código, creo que deberíamos considerar lo siguiente:

The Cat in The Hat (50 pp.)

y

Lord of The Rings (1,178 pp.)

No hay nada malo con eso Lord of the Rings. Es un libro fabuloso. The Cat in the HatTambién es un gran libro. Ambos pueden ser entendidos por un niño de 5 años, pero solo uno es más adecuado debido al contenido.

En mi opinión, escribir código debería tener sentido para un niño de 5 años siempre que podamos. Cyclomatic ComplexityEs un concepto importante que los desarrolladores deben considerar al generar código. Utilizando y creando bibliotecas para mejorar la funcionalidad y la reutilización del código tanto como sea posible. De esta manera, nuestro código puede decir más volúmenes de lo que vemos escrito.

La mayoría de nosotros no estamos escribiendo código de ensamblaje . Pero la raíz de nuestro código es el ensamblaje. Buscar en el ensamblaje de 10000 líneas es más difícil que 10000 líneas de python, si se hace correctamente.

Pero algunos trabajos requieren escribir entre 500 y 1000 líneas. Nuestro objetivo con el código debe ser escribir 300 líneas de código limpio.

Como desarrolladores, queremos escribir "El señor de los anillos". Hasta que tengamos un error y desearíamos estar escribiendo "Cat in the Hat". No hagas de la codificación una medida del ego. Simplemente haga que las cosas funcionen de manera simple.

Los desarrolladores no quieren documentar el código (personalmente me encanta el código documentado, no soy tan egoísta). Así que no escriba código que solo usted pueda entender / leer. Escribir Cat in the Hatcódigo

Todos sabemos que eres JRR Tolken (en tu cabeza). Recuerde que no tendrá nada que demostrar con un código libre de errores.

Otra razón para la metáfora.

No exageres al lector, extiende la riqueza. Si trabajas con un grupo de personas y todas ellas tienen que cambiar ese mismo archivo, es probable que te estés gitfusionando.

Todos aman el rebase.

-> Dijo nadie nunca!

TL; DR Enfoque en la legibilidad. Extienda su código y ayudante en múltiples líneas y archivos tanto como pueda. No arroje 8 o 9 clases en un solo archivo, hace que el código sea difícil de leer y más difícil de mantener. Si tiene un código o bucle de condición grande, considere cambiarlos a Lambdas si el idioma lo admite. Las funciones de servicios públicos deben considerarse una gran vía para aumentar la legibilidad del código. Evite la anidación pesada.

GetBackerZ
fuente
No es un votante negativo, pero tu analogía está un poco perdida para mí. ¿Estás diciendo que es mejor distribuir tu código en varias líneas y tener menos palabras en cada línea?
Forraje
Distribuya el código y el ayudante en múltiples líneas y archivos tanto como pueda. Centrarse en la legibilidad. No arrojes 8 o 9 clases en un solo archivo. Hace que el código sea difícil de leer y más difícil de mantener. Si tiene un código de condición grande o bucles. Conviértalos en utilidades. Evite la anidación pesada. Avíseme si esto ayuda a explicarlo.
GetBackerZ
Quizás debería editar eso en su respuesta, ya que eso aclararía lo que quiere decir.
Forraje
Usé el script para Jackie Brown como criterio para los programas modulares de z / OS COBOL. Ya sabes, para bromas de cóctel ...
mckenzm
"Tener sentido para un niño de 5 años siempre que podamos". - para problemas del mundo real que pagan las facturas, esto rara vez es posible y apunta a algo incorrecto
cuál es