Los métodos largos generalmente se consideran malos, sin embargo, en mi código tengo algunos métodos largos difíciles de entender (más de 50 líneas). Tengo problemas para hacer que esos métodos sean más fáciles de leer porque una sola declaración en el interior ya tiene más de 50 líneas de largo, y esa declaración única difícil de leer es construir una consulta de base de datos usando un ORM para hacer un trabajo específico donde se realiza el trabajo claramente indicado en el nombre del método. La razón por la que la declaración es tan larga porque se une en varias columnas, aplica múltiples ubicaciones y selecciona varias columnas distintas para crear un formato de salida documentado requerido.
¿Se considera un código tan difícil de leer como un código incorrecto? Del mismo modo, si escribo código para un algoritmo complicado que resulta en un código difícil de leer envuelto en un método claramente nombrado, ¿ese código es un código incorrecto?
fuente
Respuestas:
Tu escribiste
así que definitivamente está de acuerdo en que es un código difícil de leer , y si es difícil de leer, es difícil de mantener y evolucionar, por lo que supongo que considera que el código es "malo" según sus propias medidas. Sin embargo, a veces no es obvio cómo mejorar algo como una declaración SQL de 50 líneas. Las fáciles refactorizaciones del "método de extracción" no funcionan, y probablemente no tenga idea de dónde comenzar para hacer que el código sea más legible. Para estos casos, aún puede probar uno o todos los siguientes
muestre el código a otra persona que tenga más experiencia que usted en la limpieza del código. Si no tiene a alguien en su organización, puede preguntar, intente codereview.stackexchange
Intenta buscar en Google el problema específico. Para su ejemplo, cosas como "limpiar una larga declaración SQL" podría ser un buen comienzo. Se sorprenderá de cuántos artículos encuentra sobre ese tema, e incluso si no puede encontrar una receta para su caso, puede obtener algunas ideas nuevas
en lugar de pedir una justificación de las cosas que no puede hacer, concéntrese en las cosas que puede hacer para limpiar el código al menos un poco, como agregar saltos de línea adecuados, sangría adecuada, agregar algunos comentarios explicativos, darles a algunas variables un mejor nombre. No es improbable que, durante este proceso, se obligue a releer los detalles del código, encuentre una manera de refactorizar el código en unidades más pequeñas
práctica práctica práctica. La "codificación limpia" no es algo que se aprende en un día, se vuelve más fácil con más experiencia. Tal vez no encuentre una solución para su problema hoy, pero cuando regrese al código en unos meses, se verá diferente para usted.
fuente
Difícil de leer no es malo, innecesariamente difícil de leer es malo.
Algunas cosas simplemente son difíciles. En ese caso, debe comprender completamente el problema, escribir el código y comentarlo lo mejor que pueda para que el próximo desarrollador tenga la oportunidad.
Pero algunas cosas solo son difíciles porque las hiciste difíciles. Si el problema puede simplificarse y hacerse más fácil, simplifíquelo. Si es difícil de entender pero se puede dividir razonablemente en subproblemas, entonces sepárelo en subproblemas para simplificarlo.
fuente
ORM para crear un informe? ¿Seriamente? Aprende algo de SQL, hombre. Los lenguajes de procedimiento son terribles en este tipo de cosas.
SQL es un lenguaje mucho mejor diseñado para manejar combinaciones y selecciones complicadas. E incluso si no puede hacer que el SQL se vea hermoso, hay todo tipo de herramientas de visualización disponibles donde puede arrastrar y soltar objetos de la base de datos en un diagrama y el SQL se generará para usted. Sin mencionar que podrá ajustar y optimizar la consulta, ver su plan de consulta, obtener la plataforma para sugerir opciones de indexación adicionales, etc. Es mucho más flexible.
Estoy seguro de que algunas personas aquí no estarán de acuerdo conmigo, pero ORM no es una buena opción para propósitos de informes complicados. Si fuera posible, consideraría alejarme de eso y avanzar hacia el Lenguaje de consulta estructurado .
fuente
En general, el código difícil de leer es una mala idea en cualquier lugar, incluso si usted es el único responsable del mantenimiento, he tenido varios casos de volver a algunos códigos años o incluso semanas después y me resulta difícil entenderlo.
Si necesita hacer mucho en una sola consulta, intente dividirla en líneas con comentarios incrustados:
Se convierte en:
fuente
Además de la excelente respuesta de @ DocBrown, creo que vale la pena reconocer que nadie escribe código "bueno" todo el tiempo. La codificación está haciendo concesiones, y a menudo es mejor aceptar que has escrito algo un poco menos limpio de lo que te gustaría y volver a leerlo más tarde. La refactorización es el proceso de mejorar el código con el tiempo, y en mi experiencia, eso es lo que hace una buena base de código, no "hacerlo bien la primera vez".
Y evalúa el código a nivel de la aplicación, no al nivel de métodos / líneas de código individuales. Entonces, si tiene un método complejo, pero está claramente nombrado, no creo que tenga un código "malo" mientras el método sea coherente.
Nombrar es el arma más importante que tiene para hacer que el código sea inteligible: asigne un nombre a su método que permita a las personas que leen su código omitir el cuerpo si es necesario. Nombra tus variables, etc., de manera que los lectores puedan ver lo que representan sin tener que leer sus declaraciones de asignación.
Lo siguiente es asegurarse de que su método realmente solo haga una cosa: los efectos secundarios hacen que el código sea difícil de entender. Entonces, si su método devuelve datos para un formato de salida, no debería actualizar el estado de su base de datos a "impreso", o lo que sea.
La capa / componente es lo siguiente que puede hacer: si tiene un montón de métodos complejos que generan resultados ORM, agrúpelos para que los lectores de su código puedan asumir que todos se comportan de la misma manera, no tienen efectos secundarios, etc.
fuente