Eche un vistazo a la pregunta relacionada How many lines of code is too many?. Hay bastantes cositas de sabiduría en todas las respuestas allí.
volver a publicar una cita (aunque voy a intentar hacer comentarios al respecto un poco más aquí) ... Hace un tiempo, leí este passage from Ovid's journal:
Hace poco escribió algo de código para Clase: : Sniff que detectaría "long métodos" e informarlos como un olor de código . Incluso escribí una entrada en el blog sobre cómo lo hice (qué sorpresa, ¿eh?). Fue entonces cuando Ben Tilly hizo una pregunta embarazosamente obvia : ¿cómo sé que los métodos largos son un olor de código ?
Tiré las justificaciones habituales, pero él no se detuvo.Quería información de y citó el excelente código de libro como contraargumento . Bajé mi copia de este libro y comencé a leer "Cómo largo debería ser una rutina" (página 175, segunda edición). El autor, Steve McConnell, argumenta que las rutinas deben ser que no superen las 200 líneas. Holy crud! Eso es muy largo. Si una rutina es más larga que aproximadamente 20 o 30 líneas, creo que es hora de romperla arriba.
Lamentablemente, McConnell tiene la mejilla citar seis estudios separados, todos que encontró que las rutinas más largas eran no sólo no se correlaciona con una mayor tasa de defectos , pero también eran a menudo baratos de desarrollar y fácil de comprender. Como resultado, la última versión de Class :: Sniff en github ahora documenta que las rutinas más largas pueden no ser ser un olor de código después de todo. Ben estaba a la derecha. Estaba equivocado.
(El resto de la entrada, en TDD, vale la pena leer también.)
Viniendo de los "métodos más cortos están mejor" campo, esto me dio mucho que pensar.
Anteriormente, mis métodos grandes generalmente estaban limitados a "Necesito entrar aquí, y el compilador no coopera", o "por una razón u otra, el bloque de conmutadores gigantes realmente se ejecuta más rápido que la tabla de distribución", o "este las cosas solo se llaman exactamente en secuencia y realmente no quiero que la llamada funcione aquí ". Todos los casos relativamente raros.
En su situación, sin embargo, tendría un gran prejuicio hacia no tocar cosas: la refactorización conlleva cierto riesgo inherente, y actualmente puede superar la recompensa. (Descargo de responsabilidad: estoy un poco paranoico; por lo general, soy el tipo que termina arreglando los bloqueos.)
Considere invertir sus esfuerzos en pruebas, afirmaciones o documentación que pueda fortalecer el código existente e inclinar el riesgo/recompensa escala antes de cualquier intento de refactorización: invariant checks, bound function análisis y pre/postcondition tests; cualquier otro concepto útil de DBC; tal vez incluso una implementación paralela en otro idioma (tal vez algo orientado a mensajes como Erlang podría darle una mejor perspectiva, dado el ejemplo de código) o incluso algún tipo de formal logical representation de la especificación que está tratando de seguir si tiene algo de tiempo para grabar.
Cualquiera de estos tipos de esfuerzos generalmente tiene unos pocos resultados, incluso si no tiene la oportunidad de refactorizar el código: aprende algo, aumenta su comprensión (y la de su organización) y la capacidad de utilizar el código y las especificaciones , es posible que encuentre algunos agujeros que realmente deben llenarse ahora, y se vuelve más seguro de su capacidad de realizar cambios con menos posibilidades de consecuencias desastrosas.
A medida que comprenda mejor el dominio del problema, puede encontrar que hay diferentes maneras de refactorizar que no había pensado previamente.
Esto no quiere decir que "tendrá un conjunto de pruebas de cobertura total, y DBC afirma, y una especificación lógica formal". Es solo que se encuentra en una situación típicamente imperfecta, y se está diversificando un poco, buscando formas novedosas de abordar los problemas que encuentra (facilidad de mantenimiento, facilidad de aprendizaje del sistema).): puede brindarle un poco de avance y un aumento de la confianza, después de lo cual puede dar pasos más grandes.
Así que piense menos desde la perspectiva de "demasiadas líneas es un problema" y más de "esto podría ser un olor a código, qué problemas nos causará, y hay algo fácil y/o gratificante que puede hacer al respecto? "
Dejarlo cocinando en la parte posterior por un tiempo - volver y volver a visitarlo cuando el tiempo y las coincidencias lo permitan (por ejemplo, "hoy trabajo cerca del código, tal vez pasearé para ver si no puedo documentar las suposiciones un poco mejor ... ") puede producir buenos resultados. Por otra parte, ser realzado y decidir algo debe ser hecho sobre la situación también es efectivo.
¿He logrado ser bastante flojo aquí? Mi punto, creo, es que el código huele, los patrones/antipatrones, las mejores prácticas, etc., están ahí para servirlo. Experimenta para acostumbrarte a ellos, y luego toma lo que tenga sentido para tu situación actual, y deja el resto.
¿Puede darnos algún pseudo código que nos muestre el patrón de estos métodos enormes? –
Parece que podría ser un candidato para la generación de código. –
@Binary Worrier: la muestra es una versión muy simplificada, solo para darle una idea. De todos modos, estoy de acuerdo en que incluso el código real podría ser de alguna manera autogenerado, pero esto no va a suceder en el corto plazo. – Gianluca