In informatica, in particolare nell'ingegneria del software, gli anti-pattern (o antipattern) sono dei design pattern, o, più in generale, delle procedure o modi di fare, usati durante il processo di sviluppo del software che, pur essendo lecitamente utilizzabili, si rivelano successivamente inadatti o controproducenti nella pratica[1][2]. Il termine fu coniato nel 1995 da Andrew Koenig, ispirato dal libro Design Patterns: Elementi per il riuso di software ad oggetti scritto dalla Gang of Four (la banda dei quattro), i quali svilupparono il concetto di pattern nel campo del software.

Fu, tuttavia, il libro AntiPatterns del 1998 a rendere popolare l'idea e ad ampliarne l'ambito oltre il campo del design del software, includendo anche l'architettura software e la gestione dei progetti[3]. Successivamente, altri autori hanno ulteriormente esteso il concetto per abbracciare antipattern ambientali, organizzativi e culturali[3].

Definizione

modifica

Secondo gli autori, devono presentarsi almeno due elementi chiave per poter distinguere un anti-pattern da un semplice errore logico o cattiva abitudine:

  • Qualche schema ricorrente di azioni, processi o strutture che inizialmente appaiono essere di beneficio, ma successivamente producono più problemi che benefici.
  • L'esistenza di una soluzione alternativa che è chiaramente documentata, collaudata nella pratica e ripetibile, ma che non viene adottata.

Molti anti-pattern sono poco più che errori, problemi irrisolvibili o cattive pratiche da evitare quando possibile. A volte chiamati "pitfalls" (tranelli) o dark pattern (modelli oscuri) se invece sono volutamente ingannevoli, si riferiscono a classi di soluzioni di problemi reinventate in modo sbagliato.

Una guida comunemente utilizzata è la "regola del tre," simile a quella per i pattern: per essere considerato un antipattern, deve essere stato osservato almeno tre volte.[3]

Uso

modifica

Per prevenire errori che tendono a ripetersi, si può individuare la frequenza con la quale questi si ripetono, e imparare come altre persone hanno rimediato a questi cattivi pattern.

Documentare gli antipattern può essere un metodo efficace per analizzare un ambito problematico e raccogliere conoscenze esperte.[4]

Sebbene alcune descrizioni di antipattern si limitino a documentare le conseguenze negative del pattern, una buona documentazione di un antipattern fornisce anche un'alternativa o un modo per attenuarlo.

Gli anti-pattern più comuni

modifica

(Nota: il nome in inglese è stato lasciato in quanto è quello con cui i pattern, e gli anti-pattern, sono conosciuti nella lingua italiana)

Organizzativi
  • Progettazione orientata alla commissione (design by committee): presenza di molte persone che contribuiscono a una progettazione, ma mancanza di una visione globale condivisa
  • Corpi tiepidi (warm bodies): aggiungere a un progetto nuovi programmatori che non riusciranno a fare quasi nulla per mancanza di esperienza su di esso
  • Paralisi da analisi (analysis paralysis): progetto fermo nella fase di analisi, ad esempio perché si sta vagliando un ventaglio di soluzioni troppo ampio senza riuscire a sceglierne una, o perché la si sta dettagliando eccessivamente
  • Sistema a tubo da stufa (stovepipe system): organizzazione in cui ogni team è isolato dagli altri, e le comunicazioni sono rese possibili solo verso l'alto o il basso della gerarchia
Nel management
  • Fumo e specchi (smoke and mirrors): mostrare una funzionalità del programma che in realtà non esiste ancora, ad esempio tramite schermate fittizie, senza che l'osservatore sappia che lo sono
  • Gestione a fungo (mushroom management): team in cui ogni impiegato è tenuto isolato, con un compito specifico, senza poter comunicare con i compagni
  • Marcia della morte (death march): progetto i cui vantaggi sono troppo scarsi rispetto alle risorse richieste per svilupparlo, che costringe i programmatori a sforzi pesantissimi e a un numero consistente di ore di straordinario, ma che è comunque destinato a fallire
  • Elefante nella stanza (elephant in the room): ignorare o minimizzare un problema anche se ovvio e appariscente, al fine di evitarlo
