¿Es posible hacer que el código largo que representa un cálculo sea más fácil de leer?

9

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?

Michael Tsang
fuente
¿No hay alguna forma de parametrizar la consulta de alguna manera? Supongo que esta consulta varía según lo que esté sucediendo dentro del método que crea. Tal vez pueda dividirlo en pedazos más pequeños y construirlo en varios pasos para que sea más fácil de leer.
Zalomon
¿Su ORM admite vistas? Puede extraer un (grupo de) unirse a una vista y luego seleccionar la vista. Incluso si la vista no se usa en otro lugar, eso puede ayudar a romper una gran declaración SQL
Caleth
¿Su ORM admite un lenguaje de consulta similar a SQL? En caso afirmativo, podría mover la consulta a su propio archivo y habilitar el resaltado de sintaxis IDE. En su aplicación, cargue la consulta del archivo. Si su IDE no es exactamente compatible con ese lenguaje de consulta específico, puede llevarse bien con el formato SQL, aunque puede que no sea perfecto. Sin embargo, la legibilidad aumenta en gran medida por un buen formato. Esto también tiene la ventaja de que es fácil copiar la consulta a un bloc de notas y hacer modificaciones allí.
SpaceTrucker

Respuestas:

17

Tu escribiste

¿Se considera un código tan difícil de leer?

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.

Doc Brown
fuente
Estoy un poco en desacuerdo con la parte del comentario, si hay una parte compleja del código que es compleja porque no puede ser de otra manera Y no encontró la manera de simplificarlo, es poco probable que los comentarios den una idea general de lo que se está haciendo. Documentarlo con algún diagrama sería mucho mejor. Y se debe dejar un comentario que haga referencia a esa documentación externa. Por supuesto, esa situación tiene que ser excepcional porque sabemos que rara vez se realiza el mantenimiento de la documentación externa, por lo que cuanto menos, mejor. Por lo demás, una buena respuesta como siempre.
Walfrat
@Walfrat: mi intención era proporcionar una guía general sobre el proceso, no exclusivamente para "50 líneas de código SQL", y no como una solución "lista para usar" con todos los enfoques potenciales.
Doc Brown
Lo sé, solo quería sugerir que si algo después de haber sido revisado muchas veces no pudiera simplificarse lo suficiente (sea lo que sea), los comentarios probablemente no ayuden sobre lo que hace que esto sea complejo, por lo que es probable que se requiera una documentación externa mínima. En el caso específico de las consultas de bases de datos, esto es aún más fácil al mostrar un diagrama que muestra cómo cada parte de la consulta se correlaciona entre sí.
Walfrat
4

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.

gnasher729
fuente
Exactamente. Haga todo lo posible para que el código se documente automáticamente, luego use los comentarios para llenar los vacíos. (editado: me di cuenta después de publicar mi comentario que el OP se refería a consultas de la base de datos ORM, no a SQL.)
Kyle A
1

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 .

John Wu
fuente
2
Honestamente, el hecho de que no te gusten los ORM es completamente irrelevante para la pregunta.
Doc Brown
Me gustan los ORM bien. Estoy afirmando que no son una buena herramienta cuando el código "se une en varias columnas, aplica múltiples dónde y selecciona varias columnas distintas para hacer un formato de salida documentado requerido", que es el tema de este hilo.
John Wu
0

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:

query(join(map(condition1, condition2), blah, blah, something(bah, blah, blah))) 

Se convierte en:

// Why are we doing such an awful single query rather than a sequence of selects?
query( // Description of query
  join( // Why are you doing a join here
    map( // Why a map
      condition1, // What is this
      condition2  // And this
   ), // End Map
   blah, // What, Why?
   blah, // What, Why?
   something( // What does this do?
      bah, // What, Why?
      blah, // What, Why?
      blah // What, Why?
      ) // End Something
   ) // End Join
) // End Query
Steve Barnes
fuente
Soy ambiguo sobre tu ejemplo. Los comentarios deben explicar por qué el código es como es. Lo que deben expresar los identificadores ...
Timothy Truckle
@TimothyTruckle Estoy de acuerdo en que los identificadores deben identificar claramente lo que son, pero a menudo no están claros en el código normal; en el caso de los nombres de los campos de registro, a menudo hay una falta de claridad debido a las limitaciones históricas que he encontrado. estaban limitados a 5 caracteres, todos debían ser letras mayúsculas ASCII y no podían cambiarse debido a requisitos de compatibilidad, por ejemplo
Steve Barnes
0

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.

Neville Kuyt
fuente