wake-up-neo.net

Cos'è un anti-pattern?

Sto studiando modelli e anti-modelli. Ho un'idea chiara dei modelli, ma non ho anti-schemi. Le definizioni dal web e Wikipedia mi confondono molto.

Qualcuno può spiegarmi in parole semplici che cos'è un anti-pattern? Qual è lo scopo? Cosa fanno? È una cosa brutta o buona cosa?

144
g.revolution

Anti-pattern sono determinati modelli nello sviluppo del software che sono considerati cattive pratiche di programmazione.

Al contrario di design patterns , che sono approcci comuni a problemi comuni che sono stati formalizzati e sono generalmente considerati una buona pratica di sviluppo, gli anti-pattern sono l'opposto e sono indesiderabili.

Ad esempio, nella programmazione orientata agli oggetti, l'idea è quella di separare il software in piccoli pezzi chiamati oggetti. Un anti-pattern nella programmazione orientata agli oggetti è un God object che esegue molte funzioni che sarebbero meglio separate in oggetti diversi.

Per esempio:

class GodObject {
    function PerformInitialization() {}
    function ReadFromFile() {}
    function WriteToFile() {}
    function DisplayToScreen() {}
    function PerformCalculation() {}
    function ValidateInput() {}
    // and so on... //
}

L'esempio sopra ha un oggetto che fa tutto. Nella programmazione orientata agli oggetti, sarebbe preferibile avere responsabilità ben definite per oggetti diversi per mantenere il codice meno accoppiato e in definitiva più gestibile:

class FileInputOutput {
    function ReadFromFile() {}
    function WriteToFile() {}
}

class UserInputOutput {
    function DisplayToScreen() {}
    function ValidateInput() {}
}

class Logic {
    function PerformInitialization() {}
    function PerformCalculation() {}
}

La linea di fondo è che ci sono buoni modi per sviluppare software con pattern comunemente usati ( design patterns ), ma ci sono anche modi in cui il software è sviluppato e implementato e può portare a problemi. I modelli considerati come cattive pratiche di sviluppo del software sono anti-pattern.

183
coobird

Ogni volta che sento parlare di Anti-pattern, ricordo un altro termine, cioè. Odore di design. 

"Gli odori del design sono determinate strutture nel design che indicano la violazione dei principi fondamentali del design e incidono negativamente sulla qualità del design". (Da "Refactoring for Software Design Smells: Managing technical debt")

Ci sono molti odori di design classificati in base a principi di progettazione che violano:

Abstraction odori

Missing Abstraction: Questo odore si verifica quando vengono usati grumi di dati o stringhe codificate invece di creare una classe o un'interfaccia.

Imperative Abstraction: Questo odore si manifesta quando un'operazione viene trasformata in una classe.

Incomplete Abstraction: Questo odore si manifesta quando un'astrazione non supporta completamente i metodi complementari o interrelati.

Multifaceted Abstraction: Questo odore si manifesta quando un'astrazione ha più di una responsabilità assegnata.

Unnecessary Abstraction: Questo odore si verifica quando un'astrazione che non è realmente necessaria (e quindi potrebbe essere stata evitata) viene introdotta in una progettazione software.

Unutilized Abstraction: Questo odore si manifesta quando un'astrazione viene lasciata inutilizzata (non direttamente utilizzata o non raggiungibile).

Duplicate Abstraction: Questo odore si manifesta quando due o più astrazioni hanno nomi identici o un'implementazione identica o entrambe.

Incapsulamento di odori

Encapsulation Deficient: Questo odore si verifica quando l'accessibilità dichiarata di uno o più membri di un'astrazione è più permissiva di quanto effettivamente richiesto.

Leaky Encapsulation: Questo odore si verifica quando un'astrazione "espone" o "perde" i dettagli di 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 di una gerarchia.