Di sviluppo
  • Ancora di nave (boat anchor): mantenere una porzione di codice sorgente diventata inutile
  • Busy waiting: ciclo continuo di attesa di un evento
  • Azione a distanza (action at a distance): modifica che impatta su parti di codice molto lontane tra loro
  • Errore di cache (caching failure): non azzerare o svuotare una cache contenente un errore, dopo che è stato risolto
  • Carica e spara (accumulate and fire): subroutine i cui input sono variabili globali
  • Codice maleodorante (code smell): piccolo malfunzionamento, che però è sintomo di un grande problema più nascosto
  • Colata di lava (lava flow): mantenere porzioni di codice la cui rimozione è rischiosa o può causare conseguenze non determinabili
  • Complessità involontaria (accidental complexity): apparente necessità di sviluppare codice complesso, che invece sarebbe già disponibile in qualche libreria
  • Enorme palla di fango (big ball of mud): sistema costruito in modo caotico, senza una struttura riconoscibile
  • Fede cieca (blind faith): non verificare il risultato di una funzione o il manifestarsi di un errore
  • Inerzia del codice (code momentum): presenza eccessiva di vincoli e dipendenze, che rendono difficili le modifiche
  • Inferno delle DLL (DLL hell): presenza di conflitti tra le DLL da cui il programma dipende
  • Nelle mani del fornitore (vendor lock-in): dipendenza troppo stretta da uno specifico fornitore, non sostituibile se non a costi elevati
  • Input ad-hoc (input kludge): incapacità di gestire dati inseriti nell'interfaccia utente (input) non validi
  • Interblocco ricontrollato (double-checked locking): inizializzazione parziale di un oggetto condiviso tra thread
  • Interfaccia enorme (interface bloat): incorporare troppe operazioni in una sola interfaccia
  • Invecchiamento rapido (continuous obsolescence): sistema le cui nuove versioni sono troppo diverse dalle precedenti, e che quindi invecchia rapidamente e di continuo
  • Inversione di astrazione (abstraction inversion): non esporre funzionalità utili, costringendo a reimplementarle
  • Kitchen sink: oggetto che contiene un gran numero di operazioni complesse ed eterogenee tra loro
  • Numero magico (magic number): inserire costanti negli algoritmi senza documentarne il significato o lo scopo
  • Oggetto Dio (God object): implementare una grossa funzionalità in un unico oggetto che esegue tutte le operazioni, invece che in più oggetti che si dividono il compito;
  • Ottimizzazione prematura (premature optimization): scrivere codice molto ottimizzato, ma poco leggibile
  • Poltergeist: oggetto il cui unico compito è passare informazioni a un unico altro oggetto
  • Priorità alle estensioni (feature creep): aggiungere ulteriori caratteristiche al progetto, andando ben oltre il requisito iniziale
  • Problema dello yo-yo (yo-yo problem): struttura eccessivamente frammentata e quindi difficile da comprendere
  • Programmazione cargo cult (cargo cult programming): inserire una porzione di programma ignorandone scopo o principio di funzionamento
  • Programmazione copia e incolla (copy and paste programming): implementare una funzionalità simile ad un'altra copiandone e incollandone il codice piuttosto che creando una subroutine condivisa
  • Pulsante magico (magic pushbutton): pulsante che contiene anche la propria logica applicativa, invece che tenerla separata
  • Punto di vista ambiguo (ambiguous viewpoint): diagramma che indica solo le parti, ma non cosa compongono, ad esempio senza distinguere tra parti di interfaccia e di implementazione
  • Reinventare la ruota (reinventing the wheel): reimplementare un metodo che è già stato implementato, testato e ottimizzato da qualcun altro
  • Reinventare la ruota quadrata (reinventing the Square Wheel): come reinventing the wheel, ma il risultato della reimplementazione è peggiore del metodo esistente
  • Saltare il primo (Fencepost o anche off-by-one error): partire dall'indice iniziale sbagliato in un loop (ad esempio in Java iniziare il loop su un array partendo da 1 invece che da 0, o contare un intervallo di valori escludendo il primo, tipicamente il numero di giorni di validità compreso fra due date dimenticando che il primo giorno va considerato)
  • Software che ingrassa (software bloat): tendenza di un'applicazione ad avere programmi di installazione che crescono a dismisura
  • Spaghetti code (spaghetti code): codice con un flusso incomprensibile
  • Codifica fissa (hard code): inserire costanti nel codice piuttosto che in file di configurazione
  • Valori esterni (soft code): inserire logica applicativa in file di configurazione (ad esempio con un linguaggio di comandi) piuttosto che nel codice
  • Vicolo cieco (Dead End): dover modificare una componente su cui il supporto da parte di chi l'ha fornita è cessato

