Introduzione ai modelli di progettazione
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 89 di 110.
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 in modo coerente e manutenibile.
Considera i design pattern come ricette. Proprio come uno chef non inventa un nuovo modo di fare il pane ogni volta, i programmatori usano pattern perfezionati nel corso di decenni. Questi pattern sfruttano i concetti di OOP che hai già imparato: classi, ereditarietà, interfacce e polimorfismo, e li combinano in modi specifici per risolvere problemi particolari.
I pattern di progettazione sono generalmente 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 |
Nelle prossime lezioni imparerai schemi specifici di ogni categoria. Ogni schema affronta un problema distinto: garantire che esista una sola istanza di una classe, creare oggetti senza specificare classi esatte o consentire agli oggetti di notificare agli altri eventuali cambiamenti. Capire quando e perché usare ciascuno schema è importante tanto quanto sapere come implementarlo.
Sfida
FacileCostruiamo un semplice sistema di risoluzione dei problemi che mostra come i design pattern organizzano il codice per categoria! Creerai una struttura che classifica diverse sfide software e suggerisce quale tipo di pattern potrebbe aiutare a risolverle.
Organizzerai il codice in due file:
patterns.dart: Crea un enum chiamatoPatternCategorycon tre valori:creational,structuralebehavioral. Ognuno dovrebbe avere un campoString descriptionche ne spiega lo scopo:creational: "Handles object creation"structural: "Handles object composition"behavioral: "Handles object communication"
Problemche rappresenta una sfida software. Dovrebbe avere un campoString namee un campoPatternCategory category. Includi un metodosuggest()che restituisce una stringa nel formato:[name] -> Use a [category description] patternmain.dart: Importa il file dei pattern e mostra come problemi diversi corrispondono a diverse categorie di pattern. Crea tre istanze diProblem:- Un problema chiamato
Ensure single database connectioncon categoriacreational - Un problema chiamato
Make old API work with new systemcon categoriastructural - Un problema chiamato
Notify users when data changescon categoriabehavioral
suggest()su ciascun problema e stampa i risultati.- Un problema chiamato
Questa sfida ti aiuta a capire come i design pattern vengono categorizzati in base al tipo di problema che risolvono: un concetto fondamentale quando inizierai a imparare pattern specifici nelle prossime lezioni!
Output previsto:
Ensure single database connection -> Use a Handles object creation pattern
Make old API work with new system -> Use a Handles object composition pattern
Notify users when data changes -> Use a Handles object communication patternProvalo tu
import 'patterns.dart';
void main() {
// TODO: Crea tre istanze di Problem:
// 1. name: "Ensure single database connection", category: creational
// 2. name: "Make old API work with new system", category: structural
// 3. name: "Notify users when data changes", category: behavioral
// TODO: Chiama suggest() per ogni problema e stampa i risultati
}
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 esterniLibrerie e importazioniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave thisMetodiVariabili di istanzaFondamenti dei costruttoriRiepilogo - Calcolatrice semplice4Sicurezza dei valori null
Introduzione alla sicurezza dei valori nullNullable e non nullableGli operatori ? e !La keyword late e la sicurezza dei valori nullOperatori null-awareSicurezza dei valori null nelle classiRiepilogo - Sistema di profili utente7Classi astratte e interfacce
Classi astratteMetodi astrattiInterfacce in DartInterfacce impliciteImplementare vs estendereInterfacce multipleRiepilogo - Calcolatore di forme10Collezioni e generici
Panoramica di List, Set e MapCollezioni sicure rispetto ai tipiClassi genericheMetodi genericiVincoli sui genericiIterable e IteratorRiepilogo - Archiviazione generica13Concetti avanzati di OOP
Composizione vs ereditarietàMetodi di estensioneClassi chiamabiliClassi sealed (Dart 3)Record (Dart 3)Pattern e matching (3.0)Enum con metodi16Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente2I costruttori in Dart
Costruttore predefinitoCostruttori con nomeListe di inizializzazioneCostruttori costantiCostruttori factoryCostruttori di reindirizzamentoRiepilogo - Crea forme5Incapsulamento
Membri pubblici e privatiConvenzione del prefisso _Visibilità a livello di libreriaApprofondimento su getter e setterNascondimento delle informazioniRiepilogo - Registri degli studenti8Mixin
Introduzione ai MixinCreare MixinUsare più MixinParola chiave on nei MixinMixin vs ereditarietàMixin vs interfacciaRiepilogo - Sistema animale11Metodi speciali
Sovrascrittura di toString()Sovrascrittura di hashCode e ==Interfaccia ComparableMetodo call()Sovrascrittura di noSuchMethodRiepilogo - Collezione personalizzata3Proprietà delle classi
Membri di istanza e staticiCampi final e constVariabili lateMetodi e campi staticiGetter e setterRiepilogo - Gestore di conti bancari6Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiL’annotazione @overrideLa parola chiave final per le classiCostruttori ed ereditarietàRiepilogo - Gerarchia dei dipendenti9Polimorfismo
Fondamenti di polimorfismoPolimorfismo tramite interfacceControllo del tipo a runtimeGli operatori is e asParola chiave covariantRiepilogo - Elaboratore di pagamenti12OOP asincrona
Future e async/awaitNozioni di base sugli streamController degli streamCostruttori asincroniAsync nei metodi di classeRiepilogo - Recupero dei dati15Pattern di progettazione Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern RepositoryEsercitati da solo: Compilatore Dart online