Introduzione ai pattern di progettazione
Fa parte della sezione Programmazione orientata agli oggetti del percorso C# di Coddy. Lezione 51 di 70.
I pattern di progettazione sono soluzioni collaudate a problemi comuni che gli sviluppatori incontrano ripetutamente quando realizzano software. Invece di reinventare la ruota ogni volta, i pattern ci offrono un vocabolario condiviso e approcci verificati per strutturare il codice.
Considera i design pattern come progetti. Non ti forniscono codice esatto da copiare, ma descrivono come organizzare classi e oggetti per risolvere sfide specifiche. Quando qualcuno dice «usa qui il pattern Factory», gli sviluppatori esperti capiscono immediatamente la struttura generale proposta.
I pattern di progettazione rientrano in tre categorie principali:
| Categoria | Scopo | Esempi |
|---|---|---|
| Creazionali | Come vengono creati gli oggetti | Singleton, Factory |
| Strutturali | Come sono composti gli oggetti | Adapter, Decorator |
| Comportamentali | Come comunicano gli oggetti | Observer, Strategy |
I pattern che esploreremo si basano direttamente sui concetti di OOP che hai già imparato: interfacce, ereditarietà, polimorfismo e composizione. Ogni pattern sfrutta questi fondamenti in modi specifici per ottenere flessibilità, manutenibilità o riutilizzabilità.
Nelle prossime lezioni implementerai diversi pattern essenziali, a partire da Singleton, Factory, Observer e Strategy. Comprendere questi pattern ti aiuterà a riconoscere soluzioni comuni nei codebase esistenti e a prendere decisioni architetturali migliori nei tuoi progetti.
Sfida
FacileCostruiamo un semplice sistema di catalogo di pattern che organizza le informazioni sui pattern di progettazione in più file. Questo ti aiuterà a capire come vengono categorizzati i pattern e, allo stesso tempo, a esercitarti a organizzare bene il codice.
Creerai tre file per separare le diverse responsabilità:
Pattern.cs: Definisci una classePatternnello spazio dei nomiPatternsche rappresenta un singolo pattern di progettazione. Ogni pattern dovrebbe avere unName, unaCategory(Creational, Structural o Behavioral) e unaDescription. Includi un metodoGetSummary()che restituisce una stringa formattata:[{Category}] {Name}: {Description}PatternCatalog.cs: Crea una classePatternCatalognello spazio dei nomiPatternsche gestisce una raccolta di pattern. Il tuo catalogo dovrebbe poter aggiungere pattern e avere un metodoGetPatternsByCategory(string category)che restituisce un elenco di tutti i pattern corrispondenti a quella categoria. Includi anche un metodoGetAllSummaries()che restituisce un elenco di stringhe riepilogative per tutti i pattern del catalogo.Program.cs: Metti insieme tutti gli elementi creando un catalogo e popolandolo con i pattern in base all'input. Poi mostra i pattern filtrati per categoria.
Riceverai i seguenti input:
- Il numero di pattern da aggiungere
- Per ogni pattern: tre righe contenenti nome, categoria e descrizione
- Una categoria per cui filtrare
Dopo aver aggiunto tutti i pattern al catalogo, stampa i riepiloghi dei pattern che corrispondono alla categoria del filtro, uno per riga. Se nessun pattern corrisponde, stampa No patterns found.
Ad esempio, se gli input sono:
3
Singleton
Creational
Ensures only one instance exists
Observer
Behavioral
Notifies dependents of state changes
Factory
Creational
Creates objects without specifying exact class
CreationalL'output dovrebbe essere:
[Creational] Singleton: Ensures only one instance exists
[Creational] Factory: Creates objects without specifying exact classQuesta sfida mostra come organizzare classi correlate in file separati mantenga il codice pulito e facile da manutenere: un principio che diventa ancora più importante quando implementerai veri pattern di progettazione nelle prossime lezioni!
Provalo tu
using System;
using System.Collections.Generic;
using Patterns;
class Program
{
public static void Main(string[] args)
{
// Leggi il numero di pattern
int n = Convert.ToInt32(Console.ReadLine());
// Crea un nuovo PatternCatalog
PatternCatalog catalog = new PatternCatalog();
// TODO: Leggi i dettagli di ogni pattern (name, category, description)
// e aggiungili al catalogo
for (int i = 0; i < n; i++)
{
string name = Console.ReadLine();
string category = Console.ReadLine();
string description = Console.ReadLine();
// TODO: Crea un Pattern e aggiungilo al catalogo
}
// Leggi la categoria in base alla quale filtrare
string filterCategory = Console.ReadLine();
// TODO: Ottieni i pattern in base alla categoria di filtro
// e stampa i relativi riepiloghi
// Se nessun pattern corrisponde, stampa "No patterns found"
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniNamespace e direttiveIntroduzione a classi e oggettiLa parola chiave "this"Metodi e parametriCampi e proprietàCostruttoriInizializzatori di oggettiRiepilogo - Calcolatrice semplice4Ereditarietà
Sintassi di base dell'ereditarietà (:)La parola chiave 'base'Parole chiave virtual e overrideClassi sealedLa classe base 'object'Riepilogo - Gerarchia dei dipendenti7Funzionalità avanzate
Sovraccarico degli operatoriIndicizzatori (this[])Override di ToString()Metodi di estensioneRiepilogo - Lista personalizzata10Pattern di progettazione Parte 1
Introduzione ai pattern di progettazioneSingleton thread-safePattern FactoryPattern Observer (eventi)Pattern Strategy2Proprietà e membri statici
Proprietà implementate automaticamenteProprietà di sola lettura e di sola scritturaCampi e metodi staticiClassi staticheMembri con corpo di espressione5Polimorfismo e interfacce
Polimorfismo a compile time e runtimeInterfaccia o classe astrattaInterfacce multipleInterfacce espliciteUpcasting e downcastingRipasso: calcolatore di forme8Concetti avanzati di programmazione a oggetti
Composizione invece dell'ereditarietàTipi generici (classi e metodi)Delegati ed eventiAttributi e reflectionIDisposable e istruzione usingNozioni di base sull'iniezione delle dipendenze11Pattern di progettazione, parte 2
Pattern del ComandoPattern dell’AdattatorePattern del DecoratorePattern Template MethodPattern dello StatoPattern Composito3Architettura delle classi
Dati di istanza vs staticiParole chiave 'readonly' e 'const'Campi di supportoRiepilogo - Gestore di conti bancari6Incapsulamento
Modificatori di accessoProprietà per l'incapsulamentoImplementazione dell'occultamento dei datiModelli di immutabilitàRiepilogo - Registri degli studentiEsercitati da solo: Compilatore C# online