Rückblick – Benutzers профilsystem
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 29 von 110.
Aufgabe
EinfachErstellen wir ein vollständiges Benutzerprofilsystem, das alle Konzepte der Nullsicherheit zusammenführt, die du in diesem Kapitel kennengelernt hast. Du erstellst ein System, das Benutzerkonten mit einer Mischung aus erforderlichen Informationen und optionalen Details verwaltet.
Du organisierst deinen Code in zwei Dateien:
user_profile.dart: Definiere eineUserProfile-Klasse, die ein Benutzerkonto darstellt. Überlege, welche Informationen unbedingt erforderlich sind (z. B. ein Benutzername) und welche optional sind (z. B. eine Biografie oder Telefonnummer). Deine Klasse sollte Folgendes enthalten:- Eine nicht nullable
String username– jeder Benutzer muss einen Benutzernamen haben - Eine nicht nullable
String email– jeder Benutzer muss eine E-Mail-Adresse haben - Eine nullable
String? displayName– Benutzer möchten möglicherweise einen anderen Namen anzeigen - Eine nullable
String? bio– nicht jeder schreibt eine Biografie - Eine nullable
int? age– das Alter ist eine optionale persönliche Information - Einen Konstruktor mit benannten Parametern und
requiredfürusernameundemail - Eine Methode
getDisplayIdentity(), die den Anzeigenamen zurückgibt, wenn er festgelegt ist, andernfalls mithilfe von??den Benutzernamen zurückgibt - Eine Methode
getBioPreview(), die die ersten 20 Zeichen der Biografie gefolgt von...zurückgibt, wenn die Biografie existiert und länger als 20 Zeichen ist, die vollständige Biografie, wenn sie höchstens 20 Zeichen lang ist, odernull, wenn keine Biografie existiert (verwende?.für den sicheren Zugriff) - Eine Methode
setDefaultBio(), die die Biografie nur dann auf'Hello, I am new here!'setzt, wenn sie derzeit null ist, und dafür??=verwendet - Eine Methode
printProfile(), die das vollständige Profil des Benutzers anzeigt
- Eine nicht nullable
main.dart: Importiere deine Benutzerprofilklasse und erstelle mehrere Benutzer, um das gesamte Spektrum der Funktionen zur Nullsicherheit zu demonstrieren:- Erstelle einen Benutzer mit dem Benutzernamen
'alice_dev'und der E-Mail-Adresse'alice@code.com', setze anschließend den Anzeigenamen auf'Alice', die Biografie auf'Software developer passionate about clean code and testing'und das Alter auf28 - Erstelle einen Benutzer mit dem Benutzernamen
'bob_builder'und der E-Mail-Adresse'bob@build.io', setze anschließend nur den Anzeigenamen auf'Bob' - Erstelle einen Benutzer mit dem Benutzernamen
'charlie99'und der E-Mail-Adresse'charlie@mail.net'(lasse alle optionalen Felder auf null) - Rufe
setDefaultBio()für alle drei Benutzer auf - Rufe für jeden Benutzer der Reihe nach
printProfile()auf, gib anschließendIdentity: [getDisplayIdentity()]aus und gib danachBio preview: [getBioPreview()]aus
- Erstelle einen Benutzer mit dem Benutzernamen
Die Methode printProfile() sollte in diesem Format ausgeben:
===== User Profile =====
Username: [username]
Email: [email]
Display Name: [displayName or "Not set"]
Bio: [bio or "No bio"]
Age: [age or "Not specified"]Beachte, dass Alices Biografie nach setDefaultBio() unverändert bleibt, weil sie bereits einen Wert enthält, während Charlie die Standardbiografie zugewiesen bekommt. Beobachte außerdem, wie die Biografie-Vorschau Alices längere Biografie kürzt, aber Charlies kürzere Standardbiografie vollständig anzeigt.
Erwartete Ausgabe:
===== 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!Probier es selbst
import 'user_profile.dart';
void main() {
// TODO: Erstelle den Benutzer 'alice_dev' mit der E-Mail 'alice@code.com'
// Setze displayName auf 'Alice'
// Setze bio auf 'Software developer passionate about clean code and testing'
// Setze age auf 28
// TODO: Erstelle den Benutzer 'bob_builder' mit der E-Mail 'bob@build.io'
// Setze nur displayName auf 'Bob'
// TODO: Erstelle den Benutzer 'charlie99' mit der E-Mail 'charlie@mail.net'
// Lasse alle optionalen Felder auf null
// TODO: Rufe setDefaultBio() für alle drei Benutzer auf
// TODO: Für jeden Benutzer in der Reihenfolge (alice, bob, charlie):
// 1. Rufe printProfile() auf
// 2. Drucke "Identity: [getDisplayIdentity()]"
// 3. Drucke "Bio preview: [getBioPreview()]"
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienBibliotheken & ImportsEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort thisMethodenInstanzvariablenGrundlagen von KonstruktorenRückblick – Einfacher Taschenrechner4Null-Sicherheit
Einführung in die Null-SicherheitNullable vs. Non-NullableDie Operatoren ? und !Late-Schlüsselwort und Null-SicherheitNull-bewusste OperatorenNull-Sicherheit in KlassenRückblick – Benutzers профilsystem7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrere InterfacesZusammenfassung – Formrechner10Collections & Generics
Übersicht über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische EinschränkungenIterable & IteratorRückblick – Generischer Speicher13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungErweiterungsmethodenAufrufbare KlassenVersiegelte Klassen (Dart 3)Records (Dart 3)Muster & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
StandardkonstruktorBenannte KonstruktorenInitialisierungslistenKonstantenkonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenRückblick – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _-Präfix-KonventionBibliotheksweite SichtbarkeitTiefergehende Getter & SetterInformationsverbergungRückblick – Studierendendaten8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas Schlüsselwort „on“ in MixinsMixin vs. VererbungMixin vs. SchnittstelleRückblick – Tiersystem11Spezielle Methoden
toString()-ÜberschreibunghashCode- & ==-ÜberschreibungComparable-Schnittstellecall()-MethodenoSuchMethod-ÜberschreibungWiederholung – Benutzerdefinierte Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFabrikmusterBeobachtermusterStrategiemuster17Abschließende Herausforderungen
E-Learning-PlattformBankingsystemSpielcharaktersystemFahrzeugvermietung3Klassen-Eigenschaften
Instanz- vs. statische MemberFinal- und Const-FelderLate-VariablenStatische Methoden und FelderGetter und SetterRückblick – Bankkontoverwaltung6Vererbung
Grundlegende VererbungDas Schlüsselwort superMethodenüberschreibungDie Annotation @overrideDas Schlüsselwort final für KlassenKonstruktoren und VererbungZusammenfassung – Mitarbeiterhierarchie9Polymorphismus
Grundlagen des PolymorphismusPolymorphismus über InterfacesLaufzeit-TypüberprüfungDie Operatoren is & asCovariant-SchlüsselwortZusammenfassung – ZahlungsprozessorÜbe selbstständig: Online-Dart-Compiler