Podsumowanie — system profili użytkowników
Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 29 z 110.
Wyzwanie
ŁatwyStwórzmy kompletny system profili użytkowników, który łączy wszystkie poznane w tym rozdziale zagadnienia dotyczące bezpieczeństwa null. Utworzysz system zarządzający kontami użytkowników, zawierający zarówno wymagane informacje, jak i opcjonalne szczegóły.
Podzielisz kod na dwa pliki:
user_profile.dart: Zdefiniuj klasęUserProfile, która reprezentuje konto użytkownika. Zastanów się, które informacje są niezbędne (takie jak nazwa użytkownika), a które opcjonalne (takie jak biografia lub numer telefonu). Twoja klasa powinna zawierać:- Nieprzyjmującą wartości null zmienną
String username— każdy użytkownik musi mieć nazwę użytkownika - Nieprzyjmującą wartości null zmienną
String email— każdy użytkownik musi mieć adres e-mail - Przyjmującą wartość null zmienną
String? displayName— użytkownicy mogą woleć wyświetlać inną nazwę - Przyjmującą wartość null zmienną
String? bio— nie każdy pisze biografię - Przyjmującą wartość null zmienną
int? age— wiek to opcjonalna informacja osobista - Konstruktor używający parametrów nazwanych, z
requireddlausernameiemail - Metodę
getDisplayIdentity(), która zwraca nazwę wyświetlaną, jeśli została ustawiona, a w przeciwnym razie zwraca nazwę użytkownika, używając?? - Metodę
getBioPreview(), która zwraca pierwsze 20 znaków biografii, po których następuje..., jeśli biografia istnieje i ma więcej niż 20 znaków; całą biografię, jeśli ma 20 znaków lub mniej; albonull, jeśli biografia nie istnieje (użyj?., aby bezpiecznie uzyskać dostęp) - Metodę
setDefaultBio(), która ustawia biografię na'Hello, I am new here!'tylko wtedy, gdy jej bieżąca wartość to null, używając??= - Metodę
printProfile(), która wyświetla pełny profil użytkownika
- Nieprzyjmującą wartości null zmienną
main.dart: Zaimportuj klasę profilu użytkownika i utwórz kilku użytkowników, aby zademonstrować pełen zakres funkcji bezpieczeństwa null:- Utwórz użytkownika o nazwie
'alice_dev'i adresie e-mail'alice@code.com', a następnie ustaw nazwę wyświetlaną na'Alice', biografię na'Software developer passionate about clean code and testing', a wiek na28 - Utwórz użytkownika o nazwie
'bob_builder'i adresie e-mail'bob@build.io', a następnie ustaw tylko nazwę wyświetlaną na'Bob' - Utwórz użytkownika o nazwie
'charlie99'i adresie e-mail'charlie@mail.net'(pozostaw wszystkie pola opcjonalne jako null) - Wywołaj
setDefaultBio()dla wszystkich trzech użytkowników - Dla każdego użytkownika, po kolei, wywołaj
printProfile(), następnie wypiszIdentity: [getDisplayIdentity()], a potem wypiszBio preview: [getBioPreview()]
- Utwórz użytkownika o nazwie
Metoda printProfile() powinna wypisywać dane w następującym formacie:
===== User Profile =====
Username: [username]
Email: [email]
Display Name: [displayName or "Not set"]
Bio: [bio or "No bio"]
Age: [age or "Not specified"]Zauważ, że biografia Alice pozostaje niezmieniona po wywołaniu setDefaultBio(), ponieważ ma już wartość, natomiast Charlie otrzymuje domyślną biografię. Zwróć też uwagę, że podgląd biografii skraca dłuższą biografię Alice, ale wyświetla w całości krótszą, domyślną biografię Charliego.
Oczekiwany wynik:
===== 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!Spróbuj swoich sił
import 'user_profile.dart';
void main() {
// TODO: Utwórz użytkownika 'alice_dev' z adresem e-mail 'alice@code.com'
// Ustaw displayName na 'Alice'
// Ustaw bio na 'Software developer passionate about clean code and testing'
// Ustaw age na 28
// TODO: Utwórz użytkownika 'bob_builder' z adresem e-mail 'bob@build.io'
// Ustaw tylko displayName na 'Bob'
// TODO: Utwórz użytkownika 'charlie99' z adresem e-mail 'charlie@mail.net'
// Pozostaw wszystkie opcjonalne pola jako null
// TODO: Wywołaj setDefaultBio() dla wszystkich trzech użytkowników
// TODO: Dla każdego użytkownika po kolei (alice, bob, charlie):
// 1. Wywołaj printProfile()
// 2. Wypisz "Identity: [getDisplayIdentity()]"
// 3. Wypisz "Bio preview: [getBioPreview()]"
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP
Pliki zewnętrzneBiblioteki i importyWprowadzenie do OOPKlasy a obiektySłowo kluczowe thisMetodyZmienne instancjiPodstawy konstruktorówPowtórka – prosty kalkulator4Bezpieczeństwo wartości null
Wprowadzenie do bezpieczeństwa wartości nullTypy dopuszczające null i niedopuszczające nullOperatory ? i !Słowo kluczowe late a bezpieczeństwo wartości nullOperatory uwzględniające nullBezpieczeństwo wartości null w klasachPodsumowanie — system profili użytkowników7Klasy abstrakcyjne i interfejsy
Klasy abstrakcyjneMetody abstrakcyjneInterfejsy w DartInterfejsy niejawneImplementowanie a rozszerzanieWiele interfejsówPowtórka — kalkulator kształtów10Kolekcje i typy generyczne
Przegląd List, Set i MapKolekcje bezpieczne typowoKlasy generyczneMetody generyczneOgraniczenia typów generycznychIterable i IteratorPowtórka — generyczne przechowywanie danych13Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieMetody rozszerzająceKlasy wywoływalneKlasy zapieczętowane (Dart 3)Rekordy (Dart 3)Wzorce i dopasowywanie (3.0)Typy wyliczeniowe z metodami16Projekt: Zarządzanie biblioteką
Omówienie projektuKlasy książek i użytkowników2Konstruktory w Dart
Konstruktor domyślnyKonstruktory nazwaneListy inicjalizująceKonstruktory stałeKonstruktory fabryczneKonstruktory przekierowującePodsumowanie — budowanie kształtów5Hermetyzacja
Elementy publiczne a prywatneKonwencja prefiksu _Prywatność na poziomie bibliotekiGettery i settery — szczegółowoUkrywanie informacjiPodsumowanie — dane uczniów8Domieszki
Wprowadzenie do domieszekTworzenie domieszekKorzystanie z wielu domieszekSłowo kluczowe on w domieszkachDomieszka a dziedziczenieDomieszka a interfejsPodsumowanie – system zwierząt11Metody specjalne
Nadpisanie toString()Nadpisanie hashCode i ==Interfejs ComparableMetoda call()Nadpisanie noSuchMethodPodsumowanie — własna kolekcja14Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy3Właściwości klas
Elementy instancji a elementy statycznePola final i constZmienne inicjalizowane z opóźnieniemMetody i pola statyczneGettery i setteryPowtórzenie – menedżer kont bankowych6Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superPrzesłanianie metodAdnotacja @overrideSłowo kluczowe final dla klasKonstruktory i dziedziczeniePowtórzenie – hierarchia pracowników9Polimorfizm
Podstawy polimorfizmuPolimorfizm za pomocą interfejsówSprawdzanie typu w czasie działaniaOperatory is i asSłowo kluczowe covariantPodsumowanie — procesor płatnościPoćwicz samodzielnie: Kompilator Dart online