¿Hay algún efecto secundario negativo de dividir módulos grandes? [cerrado]

21

Estaba navegando por un proyecto de github y encontré este módulo que tiene más de 10 mil líneas.

¿Es una práctica común tener tanto código en un solo módulo?

Me parece que esto debería dividirse en múltiples módulos. Tal vez uno para cada motor db.

¿Qué beneficio obtiene el desarrollador de hacer un módulo enorme como este (aparte de "tenerlo todo en un solo lugar") o qué inconveniente tiene dividirlo (aparte de "complejidad")?

Mahmoud Hossam
fuente
No 8k líneas, ¡seguro!
B 15овић
44
No es el tamaño del módulo, es cómo lo usa ...
jmq
44
Los programas deben ser leídos por humanos y solo de manera incidental para que las computadoras los ejecuten : Donald Knuth.
Mahmoud Hossam
1
Se supone que un módulo / submódulo debe hacer una cosa en particular. Un módulo (tonto) para agregar 2 números en Python sería solo de 2 líneas. Un módulo para hacer algo más complicado definitivamente será más grande. Digo restringir el módulo / submódulo a una sola función. Mantén eso como tu punto de referencia.
c0da
Con mucho, el punto más importante para el código orientado a objetos es tener una estructura de clase bien organizada con separación de preocupaciones y sequedad extrema. Dividir el módulo es la parte fácil.
Acumenus

Respuestas:

14

Lo que encontró es el llamado " objeto de Dios ", porque lo hace todo o lo sabe todo. Huir de él (si puedes).

No hay un número definido de LOC por módulo, pero debería ser algo que facilite la exploración del código y entienda fácilmente lo que están haciendo los métodos. Desde mi experiencia personal, si su módulo va más allá de 1k líneas * , está haciendo algo mal.

* Incluso un módulo de línea 1k es muy grande.

BЈовић
fuente
99
El ejemplo dado no es un Objeto de Dios , en realidad es una jerarquía de clase completa, incluido su doctest , que resulta estar en un solo archivo .py. Puede que esto no sea lo ideal, pero hay razones pragmáticas por las que podría querer hacer esto y, como sugiere BillThor , el código en sí mismo está razonablemente bien estructurado. Ciertamente no se ajusta a la definición clásica de un Objeto de Dios , solo uno que tiene un trabajo bastante complejo que hacer y necesita adaptarse a una serie de escenarios diferentes.
Mark Booth
6

Esto parece ser un módulo donde los límites de tamaño típicos pueden no aplicarse. La mayoría de la funcionalidad está en las primeras 2k líneas de código y comentarios. El resto del archivo parece ser una gran cantidad de clases de adaptadores y otras clases de soporte que parecen estar estrechamente acopladas al módulo. En otros idiomas las clases estarían en archivos separados de un tamaño razonable.

Algunas cadenas de documentos más podrían ser útiles, pero aumentarían el tamaño de un módulo ya grande. El código es claro y se explica por sí mismo con los comentarios apropiados cuando sea necesario.

BillThor
fuente
5

Por supuesto, el "límite" real varía según su proyecto y una multitud de factores.

Pero intervino con una regla general: 200 líneas de Python decente. Es decir, no hay código C o Java escrito en Python, pero sí un buen Python en Python.

unperson325680
fuente
1

Guau.

Supongo que no sé la respuesta completa para esta, pero me gusta pensar como respuesta a la pregunta del título "¿Qué tan grande debe ser un módulo de Python?" como el concepto de Parnas, ocultando un secreto. En este caso, el módulo parece hacerlo correctamente (y ese es un secreto tan grande que se esconde).

Más tarde estuve investigando documentos que hablan mucho sobre el acoplamiento y la cohesión. ¿Quizás tener muchos módulos db forzaría demasiadas llamadas entre módulos, lo que aumentaría lo que se considera una mala práctica, es decir, menor cohesión y mayor acoplamiento?

He visto datos experimentales que hablan de programadores que deciden sacrificar las buenas prácticas en aras de la simplicidad y la comprensión a pesar de lo que dicte la buena práctica. De hecho, podría haber un conflicto entre las buenas prácticas también. Digamos que el rendimiento no suele hacer felices a las personas que realizan tareas de mantenimiento más adelante. No estoy muy seguro de cómo se mejoraría la legibilidad en este caso con un módulo tan grande.

Otra cosa que noté es que parte del código se declara como genérico y el resto de los dbs se extienden desde él. No soy un programador de Python, pero ¿tal vez esto podría justificar algo?

Por lo tanto, no tengo una respuesta final, ¡pero espero que alguien también resalte estos puntos!

Oeufcoque Penteano
fuente