Design pattern: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m r2.7.1) (Bot: Aggiungo: gl:Patrón de deseño |
→Pattern di concorrenza: fix wl |
||
(97 versioni intermedie di 64 utenti non mostrate) | |||
Riga 1:
{{nota disambigua|descrizione=il libro|titolo=
{{F|programmazione|aprile 2013}}
'''Design pattern''' (traducibile in [[lingua italiana]] come "schema progettuale", "schema di progettazione", o "schema architetturale"), in [[informatica]] e specialmente nell'ambito dell'[[ingegneria del software]], è un concetto che può essere definito "una soluzione [[progetto|progettuale]] generale ad un problema ricorrente". Si tratta di una descrizione o modello logico da applicare per la risoluzione di un problema che può presentarsi in diverse situazioni durante le fasi di [[Ciclo di vita del software|progettazione e sviluppo del software]], ancor prima della definizione dell'[[algoritmo]] risolutivo della parte computazionale. È un approccio spesso efficace nel contenere o ridurre il [[debito tecnico]].
I design pattern [[object oriented|orientati agli oggetti]] tipicamente mostrano relazioni ed interazioni tra [[classe (informatica)|classi]] o [[oggetto (informatica)|oggetti]], senza specificare le classi applicative finali coinvolte
▲I design pattern orientati agli oggetti tipicamente mostrano relazioni ed interazioni tra classi o oggetti, senza specificare le classi applicative finali coinvolte. Tali pattern risiedono quindi nel dominio dei moduli e delle interconnessioni. Ad un livello più alto sono invece i Pattern architetturali che hanno un ambito ben più ampio, descrivendo un pattern complessivo adottato dall'intero sistema.
== Storia ==
Il termine fu inizialmente introdotto in [[architettura]] in un celebre saggio di [[Christopher Alexander]]; in seguito, proprio l'opera di Alexander ispirò la nascita di un settore dell'ingegneria del software dedicato all'applicazione del concetto di design pattern alle [[architettura software|architetture software]], soprattutto [[programmazione orientata agli oggetti|
Il tema dei pattern viene oggi considerato una delle linee principali di sviluppo dell'ingegneria del software object-oriented. Esso trova applicazioni in tutta una serie di contesti di grande interesse per l'[[industria del software]], dallo [[componente software|sviluppo di software basato su componenti]], ai [[sistema aperto|sistemi aperti]], ai [[framework]] e così via. La maggior parte dei [[linguaggio di programmazione|linguaggi di programmazione]] moderni, e di tecnologie correlate, sono stati progettati (o modificati) tenendo conto anche dell'obiettivo di essere coerenti con questo approccio emergente allo sviluppo del software.
La nascita del "movimento" dei pattern in informatica si deve al celebre libro ''[[Design Patterns|Design Patterns: Elementi per il riuso di software ad oggetti]]'' di [[Erich Gamma]], [[Richard Helm]], [[Ralph Johnson (informatico)|Ralph Johnson]] e [[John Vlissides]] ([[1995]]). Grazie al successo di quest'opera, i suoi quattro autori divennero nomi talmente citati che la comunità scientifica iniziò, per brevità, a identificarli collettivamente con un nomignolo: la "banda dei quattro" (''[[Gang of
== Struttura
*
▲Un ''design pattern'' è costituito da:
*
*
*
L'uso di [[pattern]] nella descrizione di altri pattern dà origine ai cosiddetti [[linguaggio di pattern|linguaggi di pattern]].
▲* ''il nome'', costituito da una o due parole che siano il più possibile rappresentative del pattern stesso;
▲* ''il problema'', ovvero la descrizione della situazione alla quale si può applicare il pattern. Può comprendere la descrizione di [[Classe (informatica)|classi]] o di problemi di progettazione specifici, come anche una lista di condizioni perché sia necessario l'utilizzo del pattern;
▲* ''la soluzione'', che descrive gli elementi costitutivi del progetto con le relazioni e relative implicazioni, senza però addentrarsi in una specifica implementazione. Il concetto è di presentare un problema astratto e la relativa configurazione di elementi adatta a risolverlo;
▲* ''le conseguenze'', i risultati e i vincoli che derivano dall'applicazione del pattern. Sono fondamentali in quanto possono essere l'ago della bilancia nella scelta dei pattern: le conseguenze comprendono considerazioni di tempo e di spazio, possono descrivere implicazioni del pattern con alcuni linguaggi di programmazione e l'impatto con il resto del progetto.
▲L'uso di [[pattern]] nella descrizione di altri pattern dà origine ai cosiddetti [[linguaggio di pattern|linguaggi di pattern]].
I design pattern possono essere classificati con diversi criteri, i più comuni dei quali sono quelli che evidenziano il tipo di problema che si cerca di risolvere. Il tipo di problema può essere legato ad uno specifico dominio progettuale ([[telecomunicazioni]], [[rete informatica|reti]], [[software
Nel loro [[Design Patterns|libro]] la "
▲== Classificazione dei design pattern ==
▲I design pattern possono essere classificati con diversi criteri, i più comuni dei quali sono quelli che evidenziano il tipo di problema che si cerca di risolvere. Il tipo di problema può essere legato ad uno specifico dominio progettuale (telecomunicazioni, reti, software...) oppure, più comunemente, al problema progettuale in senso più ampio (nell'[[ingegneria del software]], ad esempio, si può parlare di creazione, comportamento, navigazione di oggetti o [[strutture dati]]).
▲Nel loro [[Design Patterns|libro]] la "[[Gang of four|banda dei quattro]]" identificò 23 tipi di design pattern, suddivisi in 3 categorie: strutturali, creazionali e comportamentali.
=== Pattern creazionali ===
I pattern creazionali risolvono problematiche inerenti all'istanziazione degli oggetti
* L'[[
* Il [[
* Il [[
* La [[
* Il [[
* Il [[Singleton (informatica)|singleton]] ("singoletto") ha lo scopo di assicurare che di una classe possa essere creata una sola istanza in sistemi con un unico thread.
* Il [[Interblocco ricontrollato|double-checked locking]] ("Interblocco ricontrollato") ha lo scopo di assicurare che di una classe possa essere creata una sola istanza in sistemi multithread.
=== Pattern strutturali ===
I pattern strutturali
* L'[[Adapter pattern|
* [[Bridge pattern|Bridge]] ("ponte") permette di separare l'astrazione di una classe dalla sua implementazione, per permettere loro di variare indipendentemente.
* Il [[
* Il [[Container pattern|
* Il [[
* [[Extensibility pattern|Extensibility]] ("estendibilità")
* Il [[Façade pattern|
* [[Flyweight pattern|Flyweight]] ("peso piuma"), che permette di separare la parte variabile di una classe dalla parte che può essere riutilizzata.
* [[Proxy pattern|Proxy]] fornisce una rappresentazione di un oggetto di accesso difficile o che richiede un tempo importante per
* [[Pipes and filters]] ("condotti e filtri")
* [[Private class data pattern|Private class data]] ("dati di classe privati")
Line 58 ⟶ 56:
I pattern comportamentali forniscono soluzione alle più comuni tipologie di interazione tra gli oggetti.
* [[Chain of responsibility pattern|Chain of
* Il [[Command pattern|
* [[Event listener
* [[Hierarchical visitor pattern|Hierarchical
* [[Interpreter pattern|Interpreter]] ("interprete") dato un linguaggio, definisce una rappresentazione della sua grammatica insieme ad un interprete che utilizza questa rappresentazione per l'interpretazione delle espressioni in quel determinato linguaggio.
* L'[[Iterator pattern|
* Il [[Mediator pattern|
* Il
* L'[[Observer pattern|
* [[Single-serving visitor pattern|Single-serving
* [[State pattern|State]] ("stato") permette ad un oggetto di cambiare il suo comportamento al cambiare di un suo stato interno.
* Lo [[Strategy pattern|
* Il [[
* Il [[
* [[Null object]] ("oggetto nullo") permette di sostituire un riferimento nullo con un oggetto che non fa nulla.
== Altri tipi di pattern ==
Alcuni pattern definiti nella letteratura non operano a livello di design del sistema, non possono quindi essere definiti propriamente design pattern. Alcuni esempi sono:
Line 83 ⟶ 81:
* [[Broker pattern|Broker]]
* [[Client-server]], rappresenta un tipo di applicazione di rete nel quale un computer client istanzia l'interfaccia utente di un'applicazione connettendosi ad una server application o ad un sistema di database.
* [[Layers pattern|Layers]],
* [[Microkernel pattern|Microkernel]]
* [[Model-
* [[Model-view-viewmodel]] (spesso abbreviato in ''MVVM'')
* [[Naked objects
* [[Pipes and filters]]
* [[Presentation Abstraction Control pattern|Presentation Abstraction Control]]
* [[Reflection pattern|Reflection]], fornisce un meccanismo per cambiare la struttura e il comportamento di sistemi software in modo dinamico. Supporta la modifica di aspetti fondamentali, quali tipo di strutture e meccanismi di chiamata di funzione.
* [[Repository]], pattern architetturale legato ad aspetti di persistenza
* [[Front controller]], pattern architetturale che prevede l'utilizzo di un singolo file per gestire tutte le richieste
* [[Data Access Object]], per la gestione della [[Persistenza (informatica)|persistenza]]: si tratta fondamentalmente di una [[Classe (informatica)|classe]] con relativi [[Metodo (informatica)|metodi]] che rappresenta un'[[Modello relazionale|entità tabellare]] di un [[RDBMS]].
* [[Data Transfer Object]], per trasferire dati tra sottosistemi di un'applicazione software. I DTO sono spesso usati in congiunzione con gli oggetti di accesso ai dati (DAO) per recuperare i suddetti da una [[base di dati]].
* [[Active record pattern]], tipicamente utilizzato in librerie di persistenza e in [[Object-relational mapping|Object-relational mapper]].
=== Pattern di metodologia ===
* [[
* [[Make it run, make it right, make it fast, make it small]]
=== Pattern di concorrenza ===
Nel caso di processi che eseguono contemporaneamente delle attività su dati condivisi si parla di [[concorrenza (informatica)|concorrenza]]. Alcuni design pattern sono stati sviluppati per mantenere [[sincronizzazione
* [[Active Object]]
* [[Balking pattern]]
* [[Interblocco ricontrollato|Double checked locking pattern]]
* [[Guarded suspension]]
* [[Leaders followers pattern|Leaders/followers pattern]]
Line 112 ⟶ 115:
== Bibliografia ==
* [[Erich Gamma|Gamma, E.]], [[Richard Helm|Helm, R.]], [[Ralph Johnson (informatico)|Johnson, R.]] e [[John Vlissides|Vlissides, J.]], '' [[Design Patterns]]: elementi per il riuso di software a oggetti'', Addison Wesley,
** Originale: ''Design Patterns: Elements of Reusable Object-Oriented Software'', Addison Wesley,
* [[Bruce Eckel|Eckel, B.]], ''[https://web.archive.org/web/20050408055821/http://www.mindview.net/Books/TIPatterns
== Voci correlate ==
* [[Anti-pattern]]
* [[Debito tecnico]]
* [[Model-view-controller]]
* [[Pattern]]
== Altri progetti ==
{{interprogetto|
== Collegamenti esterni ==
* {{Collegamenti esterni}}
* [http://c2.com/cgi/wiki?WelcomeVisitors Portland Pattern Repository]▼
* {{FOLDOC}}
* [http://hillside.net/patterns/ Hillside] Patterns Library
*
*
*
{{Controllo di autorità}}
{{portale|informatica}}
▲[[da:Design pattern]]
▲[[en:Design pattern (computer science)]]
▲[[simple:Design pattern]]
|