Encapsulation Unexploited: Questo odore si verifica quando il codice client usa controlli di tipo espliciti (usando ifer else o istruzioni switch che controllano il tipo dell'oggetto) invece di sfruttare la variazione nei tipi già incapsulati all'interno di una gerarchia.

Odori di modulazione

Modularizzazione interrotta: Questo odore si manifesta quando i dati e/oi metodi che idealmente avrebbero dovuto essere localizzati in una singola astrazione sono separati e distribuiti su più astrazioni.

Modularizzazione insufficiente: Questo odore si verifica quando esiste un'astrazione che non è stata completamente decomposta e un'ulteriore decomposizione potrebbe ridurne dimensioni, complessità di implementazione o entrambe.

Modularizzazione dipendente dal ciclo: Questo odore si verifica quando due o più astrazioni dipendono l'una dall'altra direttamente o indirettamente (creando un accoppiamento stretto tra le astrazioni).

Modularizzazione simile al mozzo: Questo odore si verifica quando un'astrazione ha dipendenze (sia in entrata che in uscita) con un gran numero di altre astrazioni.

La Gerarchia odora

Gerarchia mancante: Questo odore si verifica quando un segmento di codice utilizza la logica condizionale (in genere in combinazione con "tipi di tag") per gestire esplicitamente la variazione di comportamento in cui una gerarchia potrebbe essere stata creata e utilizzata per incapsulare tali variazioni.

Gerarchia non necessaria: Questo odore si verifica quando l'intera gerarchia dell'ereditarietà non è necessaria, indicando che l'eredità è stata applicata inutilmente per il particolare contesto di progettazione.

Gerarchia non fattorizzata: Questo odore si verifica quando c'è una duplicazione non necessaria tra i tipi in una gerarchia.

Wide Hierarchy: Questo odore si verifica quando una gerarchia di ereditarietà è "troppo" ampia e indica che potrebbero mancare tipi intermedi.

Gerarchia speculativa: Questo odore si verifica quando uno o più tipi in una gerarchia sono forniti in modo speculativo (cioè, in base a bisogni immaginati piuttosto che a requisiti reali).

Deep Hierarchy: Questo odore si manifesta quando una gerarchia dell'eredità è "eccessivamente" profonda.

Rebellious Hierarchy: Questo odore si verifica quando un sottotipo rifiuta i metodi forniti dai suoi supertipi.

Broken Hierarchy: Questo odore si verifica quando un supertipo e il suo sottotipo concettualmente non condividono una relazione "IS-A" che porta a una sostituibilità interrotta.

Gerarchia multipath: Questo odore si verifica quando un sottotipo eredita sia direttamente sia indirettamente da un supertipo che conduce a percorsi di ereditarietà non necessari nella gerarchia.

Cyclic Hierarchy: Questo odore si verifica quando un supertipo in una gerarchia dipende da uno qualsiasi dei suoi sottotipi.


La definizione e la classificazione di cui sopra sono descritte in "Rifattorizzazione per gli odori di progettazione software: Gestione del debito tecnico ". Alcune risorse più rilevanti potrebbero essere trovate qui .

42
Alex

Un modello è un'idea di come risolvere un problema di qualche classe. Un anti-pattern è un'idea di come non risolverlo perché implementare quell'idea porterebbe a un cattivo design.

Un esempio: un "pattern" sarebbe usare una funzione per riutilizzare il codice, un "anti-pattern" sarebbe usare copy-paste per lo stesso. Entrambi risolvono lo stesso problema, ma l'uso di una funzione di solito porta a un codice più leggibile e gestibile rispetto al copia-incolla.

32
sharptooth

Un anti-pattern è un modo per non risolvere un problema. Ma c'è dell'altro: è anche un modo che può essere visto frequentemente nei tentativi di risolvere il problema.

15

Se desideri davvero studiare AntiPatterns, scarica il libro AntiPatterns (ISBN-13: 978-0471197133).

In esso, definiscono "An AntiPattern è una forma letteraria che descrive una soluzione comune a un problema che genera conseguenze decisamente negative".

Quindi, se si tratta di una cattiva pratica di programmazione, ma non di una comune, limitata a un'applicazione, a un'azienda oa un programmatore, non soddisfa la parte "Motivo" della definizione di AntiPattern.

9
kmarsh

Un modo comune per fare casino. Come la classe dio/kitchensink (fa tutto), per esempio.

7
Robert Gould

An anti-pattern è il complemento di un pattern design. Un anti-pattern è una soluzione modello che non si dovrebbe usare in una determinata situazione.

6
xxmajia

Proprio come con un pattern design, un anti-pattern è anche un modello e un modo ripetibile per risolvere un determinato problema, ma in modo non ottimale e inefficace.

6
Darnell

È interessante notare che un determinato modo di risolvere un problema può essere sia un modello che un anti-modello. Singleton è il primo esempio di questo. Apparirà in entrambi i gruppi di letteratura.

5
Ed Sykes

Oggi, i ricercatori e i professionisti dell'ingegneria del software spesso usano i termini "anti-pattern" e "odore" in modo intercambiabile. Tuttavia, concettualmente non sono la stessa cosa. La voce di Wikipedia di anti-pattern afferma che un anti-pattern è diverso da una cattiva pratica o una cattiva idea di almeno due fattori. È un anti-modello

"Un processo, una struttura o un modello di azione di uso comune che nonostante Inizialmente sembra essere una risposta appropriata ed efficace a un problema , In genere ha conseguenze più negative dei risultati positivi."

Indica chiaramente che un anti-modello è scelto nella convinzione che sia una buona soluzione (come modello) al problema presentato; tuttavia, porta più responsabilità che benefici. D'altra parte, un odore è semplicemente una cattiva pratica che influisce negativamente sulla qualità di un sistema software. Ad esempio, Singleton è un anti-modello e la classe di Dio (o Modularizzazione insufficiente) è un odore di design.

3
Tushar

Gli anti-schemi sono modi comuni in cui le persone tendono a programmare nel modo sbagliato, o almeno nel modo meno buono.

2

Qualsiasi modello di progettazione che sta facendo più male che bene per l'ambiente di sviluppo software dato sarebbe considerato come anti-pattern.

Alcuni anti-pattern sono ovvi ma altri no. Ad esempio Singleton, anche se molti lo considerano un buon modello di design vecchio ma ce ne sono altri che non lo fanno.

Puoi controllare la domanda Cosa c'è di così male nei singleton? per capire meglio le diverse opinioni su di esso.

0
Himanshu Negi