Итоги — Система профилей пользователей
Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 29 из 110.
Задание
ЛегкоДавайте создадим полноценную систему профилей пользователей, которая объединит все концепции безопасности null (null safety), которые вы изучили в этой главе. Вы создадите систему, управляющую учетными записями пользователей с сочетанием обязательной информации и необязательных деталей.
Вы организуете свой код в два файла:
user_profile.dart: Определите классUserProfile, который представляет учетную запись пользователя. Подумайте о том, какая информация является обязательной (например, имя пользователя), а какая — необязательной (например, биография или номер телефона). Ваш класс должен содержать:- Не допускающее null поле
String username— у каждого пользователя должно быть имя пользователя - Не допускающее null поле
String email— у каждого пользователя должен быть адрес электронной почты - Допускающее null поле
String? displayName— пользователи могут предпочесть отображать другое имя - Допускающее null поле
String? bio— не все пишут биографию - Допускающее null поле
int? age— возраст является необязательной личной информацией - Конструктор, использующий именованные параметры с ключевым словом
requiredдляusernameиemail - Метод
getDisplayIdentity(), который возвращает отображаемое имя, если оно задано, в противном случае возвращает имя пользователя, используя оператор?? - Метод
getBioPreview(), который возвращает первые 20 символов биографии, за которыми следует..., если биография существует и длиннее 20 символов; полную биографию, если в ней 20 символов или меньше; илиnull, если биография отсутствует (используйте?.для безопасного доступа) - Метод
setDefaultBio(), который устанавливает биографию в значение'Hello, I am new here!'только если она в данный момент равна null, используя оператор??= - Метод
printProfile(), который отображает полный профиль пользователя
- Не допускающее null поле
main.dart: Импортируйте ваш класс профиля пользователя и создайте несколько пользователей, чтобы продемонстрировать весь спектр функций безопасности null:- Создайте пользователя с именем пользователя
'alice_dev'и электронной почтой'alice@code.com', затем установите отображаемое имя'Alice', биографию'Software developer passionate about clean code and testing'и возраст28 - Создайте пользователя с именем пользователя
'bob_builder'и электронной почтой'bob@build.io', затем установите только отображаемое имя'Bob' - Создайте пользователя с именем пользователя
'charlie99'и электронной почтой'charlie@mail.net'(оставьте все необязательные поля как null) - Вызовите
setDefaultBio()для всех трех пользователей - Для каждого пользователя по порядку вызовите
printProfile(), затем выведитеIdentity: [getDisplayIdentity()], а затем выведитеBio preview: [getBioPreview()]
- Создайте пользователя с именем пользователя
Метод printProfile() должен выводить данные в следующем формате:
===== User Profile =====
Username: [username]
Email: [email]
Display Name: [displayName or "Not set"]
Bio: [bio or "No bio"]
Age: [age or "Not specified"]Обратите внимание, как биография Алисы остается неизменной после вызова setDefaultBio(), потому что у нее уже есть значение, в то время как Чарли получает назначенную биографию по умолчанию. Также обратите внимание, как предварительный просмотр биографии обрезает длинную биографию Алисы, но полностью показывает более короткую биографию Чарли, заданную по умолчанию.
Ожидаемый вывод:
===== 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!Попробуйте сами
import 'user_profile.dart';
void main() {
// TODO: Создайте пользователя 'alice_dev' с email 'alice@code.com'
// Установите displayName в 'Alice'
// Установите bio в 'Software developer passionate about clean code and testing'
// Установите age в 28
// TODO: Создайте пользователя 'bob_builder' с email 'bob@build.io'
// Установите только displayName в 'Bob'
// TODO: Создайте пользователя 'charlie99' с email 'charlie@mail.net'
// Оставьте все необязательные поля как null
// TODO: Вызовите setDefaultBio() для всех трех пользователей
// TODO: Для каждого пользователя по порядку (alice, bob, charlie):
// 1. Вызовите printProfile()
// 2. Выведите "Identity: [getDisplayIdentity()]"
// 3. Выведите "Bio preview: [getBioPreview()]"
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыБиблиотеки и импортВведение в ООПКлассы и объектыКлючевое слово thisМетодыПеременные экземпляраОсновы конструкторовИтоги — Простой калькулятор4Null-безопасность
Введение в Null-безопасностьNullable и Non-Nullable типыОператоры ? и !Ключевое слово Late и Null-безопасностьNull-aware операторыNull-безопасность в классахИтоги — Система профилей пользователей7Абстрактные классы и интерфейсы
Абстрактные классыАбстрактные методыИнтерфейсы в DartНеявные интерфейсыРеализация против наследованияМножественные интерфейсыИтоги — Калькулятор фигур10Коллекции и обобщения
Обзор List, Set, MapТипобезопасные коллекцииОбобщенные классыОбобщенные методыОграничения обобщенийIterable и IteratorИтоги: Обобщенное хранилище13Продвинутые концепции ООП
Композиция против наследованияМетоды расширенияВызываемые классыЗапечатанные классы (Dart 3)Записи (Dart 3)Паттерны и сопоставление (3.0)Перечисления с методами16Проект: Управление библиотекой
Обзор проектаКлассы Book и User2Конструкторы в Dart
Конструктор по умолчаниюИменованные конструкторыСписки инициализацииКонстантные конструкторыФабричные конструкторыПеренаправляющие конструкторыИтоги — Shape Builder5Инкапсуляция
Публичные и приватные членыСоглашение о префиксе _Приватность на уровне библиотекГеттеры и сеттеры: подробный разборСкрытие данныхИтоги — Записи о студентах8Mixins
Введение в MixinsСоздание MixinsИспользование нескольких MixinsКлючевое слово on в MixinsMixin и наследованиеMixin и интерфейсИтоги: Система животных11Специальные методы
Переопределение toString()Переопределение hashCode и ==Интерфейс ComparableМетод call()Переопределение noSuchMethodПовторение — Пользовательская коллекция14Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy3Свойства классов
Члены экземпляра и статические членыПоля Final и ConstПеременные LateСтатические методы и поляГеттеры и сеттерыИтоги — Менеджер банковского счета6Наследование
Основы наследованияКлючевое слово superПереопределение методовАннотация @overrideКлючевое слово final для классовКонструкторы и наследованиеИтоги: Иерархия сотрудников9Полиморфизм
Основы полиморфизмаПолиморфизм через интерфейсыПроверка типов во время выполненияОператоры is и asКлючевое слово covariantИтоги — Обработчик платежей12Асинхронное ООП
Futures и async/awaitОсновы StreamsКонтроллеры StreamАсинхронные конструкторыАсинхронность в методах классовИтоги — Data Fetcher15Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий