Récapitulatif - Système de profil utilisateur
Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy — leçon 29 sur 110.
Défi
FacileConstruisons un système complet de profil utilisateur qui rassemble tous les concepts de null safety que vous avez appris dans ce chapitre. Vous allez créer un système qui gère les comptes utilisateurs avec un mélange d'informations obligatoires et de détails facultatifs.
Vous organiserez votre code en deux fichiers :
user_profile.dart: Définissez une classeUserProfilequi représente un compte utilisateur. Réfléchissez aux informations essentielles (comme un nom d'utilisateur) par rapport à celles qui sont facultatives (comme une biographie ou un numéro de téléphone). Votre classe doit comporter :- Un
String usernamenon-nullable - chaque utilisateur doit avoir un nom d'utilisateur - Un
String emailnon-nullable - chaque utilisateur doit avoir un e-mail - Un
String? displayNamenullable - les utilisateurs peuvent préférer afficher un nom différent - Un
String? bionullable - tout le monde n'écrit pas de biographie - Un
int? agenullable - l'âge est une information personnelle facultative - Un constructeur utilisant des paramètres nommés avec
requiredpourusernameetemail - Une méthode
getDisplayIdentity()qui retourne le nom d'affichage s'il est défini, sinon retourne le nom d'utilisateur en utilisant?? - Une méthode
getBioPreview()qui retourne les 20 premiers caractères de la biographie suivis de...si la biographie existe et fait plus de 20 caractères, la biographie complète si elle fait 20 caractères ou moins, ounullsi aucune biographie n'existe (utilisez?.pour un accès sécurisé) - Une méthode
setDefaultBio()qui définit la biographie à'Hello, I am new here!'uniquement si elle est actuellement nulle en utilisant??= - Une méthode
printProfile()qui affiche le profil complet de l'utilisateur
- Un
main.dart: Importez votre classe de profil utilisateur et créez plusieurs utilisateurs pour démontrer toute la gamme des fonctionnalités de null safety :- Créez un utilisateur avec le nom d'utilisateur
'alice_dev'et l'e-mail'alice@code.com', puis définissez le nom d'affichage à'Alice', la biographie à'Software developer passionate about clean code and testing', et l'âge à28 - Créez un utilisateur avec le nom d'utilisateur
'bob_builder'et l'e-mail'bob@build.io', puis définissez uniquement le nom d'affichage à'Bob' - Créez un utilisateur avec le nom d'utilisateur
'charlie99'et l'e-mail'charlie@mail.net'(laissez tous les champs facultatifs à null) - Appelez
setDefaultBio()sur les trois utilisateurs - Pour chaque utilisateur dans l'ordre, appelez
printProfile(), puis affichezIdentity: [getDisplayIdentity()], puis affichezBio preview: [getBioPreview()]
- Créez un utilisateur avec le nom d'utilisateur
La méthode printProfile() doit afficher les informations dans ce format :
===== User Profile =====
Username: [username]
Email: [email]
Display Name: [displayName or "Not set"]
Bio: [bio or "No bio"]
Age: [age or "Not specified"]Remarquez comment la biographie d'Alice reste inchangée après setDefaultBio() car elle a déjà une valeur, tandis que Charlie se voit attribuer la biographie par défaut. Observez également comment l'aperçu de la biographie tronque la biographie plus longue d'Alice mais affiche la biographie par défaut plus courte de Charlie en entier.
Sortie attendue :
===== 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!Essayez vous-même
import 'user_profile.dart';
void main() {
// TODO: Créer l'utilisateur 'alice_dev' avec l'email 'alice@code.com'
// Définir displayName à 'Alice'
// Définir bio à 'Software developer passionate about clean code and testing'
// Définir age à 28
// TODO: Créer l'utilisateur 'bob_builder' avec l'email 'bob@build.io'
// Définir uniquement displayName à 'Bob'
// TODO: Créer l'utilisateur 'charlie99' avec l'email 'charlie@mail.net'
// Laisser tous les champs optionnels à null
// TODO: Appeler setDefaultBio() sur les trois utilisateurs
// TODO: Pour chaque utilisateur dans l'ordre (alice, bob, charlie) :
// 1. Appeler printProfile()
// 2. Afficher "Identity: [getDisplayIdentity()]"
// 3. Afficher "Bio preview: [getBioPreview()]"
}
Toutes les leçons de Programmation Orientée Objet
1Les bases de la POO
Fichiers externesBibliothèques et importsIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesVariables d'instanceBases des constructeursRécapitulatif - Calculatrice simple4Null Safety
Introduction à la Null SafetyNullable vs Non-NullableLes opérateurs ? et !Le mot-clé late et la Null SafetyLes opérateurs Null-AwareLa Null Safety dans les classesRécapitulatif - Système de profil utilisateur7Classes abstraites et Interfaces
Classes abstraitesMéthodes abstraitesInterfaces en DartInterfaces implicitesImplémentation vs ExtensionInterfaces multiplesRécapitulatif - Calculateur de formes10Collections et Génériques
Aperçu des List, Set et MapCollections Type-SafeClasses génériquesMéthodes génériquesContraintes de généricitéIterable & IteratorRécapitulatif - Stockage générique2Les constructeurs en Dart
Constructeur par défautConstructeurs nommésListes d'initialisationConstructeurs constantsConstructeurs factoryConstructeurs de redirectionRécapitulatif - Shape Builder5Encapsulation
Membres publics vs privésLa convention du préfixe _Visibilité au niveau de la bibliothèqueApprofondissement des Getters & SettersMasquage d'informationsRécapitulatif - Dossiers d'étudiants8Mixins
Introduction aux MixinsCréation de MixinsUtilisation de plusieurs MixinsLe mot-clé on dans les MixinsMixin vs HéritageMixin vs InterfaceRécapitulatif - Système Animal11Méthodes spéciales
Redéfinition de toString()Redéfinition de hashCode & ==Interface ComparableMéthode call()Redéfinition de noSuchMethodRécapitulatif - Collection personnalisée14Patrons de conception Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron ObservateurPatron Stratégie3Propriétés de classe
Membres d'instance vs statiquesChamps Final & ConstVariables LateMéthodes et champs statiquesGetters et SettersRécapitulatif - Gestionnaire de compte bancaire6Héritage
Bases de l'héritageLe mot-clé superRedéfinition de méthodeL'annotation @overrideLe mot-clé final pour les classesConstructeurs et héritageRécapitulatif - Hiérarchie des employés9Polymorphisme
Bases du polymorphismePolymorphisme via les interfacesVérification de type à l'exécutionLes opérateurs is & asMot-clé covariantRécapitulatif - Processeur de paiement12POO Asynchrone
Futures & async/awaitBases des StreamsStream ControllersConstructeurs asynchronesL'asynchrone dans les méthodes de classeRécapitulatif - Data Fetcher15Patrons de conception Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode ModèlePatron ÉtatPatron CompositePatron Repository