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

Refactoring

object-oriented), per esempio delle metodologie agili, dell'extreme programming, e del test driven development. Benché il concetto generale di refactoring

Haskell (linguaggio di programmazione)

Tutto iniziò nel 1978 con il discorso di John Backus intitolato "Can Programming be liberated from the Von Neumann style?" con il quale si proponeva la

Pattern matching

^ pattern_matching - Documentation for Ruby 3.0.0, su docs.ruby-lang.org. URL consultato il 6 luglio 2021. ^ Pattern Syntax - The Rust Programming Language

Java (linguaggio di programmazione)

Programming Language, First Edition The Java Programming Language, Second Edition The Java Programming Language, Third Edition The Java Programming Language

Test driven development

(o la sua riscoperta) si deve a Kent Beck, uno dei padri dell'extreme programming (XP) e delle metodologie agili. Il TDD è una delle 12 regole base dell'XP

Paradigma di programmazione

Harper, What, if anything, is a programming-paradigm?, su FifteenEightyFour, 1º May 2017. ^ Krishnamurthi, Teaching programming languages in a post-linnaean

Apprendimento automatico

sotto diversi nomi quali statistica computazionale, riconoscimento di pattern, reti neurali artificiali, filtraggio adattivo, teoria dei sistemi dinamici

Elixir (linguaggio di programmazione)

dall'url originale il 18 aprile 2012). ^ Elixir - A modern approach to programming for the Erlang VM, su vimeo.com. URL consultato il 17 febbraio 2013.