Cada vez que escucho sobre Anti-patrones, recuerdo otro término, a saber. Olor de diseño.
"Los olores de diseño son ciertas estructuras en el diseño que indican una violación de los principios fundamentales de diseño e impactan negativamente en la calidad del diseño". (De "Refactorización para olores de diseño de software: gestión de la deuda técnica")
Hay muchos olores de diseño clasificados según los principios de diseño que violan:
La abstracción huele
Falta de abstracción: este olor surge cuando se utilizan grupos de datos o cadenas codificadas en lugar de crear una clase o una interfaz.
Abstracción imperativa: este olor surge cuando una operación se convierte en una clase.
Abstracción incompleta: este olor surge cuando una abstracción no admite métodos complementarios o interrelacionados por completo.
Abstracción multifacética: este olor surge cuando una abstracción tiene más de una responsabilidad asignada.
Abstracción innecesaria: este olor se produce cuando una abstracción que realmente no es necesaria (y por lo tanto podría haberse evitado) se introduce en un diseño de software.
Abstracción no utilizada: este olor surge cuando una abstracción se deja sin usar (no se usa directamente o no es accesible).
Abstracción duplicada: este olor surge cuando dos o más abstracciones tienen nombres idénticos o una implementación idéntica o ambas.
Olores de encapsulación
Encapsulación deficiente: este olor ocurre cuando la accesibilidad declarada de uno o más miembros de una abstracción es más permisiva de lo que realmente se requiere.
Encapsulación con fugas: este olor surge cuando una abstracción "expone" o "filtra" detalles de implementación a través de su interfaz pública.
Falta de encapsulación: este olor se produce cuando las variaciones de implementación no están encapsuladas dentro de una abstracción o jerarquía.
Encapsulación no explotada: este olor surge cuando el código del cliente usa verificaciones de tipo explícitas (usando if-else encadenado o declaraciones de cambio que verifican el tipo de objeto) en lugar de explotar la variación en los tipos ya encapsulados dentro de una jerarquía.
Olores de modularización.
Modularización rota: este olor surge cuando los datos y / o métodos que idealmente deberían haberse localizado en una sola abstracción se separan y se extienden a través de múltiples abstracciones.
Modularización insuficiente: este olor surge cuando existe una abstracción que no se ha descompuesto por completo, y una descomposición adicional podría reducir su tamaño, complejidad de implementación o ambas.
Modularización dependiente del ciclo: este olor surge cuando dos o más abstracciones dependen unas de otras directa o indirectamente (creando un acoplamiento estrecho entre las abstracciones).
Modularización tipo hub: este olor surge cuando una abstracción tiene dependencias (tanto entrantes como salientes) con una gran cantidad de otras abstracciones.
La jerarquía huele
Falta de jerarquía: este olor surge cuando un segmento de código usa lógica condicional (generalmente junto con "tipos etiquetados") para gestionar explícitamente la variación en el comportamiento donde una jerarquía podría haberse creado y utilizado para encapsular esas variaciones.
Jerarquía innecesaria: este olor surge cuando toda la jerarquía de herencia es innecesaria, lo que indica que la herencia se ha aplicado innecesariamente para el contexto de diseño particular.
Jerarquía no factorizada: este olor surge cuando hay una duplicación innecesaria entre los tipos en una jerarquía.
Jerarquía amplia: este olor surge cuando una jerarquía de herencia es "demasiado" amplia, lo que indica que pueden faltar tipos intermedios.
Jerarquía especulativa: este olor surge cuando uno o más tipos en una jerarquía se proporcionan de forma especulativa (es decir, en función de necesidades imaginarias en lugar de requisitos reales).
Jerarquía profunda: este olor surge cuando una jerarquía de herencia es "excesivamente" profunda.
Jerarquía rebelde: este olor surge cuando un subtipo rechaza los métodos proporcionados por su (s) supertipo (s).
Jerarquía rota: este olor surge cuando un supertipo y su subtipo conceptualmente no comparten una relación "IS-A" que resulta en una sustituibilidad rota.
Jerarquía multitrayecto: este olor surge cuando un subtipo hereda tanto directa como indirectamente de un supertipo que conduce a rutas de herencia innecesarias en la jerarquía.
Jerarquía cíclica: este olor surge cuando un supertipo en una jerarquía depende de cualquiera de sus subtipos.
La definición y clasificación anteriores se describen en "Refactorización para olores de diseño de software: Gestión de deuda técnica ". Algunos recursos más relevantes se pueden encontrar aquí .