Antipatrones: el blob

Sigo leyendo e informándome acerca de patrones. El libro que estoy leyendo, cuyo título aparece referenciado al final del artículo, es de los mejores que he leído de informática y gestión de proyectos, estoy encontrando cosas muy interesantes y creo que se le puede sacar bastante partido. Publicaré todos los antipatrones que pueda, al menos los que encuentre más ilustrativos y curiosos.

El Blob (*)

Yo lo llamo el “monstruo” o el “bicho”, porque viene a ser precisamente eso, una cosa gigantesca y poco manejable. Una evidencia de que estamos ante la presencia de un Blob es cuando alguien dice “esta es la clase que representa el núcleo de la arquitectura“. Malo. Desconfiar de ello.

El blob se encuentra en sistemas donde una clase monopoliza el procesamiento y el resto de las clases básicamente se limitan a encapsular datos. El problema es que la mayoría de las responsabilidades están contenidas en una sola clase. Esto provoca que modificar el blob implique modificar otras muchas clases.

Al final, el blob se convierte en una clase procedural disfrazada de orientación a objetos. Puede ser resultado de una localización inapropiada de los requisitos. Suelen aparecer como clases controladores o manejadoras / gestionadoras.

También puede aparecer en prototipos evolutivos, al crecer éstos. No se reparten responsabilidades y un módulo va asumiendo todo. Además, debido al mantenimiento, se va acumulando código útil mezclado con código que ya no sirve para nada. Esto mismo se da en sistemas incrementales, por la misma razón.

Síntomas

– Clases con muchos atributos y/o métodos.

– Dispar colección de atributos / métodos sin aparente relación entre sí (falta de cohesión).

– Una única clase controladora asociada con clases simples de datos.

– Ausencia de diseño orientado al objeto. El blob parece más bien un Main().

– Un diseño legado que no ha sido correctametne refactorizado en una arquitectura orientada a objetos.

Consecuencias

– El blob es típicamente demasiado complejo como para ser reutilizado y probado.

– Puede afectar gravemente al rendimiento al cargar un objeto tan grande en memoria probablemente utilizar un gran número de recursos.

Causas

– Falta de arquitectura orientada al objeto, o de una arquitectura consistente y estable en general.

– Intervención limitada: cambios en el código tienden  a añadir sobre lo que ya hay, en lugar de crear nuevas clases y rediseñar / refactorizar.

– Especificación inadecuada: captura de requisitos incompleta o no adecuada.

No es una mala práctica porque…

Es aceptable cuando se adaptan sistemas legados no orientados a objetos. No se requiere refactorizar el código, sino hacerlo más accesible al sistema legado.

Solución refactorizada

Mover código fuera del blob. Identificar y categorizar atributos y operaciones, según la cohesión. Buscar alojamiento para dichos atributos y métodos en clases apropiadas. Eliminar redundancia en las asociaciones que ya no son necesarias y reducir el acoplamiento. Extraer herencia y abstracción allí donde sea necesario. Estudiar las comunicaciones entre clases, paso de parámetros, etc.

Variaciones

– Transformar el blob en una clase coordinadora, que gestiona cómo hacen el trabajo los demás, delegando dicho trabajo en las clases de este modo coordinadas. De manera que el blob no es un ejecutor, sino un coordinador.

– El blob puede presentarse también como un centro de almacén de datos compartido por muchas clases, aunque no realice procesamiento alguno con dichos datos;  algo así como un repositorio de datos en memoria, una sección de memoria compartida gigantesca e inapropiada.

(*)No confundir con el tipo de datos para el almacén de objetos binarios en una base de datos; no tiene nada que ver.


Referencias:

Anti Patterns – Refactoring Software, Architectures and Projects in Crisis, varios autores.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s