Introduzione ai design pattern
Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 70 di 91.
I design pattern sono soluzioni collaudate a problemi comuni che gli sviluppatori incontrano ripetutamente durante la creazione di software. Invece di reinventare ogni volta la ruota, puoi applicare questi modelli consolidati per risolvere sfide simili nel tuo codice.
Pensa ai design pattern come a ricetta. Proprio come uno chef segue una ricetta per creare un piatto perfezionato nel tempo, gli sviluppatori usano i design pattern per strutturare il codice in modi che sono stati testati e perfezionati da innumerevoli programmatori prima di loro.
I pattern di progettazione sono in genere raggruppati in tre categorie:
| Categoria | Scopo | Esempi |
|---|---|---|
| Creazionali | Come vengono creati gli oggetti | Singleton, Factory |
| Strutturali | Come vengono composti gli oggetti | Adapter, Decorator |
| Comportamentali | Come comunicano gli oggetti | Observer, Strategy |
In realtà, hai usato schemi durante tutto il corso senza rendertene conto. Quando hai creato classi astratte con metodi che le classi figlie devono implementare, stavi applicando una forma del pattern Template Method. Quando hai usato le interfacce per definire contratti, ti stavi preparando al pattern Strategy.
Imparare i design pattern ti fornisce un vocabolario comune con gli altri sviluppatori. Invece di spiegare nel dettaglio una struttura complessa, puoi semplicemente dire "Qui ho usato il pattern Factory" e gli sviluppatori esperti capiranno subito il tuo approccio. Nelle lezioni successive, implementeremo in PHP diversi pattern essenziali.
Sfida
FacileCostruiamo un semplice sistema di formattazione dei messaggi che dimostri come i pattern di progettazione aiutino a organizzare il codice. Individuerai a quale categoria di pattern appartiene ciascun componente e vedrai come le diverse parti di un sistema collaborano.
Organizzerai il codice in tre file:
MessageFormatter.php: crea un’interfaccia chiamataMessageFormatterche definisce un contratto per la formattazione dei messaggi. Dovrebbe avere un unico metodoformat(string $message): string. Questo rappresenta la categoria comportamentale. Definisce il modo in cui gli oggetti comunicano ed elaborano i dati.Formatters.php: includi il file MessageFormatter e crea due classi che implementano l’interfaccia:UppercaseFormatter: il suo metodoformat()restituisce il messaggio convertito in maiuscoloBracketFormatter: il suo metodoformat()racchiude il messaggio tra parentesi quadre, come[message]
main.php: includi il file Formatters. Riceverai due input: una stringa con il messaggio e un tipo di formattatore ("upper"o"bracket").Crea una funzione chiamata
processMessageche accetti unMessageFormattere una stringa con il messaggio, quindi restituisca il risultato formattato. Questa funzione non deve sapere quale formattatore specifico riceve. Si limita a chiamareformat()sull’oggetto passato.In base al tipo di formattatore ricevuto come input, crea l’oggetto del formattatore appropriato. Passalo alla tua funzione
processMessageinsieme al messaggio e stampa il risultato.Su una nuova riga, stampa a quale categoria di pattern appartiene questa struttura. Poiché definiamo comportamenti intercambiabili tramite un’interfaccia, stampa:
Pattern category: Behavioral
Questa sfida mostra come le interfacce permettano di sostituire le implementazioni senza modificare il codice che le utilizza: una base per pattern come Strategy, che esplorerai nelle prossime lezioni.
Provalo tu
<?php
require_once 'Formatters.php';
// Leggi l'input
$message = trim(fgets(STDIN));
$formatterType = trim(fgets(STDIN));
// TODO: Crea una funzione chiamata processMessage che accetti un MessageFormatter
// e una stringa di messaggio, quindi restituisca il risultato formattato
// TODO: In base a $formatterType ("upper" o "bracket"), crea il formatter appropriato
// TODO: Chiama processMessage con il formatter e il messaggio, quindi stampa il risultato
// TODO: Stampa la categoria del pattern su una nuova riga
// Formato: "Pattern category: Behavioral"
?>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 esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave $thisMetodiProprietàCostruttore (__construct)Distruttore (__destruct)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa parola chiave parent::Sovrascrittura dei metodiLa parola chiave finalClassi astratteRiepilogo - Gerarchia dei dipendenti7Incapsulamento
Pubblico, Protetto, PrivatoApprofondimento sui modificatori di accessoGetter e SetterOccultamento delle informazioniPromozione dei parametri del costruttore (8.0)Riepilogo - Sistema di gestione dei registri degli studenti10Concetti avanzati di programmazione a oggetti
Composizione vs ereditarietàDependency InjectionClassi anonimeEnumerazioni (PHP 8.1)Fibers (PHP 8.1)Approfondimento sulla clonazione degli oggettiGeneratori e iteratori13Modelli di progettazione, parte 2
Modello CommandModello AdapterModello DecoratorModello Template MethodModello StateModello CompositeModello Repository2Namespace e autoloading
Introduzione ai namespaceLa keyword useStandard di autoloading PSR-4Autoloader di ComposerRiepilogo - Progetto organizzato5Interfacce e contratti
Introduzione alle interfacceImplementare le interfacceImplementare più interfacceInterfaccia vs classe astrattaType hinting con le interfacceRiepilogo - Calcolatore di forme8Metodi magici
Introduzione ai metodi magici__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e clonazione degli oggetti__serialize e __unserializeRiepilogo - Collezione personalizzata11Sistema dei tipi e gestione degli errori
Dichiarazioni di tipoTipi nullableTipi unione e intersezioneClassi di eccezioneGerarchia di eccezioni personalizzataTry, Catch, FinallyRiepilogo - Validatore di moduli14Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Proprietà delle classi
Proprietà di istanza e staticheCostanti nelle classiMetodi e proprietà staticiProprietà private e protectedProprietà readonly (PHP 8.1)Riepilogo - Gestore di conti bancari6Polimorfismo
Ridefinizione dei metodi, ripresaPolimorfismo tramite interfacceSuggerimenti sui tipi e tipi UnionBinding statico tardivoRiepilogo - Processore di pagamenti9Tratti
Introduzione ai trattiUtilizzare più trattiRisoluzione dei conflitti tra trattiMetodi astratti nei trattiTratti vs ereditarietà12Design pattern - Parte 1
Introduzione ai design patternPattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore PHP online