Ogni volta che sento parlare di Anti-pattern, ricordo un altro termine, vale a dire. Odore di design.
"Gli odori del design sono determinate strutture nel design che indicano la violazione dei principi fondamentali del design e influiscono negativamente sulla qualità del design".
Esistono molti odori di design classificati in base a principi di progettazione violanti:
Odori di astrazione
Astrazione mancante: questo odore si presenta quando vengono utilizzati gruppi di dati o stringhe codificate anziché creare una classe o un'interfaccia.
Astrazione imperativa: questo odore si presenta quando un'operazione viene trasformata in una classe.
Astrazione incompleta: questo odore si presenta quando un'astrazione non supporta completamente metodi complementari o correlati.
Astrazione sfaccettata: questo odore si presenta quando un'astrazione ha più di una responsabilità assegnata ad essa.
Astrazione non necessaria: questo odore si verifica quando un'astrazione che in realtà non è necessaria (e quindi avrebbe potuto essere evitata) viene introdotta in una progettazione software.
Astrazione non utilizzata: questo odore si presenta quando un'astrazione viene lasciata inutilizzata (non utilizzata direttamente o non raggiungibile).
Astrazione duplicata: questo odore si presenta quando due o più astrazioni hanno nomi identici o implementazione identica o entrambi.
Odori di incapsulamento
Incapsulamento carente: questo odore si verifica quando l'accessibilità dichiarata di uno o più membri di un'astrazione è più permissiva di quanto effettivamente richiesto.
Incapsulamento che perde : questo odore si presenta quando un'astrazione "espone" o "perde" i dettagli dell'implementazione attraverso la sua interfaccia pubblica.
Incapsulamento mancante: questo odore si verifica quando le variazioni di implementazione non sono incapsulate all'interno di un'astrazione o gerarchia.
Incapsulamento non sfruttato: questo odore si presenta quando il codice client utilizza controlli di tipo espliciti (usando istruzioni incatenate if-else o switch che controllano il tipo di oggetto) invece di sfruttare la variazione dei tipi già incapsulati all'interno di una gerarchia.
Odori di modularizzazione
Modularizzazione interrotta: questo odore si presenta quando i dati e / o i metodi che idealmente avrebbero dovuto essere localizzati in una singola astrazione vengono separati e diffusi tra più astrazioni.
Modularizzazione insufficiente: questo odore si presenta quando esiste un'astrazione che non è stata completamente decomposta e un'ulteriore decomposizione potrebbe ridurne le dimensioni, la complessità di implementazione o entrambi.
Modularizzazione ciclicamente dipendente: questo odore nasce quando due o più astrazioni dipendono l'una dall'altra direttamente o indirettamente (creando un accoppiamento stretto tra le astrazioni).
Modularizzazione simile ad un hub: questo odore si presenta quando un'astrazione ha dipendenze (sia in entrata che in uscita) con un gran numero di altre astrazioni.
Gli odori della gerarchia
Gerarchia mancante: questo odore si presenta quando un segmento di codice utilizza la logica condizionale (in genere in combinazione con "tipi con tag") per gestire esplicitamente la variazione nel comportamento in cui una gerarchia avrebbe potuto essere creata e utilizzata per incapsulare tali variazioni.
Gerarchia non necessaria: questo odore nasce quando l'intera gerarchia ereditaria non è necessaria, indicando che l'ereditarietà è stata applicata inutilmente per il particolare contesto di progettazione.
Gerarchia non fattorizzata: questo odore si presenta quando c'è una duplicazione non necessaria tra i tipi in una gerarchia.
Gerarchia ampia: questo odore si presenta quando una gerarchia ereditaria è "troppo" ampia indicando che potrebbero mancare tipi intermedi.
Gerarchia speculativa: questo odore si presenta quando uno o più tipi in una gerarchia sono forniti in modo speculativo (cioè, sulla base di bisogni immaginati piuttosto che di requisiti reali).
Gerarchia profonda: questo odore nasce quando una gerarchia ereditaria è "eccessivamente" profonda.
Gerarchia ribelle: questo odore si presenta quando un sottotipo rifiuta i metodi forniti dai suoi supertipi.
Gerarchia spezzata: questo odore si presenta quando un supertipo e il suo sottotipo concettualmente non condividono una relazione "IS-A" con conseguente sostituibilità interrotta.
Gerarchia multipath: questo odore nasce quando un sottotipo eredita sia direttamente che indirettamente da un supertipo che porta a percorsi di eredità non necessari nella gerarchia.
Gerarchia ciclica: questo odore si presenta quando un supertipo in una gerarchia dipende da uno qualsiasi dei suoi sottotipi.
La definizione e la classificazione di cui sopra sono descritte in "Refactoring per gli odori di progettazione software: gestione del debito tecnico ". Alcune risorse più rilevanti possono essere trovate qui .