Система выдачи книг
Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 103 из 110.
Задание
ЛегкоВ предыдущем уроке вы создали классы Book и User с базовыми свойствами. Теперь пришло время построить полноценную систему заимствования с классом Library, который управляет всем процессом выдачи книг.
Вы создадите новый файл и обновите существующие файлы для реализации логики заимствования:
book.dart: Сохраните существующий классBookсо свойствамиisbn,title,author,isAvailableи методомtoString().user.dart: Сохраните существующий классUserсо свойствамиid,name,borrowedBooksи методомtoString().library.dart: Создайте новый классLibrary, который управляет книгами и пользователями. Он должен иметь два списка: один дляbooksи один дляusers. Включите методы для:addBook(Book book)— добавляет книгу в коллекцию библиотекиregisterUser(User user)— регистрирует пользователя в библиотекеborrowBook(String isbn, String userId)— находит книгу и пользователя, затем, если книга существует, доступна, и пользователь существует, помечает книгу как недоступную, добавляет ее в список заимствованных книг пользователя и выводитuserId borrowed "title". Если книга не найдена, выводитBook not found. Если книга недоступна, выводитBook not available. Если пользователь не найден, выводитUser not found.returnBook(String isbn, String userId)— находит книгу и пользователя, затем, если оба существуют и у пользователя есть эта книга, помечает книгу как доступную, удаляет ее из списка заимствованных книг пользователя и выводитuserId returned "title". Если книга не найдена, выводитBook not found. Если пользователь не найден, выводитUser not found.
main.dart: Импортируйте все ваши файлы и продемонстрируйте работу системы заимствования. СоздайтеLibrary, добавьте две книги (978-0-13-468599-1,The Pragmatic Programmer,David Thomasи978-0-596-51774-8,JavaScript: The Good Parts,Douglas Crockford) и зарегистрируйте одного пользователя (U001,Alice Johnson). Затем:- Возьмите первую книгу для Alice
- Попробуйте взять ту же книгу еще раз (должно закончиться ошибкой)
- Возьмите вторую книгу для Alice
- Выведите объект Alice, чтобы показать количество заимствованных книг
- Верните первую книгу
- Снова выведите объект Alice, чтобы показать обновленное количество
Ожидаемый вывод:
U001 borrowed "The Pragmatic Programmer"
Book not available
U001 borrowed "JavaScript: The Good Parts"
User U001: Alice Johnson (2 books borrowed)
U001 returned "The Pragmatic Programmer"
User U001: Alice Johnson (1 books borrowed)Попробуйте сами
import 'book.dart';
import 'user.dart';
import 'library.dart';
void main() {
// TODO: Создать экземпляр Library
// TODO: Создать две книги:
// - Книга 1: isbn '978-0-13-468599-1', title 'The Pragmatic Programmer', author 'David Thomas'
// - Книга 2: isbn '978-0-596-51774-8', title 'JavaScript: The Good Parts', author 'Douglas Crockford'
// TODO: Добавить обе книги в библиотеку
// TODO: Создать пользователя с id 'U001' и name 'Alice Johnson'
// TODO: Зарегистрировать пользователя в библиотеке
// TODO: Взять первую книгу для Alice
// TODO: Попробовать взять ту же книгу снова (должно завершиться ошибкой 'Book not available')
// TODO: Взять вторую книгу для Alice
// TODO: Вывести Alice, чтобы показать количество взятых ею книг
// TODO: Вернуть первую книгу
// TODO: Снова вывести Alice, чтобы показать обновленное количество
}
Все уроки раздела Объектно-ориентированное программирование
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
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий