Riepilogo - Sistema di profili utente
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 29 di 110.
Sfida
FacileCostruiamo un sistema completo per i profili utente che riunisca tutti i concetti di sicurezza rispetto ai valori nulli che hai imparato in questo capitolo. Creerai un sistema che gestisce account utente con una combinazione di informazioni obbligatorie e dettagli facoltativi.
Organizzerai il codice in due file:
user_profile.dart: definisci una classeUserProfileche rappresenta un account utente. Rifletti su quali informazioni siano essenziali (come un nome utente) e quali facoltative (come una biografia o un numero di telefono). La classe dovrebbe avere:- Una
String usernamenon nullable: ogni utente deve avere un nome utente - Una
String emailnon nullable: ogni utente deve avere un indirizzo email - Una
String? displayNamenullable: gli utenti potrebbero preferire mostrare un nome diverso - Una
String? bionullable: non tutti scrivono una biografia - Un
int? agenullable: l'età è un'informazione personale facoltativa - Un costruttore che usa parametri con nome e
requiredperusernameeemail - Un metodo
getDisplayIdentity()che restituisce il nome visualizzato se impostato, altrimenti restituisce il nome utente usando?? - Un metodo
getBioPreview()che restituisce i primi 20 caratteri della biografia seguiti da...se la biografia esiste ed è più lunga di 20 caratteri, la biografia completa se contiene 20 caratteri o meno, oppurenullse non esiste alcuna biografia (usa?.per l'accesso sicuro) - Un metodo
setDefaultBio()che imposta la biografia su'Hello, I am new here!'solo se al momento è null, usando??= - Un metodo
printProfile()che visualizza il profilo completo dell'utente
- Una
main.dart: importa la classe del profilo utente e crea diversi utenti per mostrare tutte le funzionalità della sicurezza rispetto ai valori nulli:- Crea un utente con nome utente
'alice_dev'e indirizzo email'alice@code.com', poi imposta il nome visualizzato su'Alice', la biografia su'Software developer passionate about clean code and testing'e l'età su28 - Crea un utente con nome utente
'bob_builder'e indirizzo email'bob@build.io', poi imposta solo il nome visualizzato su'Bob' - Crea un utente con nome utente
'charlie99'e indirizzo email'charlie@mail.net'(lascia null tutti i campi facoltativi) - Chiama
setDefaultBio()per tutti e tre gli utenti - Per ogni utente, nell'ordine, chiama
printProfile(), poi stampaIdentity: [getDisplayIdentity()], quindi stampaBio preview: [getBioPreview()]
- Crea un utente con nome utente
Il metodo printProfile() dovrebbe stampare in questo formato:
===== User Profile =====
Username: [username]
Email: [email]
Display Name: [displayName or "Not set"]
Bio: [bio or "No bio"]
Age: [age or "Not specified"]Nota come la biografia di Alice rimanga invariata dopo setDefaultBio() perché ha già un valore, mentre a Charlie viene assegnata la biografia predefinita. Osserva anche come l'anteprima della biografia tronchi quella più lunga di Alice, ma mostri per intero la biografia predefinita più breve di Charlie.
Risultato previsto:
===== User Profile =====
Username: alice_dev
Email: alice@code.com
Display Name: Alice
Bio: Software developer passionate about clean code and testing
Age: 28
Identity: Alice
Bio preview: Software developer p...
===== User Profile =====
Username: bob_builder
Email: bob@build.io
Display Name: Bob
Bio: Hello, I am new here!
Age: Not specified
Identity: Bob
Bio preview: Hello, I am new here!
===== User Profile =====
Username: charlie99
Email: charlie@mail.net
Display Name: Not set
Bio: Hello, I am new here!
Age: Not specified
Identity: charlie99
Bio preview: Hello, I am new here!Provalo tu
import 'user_profile.dart';
void main() {
// TODO: Crea l'utente 'alice_dev' con l'email 'alice@code.com'
// Imposta displayName su 'Alice'
// Imposta bio su 'Software developer passionate about clean code and testing'
// Imposta age su 28
// TODO: Crea l'utente 'bob_builder' con l'email 'bob@build.io'
// Imposta solo displayName su 'Bob'
// TODO: Crea l'utente 'charlie99' con l'email 'charlie@mail.net'
// Lascia tutti i campi facoltativi a null
// TODO: Chiama setDefaultBio() per tutti e tre gli utenti
// TODO: Per ogni utente, nell'ordine (alice, bob, charlie):
// 1. Chiama printProfile()
// 2. Stampa "Identity: [getDisplayIdentity()]"
// 3. Stampa "Bio preview: [getBioPreview()]"
}
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 personalizzata14Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneSingletonFactoryObserverStrategy3Proprietà 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