Bueno, la medida que uso, o me gusta pensar que uso, es esta:
Para cada requisito funcional independiente, único, de una línea, tómalo o déjalo, toma una foto de la base del código antes de implementarlo. Luego impleméntelo, incluida la búsqueda y reparación de cualquier error introducido en el proceso. Luego ejecute un diff
entre la base de código antes y después. El diff
le mostrará una lista de todas las inserciones, eliminaciones y modificaciones que implementaron el cambio. (Al igual que insertar 10 líneas consecutivas de código es un cambio). ¿Cuántos cambios hubo? Cuanto menor es ese número, por lo general, más fácil de mantener es el código.
Llamo a eso la redundancia del código fuente, porque es como la redundancia de un código de corrección de errores. La información estaba contenida en 1 fragmento, pero estaba codificada como N fragmentos, que deben hacerse todos juntos, para ser coherentes.
Creo que esta es la idea detrás de DRY, pero es un poco más general. La razón por la que es bueno que ese recuento sea bajo es que, si se necesitan N cambios para implementar un requisito típico, y como programador falible, solo obtienes N-1 o N-2 de ellos correctamente al principio, has introducido 1 o 2 errores. Además del esfuerzo de programación O (N), esos errores tienen que ser descubiertos, localizados y reparados. Por eso la pequeña N es buena.
Mantener no significa necesariamente legible para un programador que no ha aprendido cómo funciona el código. La optimización de N puede requerir hacer algunas cosas que crean una curva de aprendizaje para los programadores.
Aquí hay un ejemplo.
Una cosa que ayuda es si el programador trata de anticipar cambios futuros y deja instrucciones prácticas en los comentarios del programa.
Creo que cuando N se reduce lo suficiente (lo óptimo es 1), el código fuente se lee más como un lenguaje específico de dominio (DSL). El programa no "resuelve" tanto el problema como "enuncia" el problema, porque lo ideal es que cada requisito se reexprese como una sola pieza de código.
Desafortunadamente, no veo gente aprendiendo mucho a hacer esto. Más bien parecen pensar que los sustantivos mentales deberían convertirse en clases, y los verbos en métodos, y todo lo que tienen que hacer es girar la manivela. Eso da como resultado un código con N de 30 o más, en mi experiencia.