anti patterns - patrones - Código ravioli-¿Por qué un anti-patrón?
patrones de diseño java (8)
Recientemente encontré el término " objeto de Dios " que se describió como un "antipatrón". Había oído hablar de malas prácticas de codificación, pero nunca las había oído describir así.
Así que me dirigí a Wikipedia para obtener más información, y descubrí que existe un antipatrón llamado ''Código de Ravioli'' que se describe como "caracterizado por una serie de componentes de software pequeños y (idealmente) poco acoplados".
Estoy desconcertado, ¿por qué es esto algo malo?
Aparece en la página del código de Spaghetti, pero eso no significa que sea algo malo. Está ahí porque este es un término relevante y no es lo suficientemente importante como para tener su propia página.
En cuanto al lado malo de esto, Google hace un comentario en http://developers.slashdot.org/comments.pl?sid=236721&cid=19330355 :
El problema es que tiende a conducir a funciones (métodos, etc.) sin verdadera coherencia, ya menudo deja el código para implementar incluso algo bastante simple dispersado en un gran número de funciones. Cualquiera que tenga que mantener el código debe entender cómo funcionan todas las llamadas entre todos los bits, recreando casi toda la maldad del Código Spaghetti, excepto las llamadas de función en lugar de GOTO. ...
Tienes que juzgar si es razonable :).
El problema es que diferentes personas usan el término "código de ravioli" para significar cosas diferentes.
Un buen número de componentes razonablemente pequeños es bueno. Una enorme pila de componentes diminutos sin una estructura general aparente no es tan buena.
Los componentes ligeramente acoplados son buenos. Los componentes que ocultan sus interdependencias para parecer vagamente acoplados no son tan buenos.
Ser capaz de ver la relación entre los diferentes componentes es realmente algo bueno.
Sin embargo, la mayoría de las bases de código tienen el problema opuesto, por lo que avanzar hacia una mayor modularidad suele ser algo bueno. Espero que la mayoría de la gente nunca haya visto "código de ravioli" en el mal sentido. En la práctica, tiende a parecerse más a raviolis picados (donde lo que debería ser un módulo se divide en múltiples "módulos", ninguno de los cuales tiene sentido por sí solo, sino solo en combinación con sus otras partes correspondientes), o como raviolis. cocinado sin suficiente agua (por lo que terminas con una mancha gigante de "módulos" pegados).
TODO: Escriba un programa "Hello world" como ~ 100 módulos para demostrar la sobremodularidad.
TODO2: Intentar construir un puente con camiones cargados de raviolis para demostrar características estructurales subóptimas.
Leyendo el artículo, Spaghetti es un anti-patrón; pero los raviolis y lasaña no son anti-patrones.
No es necesariamente, ¿verdad? El artículo de Wikipedia no lo describe como malo. Un número de componentes de software de acoplamiento débil, donde el tamaño y la cantidad de estos componentes es razonable en relación con el dominio del problema, me parece bastante ideal.
De hecho, si busca otras definiciones de código de ravioli, lo encontrará descrito como el patrón de diseño de software ideal. Sigo prefiriendo la advertencia de que el tamaño y el número deben ser apropiados.
Si aplicas una regla dogmática de que todas las clases en todos los proyectos deben estar acopladas libremente, independientemente de cualquier razón, entonces puedo ver que hay muchos problemas potenciales.
Podrías girar tus ruedas tratando de hacer una aplicación perfectamente fina cada vez más acoplada sin agregarle ningún valor.
Sin embargo, me apresuro a agregar que creo que todos deberíamos apuntar hacia clases, componentes, etc.
Spaghhetti:
Código espagueti es un término peyorativo para código fuente
Ravioles:
El código de Ravioli es un tipo de estructura de programa de computadora, que se caracteriza por una cantidad de componentes de software pequeños y (idealmente) de acoplamiento débil. El término es en comparación con el código de espagueti, comparando la estructura del programa con la pasta;
Los está comparando. No está diciendo que sea un anti-patrón.
Pero estoy de acuerdo. El artículo es confuso. El problema no es con la analogía de los raviolis, sino con la propia estructura del artículo de wikipedia. Comienza a llamar espaguetis como una mala práctica, luego dice algunos ejemplos y después de eso dice algo sobre el código de Ravioli.
EDITAR: Mejoraron el artículo. Es un anti-patrón porque
Aunque generalmente es deseable desde una perspectiva de acoplamiento y cohesión, la separación y el encapsulado excesivos de código pueden inflar las pilas de llamadas y dificultar la navegación a través del código para fines de mantenimiento.
Yo diría que es bastante obvio que el código de Ravioli y el código de Lasagna son términos peyorativos, que se colocan intencionalmente junto con su "código de espagueti" de similitud de pasta, y ambos términos describen antitabones del mundo real. Algunos códigos requieren mucho tiempo de mantenimiento y son muy propensos a fallar simplemente porque se dividen en tantos subprocesos separados, es decir, el código de los raviolis. Algunos códigos tienen tantas capas de abstracción que se vuelve muy difícil implementar un cambio y / o comprender a qué nivel está ocurriendo una falla, es decir, el código de lasaña. La única forma práctica de hacer un cambio en el código de lasaña es a menudo simplemente omitir las capas y escribir el código sencillo que hace el trabajo. Tengo que mantener un código de ravioli, pero en general ese código sufre de su convolución y no encuentra un uso generalizado, por lo que hay algunos ejemplos con los que todos estaríamos familiarizados. Por el contrario, el código de lasaña está en todas partes en este momento. Me gusta pensar que no escribo ningún código de pasta, pero al menos puedes seguir una serie de espaguetis ...
Más o menos la única razón por la que el "código de ravioli" ha sobrevivido como frase es porque los programadores tienen un sentido innato del humor. Inténtelo como pueda, y créanme, lo he intentado. Es realmente difícil encontrar un ejemplo de código orientado a objetos que esté (a) empaquetado de tal manera que sea realmente difícil navegar en el mismo sentido meta que " el código de espagueti "es difícil de navegar, y (b) refleja un antipatrón frecuente en la práctica de codificación.
El mejor ejemplo de "código de ravioli" que se me ocurre es una multitud de clases, cada una de ellas bien empaquetada, pero donde es realmente difícil averiguar dónde está el flujo principal de ejecución. Las aplicaciones de redes neuronales pueden mostrar esto, pero ese es el punto. Un ejemplo más mundano sería el código de la interfaz de usuario que está muy orientado a los eventos, pero nuevamente, es difícil exagerar con eso; en todo caso, la mayoría del código de la interfaz de usuario no es lo suficientemente impulsado por los eventos.