Note

modifica
  1. ^ Ambler, Scott W., Process patterns: building large-scale systems using object technology, 1998, p. 4, ISBN 0-521-64568-9.
    «...common approaches to solving recurring problems that prove to be ineffective. These approaches are called antipatterns.»
  2. ^ Budgen, D., Software design, 2003, p. 225, ISBN 0-201-72219-4.
    «As described in Long (2001), design anti-patterns are 'obvious, but wrong, solutions to recurring problems'.»
  3. ^ a b c Colin J. Neill, Phillip A. Laplante e Joanna F. DeFranco, Antipatterns: managing software organizations and people, collana Applied software engineering series, 2nd ed (Online-Ausg.), CRC Press/Auerbach Publications, 2012, pp. 4-6, ISBN 978-1-4398-6216-2.
  4. ^ Edward Jimenez, AntiPatterns, aprile 2006.

Bibliografia

modifica
  • William J. Brown, Raphael C. Malveau, Hays W. McCormick III, e Thomas J. Mowbray. 1998. AntiPatterns: Refactoring Software, Architectures, and Projects in Crisis. John Wiley & Sons ISBN 0-471-19713-0.

Altri progetti

modifica

Collegamenti esterni

modifica
Controllo di autoritàLCCN (ENsh00000119 · J9U (ENHE987007290697705171
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica

📚 Artikel Terkait di Wikipedia

Business Process Model and Notation

(Johnson Space Center), 2004. ^ Stephen A. White, Process Modeling Notations and Workflow Patterns (PDF), su bpmn.org, 2006 (archiviato dall'url originale

Design pattern

Disambiguazione – Se stai cercando il libro, vedi Design Patterns. Questa voce o sezione sull'argomento programmazione non cita le fonti necessarie o quelle

Sionismo

30 novembre 2022). Colbert C. Held, John Thomas Cummings, Middle East Patterns: Places, People, and Politics, 6th ed. Hachette UK, 2013, p.255 "It called

Dark pattern

reclami in 11 paesi dell’UE. Noyb ha accusato Meta di utilizzare "dark patterns" per compromettere il consenso degli utenti, in violazione del Regolamento

Business Process Execution Language

BPEL (sigla di Business Process Execution Language) è un linguaggio basato sull'XML costruito per descrivere formalmente i processi commerciali e industriali

Intelligenza artificiale

2025. ^ Hao Cui e Taha Yasseri, AI-enhanced collective intelligence, in Patterns, vol. 5, n. 11, 8 novembre 2024, p. 101074, DOI:10.1016/j.patter.2024.101074

Processo stazionario

In matematica e statistica, un processo stazionario (o processo fortemente stazionario) è un processo stocastico la cui distribuzione di probabilità congiunta

Craig Larman

Unified Process - ISBN 0-13-092569-1 2003 - Agile and Iterative Development: A Manager's Guide - ISBN 0-13-111155-8 2004 - Applying UML and Patterns: An Introduction