Сервис аренды транспорта
Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 110 из 110.
Задание
ЛегкоПоздравляем с достижением финального испытания курса по ООП! Давайте создадим комплексный Сервис аренды автомобилей (Vehicle Rental Service), который объединит все, что вы изучили: абстрактные классы, наследование, инкапсуляцию, паттерн Состояние (State), паттерн Фабрика (Factory) и дженерики.
Ваш сервис аренды будет управлять различными типами транспортных средств, отслеживать их состояния доступности, обрабатывать аренду и вести учет клиентов. Вы организуете это в семи файлах:
vehicle_state.dart: Создайте абстрактный классVehicleState, который определяет поведение транспортных средств в различных состояниях. Включите абстрактный методString getStatus()иbool canRent(). Затем создайте три конкретных состояния:AvailableState— возвращаетAvailableи разрешает арендуRentedState— возвращаетRentedи не разрешает арендуMaintenanceState— возвращаетIn Maintenanceи не разрешает аренду
vehicle.dart: Создайте абстрактный классVehicleсfinalid (String),finalmodel (String), приватным полем_dailyRate(double) с геттером и приватным полем_state(VehicleState), инициализированным какAvailableState. Включите:- Геттер
status, который возвращает статус состояния bool isAvailable()— проверяет, позволяет ли текущее состояние арендуvoid setState(VehicleState state)— изменяет состояние транспортного средства- Абстрактный метод
double calculateRentalCost(int days) - Абстрактный метод
String getRequirements()— возвращает любые специальные требования
toString(), чтобы он возвращал[Type] model (id) - status, где Type — это тип времени выполнения (runtime type).- Геттер
vehicles.dart: Создайте три типа транспортных средств, расширяющихVehicle:Car— стандартная стоимость аренды равна дневной ставке, умноженной на количество дней. Требования:Valid driver's licenseMotorcycle— стоимость аренды равна дневной ставке, умноженной на количество дней, со скидкой 10%. Требования:Motorcycle license, Age 21+Truck— стоимость аренды равна дневной ставке, умноженной на количество дней, плюс фиксированная комиссия $50. Требования:Commercial license, Deposit required
vehicle_factory.dart: Создайте классVehicleFactoryсо статическим методомVehicle create(String type, String id, String model, double dailyRate), который возвращает соответствующее транспортное средство в зависимости от типа (car,motorcycleилиtruck). Для неизвестных типов по умолчанию создавайте Car.customer.dart: Создайте классCustomerс id (String), name (String) и приватным списком записей об аренде (список Strings). Включите:addRental(String vehicleInfo)— добавляет запись об арендеgetRentalCount()— возвращает количество арендbool isEligible()— возвращает true, если у клиента менее 3 активных аренд
toString(), чтобы он возвращалCustomer: name (id) - X rentals.rental_service.dart: Создайте классRentalService, использующий дженерики сList<Vehicle>для автопарка иList<Customer>для клиентов. Включите:addVehicle(Vehicle vehicle)— добавляет в автопарк, выводитAdded: vehicle.toString()registerCustomer(Customer customer)— регистрирует клиентаrentVehicle(String customerId, String vehicleId, int days)— если клиент существует, имеет право на аренду и транспортное средство доступно: меняет состояние ТС на Rented, добавляет аренду клиенту, выводитcustomerId rented vehicleId for X days. Cost: $Y(Y отформатировано до 2 знаков после запятой). В противном случае выведите соответствующее сообщение:Customer not found,Customer not eligible,Vehicle not foundилиVehicle not availablereturnVehicle(String vehicleId)— устанавливает состояние ТС в Available, выводитvehicleId returnedsendToMaintenance(String vehicleId)— устанавливает состояние ТС в Maintenance, выводитvehicleId sent to maintenancegetAvailableVehicles()— возвращает список доступных транспортных средств
main.dart: Продемонстрируйте работу вашего сервиса аренды. СоздайтеRentalServiceи используйте фабрику, чтобы добавить три транспортных средства:- Легковой автомобиль:
V001,Toyota Camry, $45/день - Мотоцикл:
V002,Honda CBR, $35/день - Грузовик:
V003,Ford F-150, $75/день
C001,Alice Johnson) и выведите информацию о клиенте. Выведите требования для грузовика. Сдайте автомобиль в аренду Элис на 3 дня. Попробуйте снова арендовать тот же автомобиль (должно не получиться). Отправьте мотоцикл на техническое обслуживание. Выведите количество доступных транспортных средств в форматеAvailable vehicles: X. Верните автомобиль. Выведите итоговое количество доступных ТС.- Легковой автомобиль:
Ожидаемый вывод:
Added: [Car] Toyota Camry (V001) - Available
Added: [Motorcycle] Honda CBR (V002) - Available
Added: [Truck] Ford F-150 (V003) - Available
Customer: Alice Johnson (C001) - 0 rentals
Commercial license, Deposit required
C001 rented V001 for 3 days. Cost: $135.00
Vehicle not available
V002 sent to maintenance
Available vehicles: 1
V001 returned
Available vehicles: 2Попробуйте сами
import 'rental_service.dart';
import 'vehicle_factory.dart';
import 'customer.dart';
void main() {
// TODO: Создать экземпляр RentalService
// TODO: Использовать VehicleFactory для создания и добавления трех транспортных средств:
// - Car: V001, Toyota Camry, $45/день
// - Motorcycle: V002, Honda CBR, $35/день
// - Truck: V003, Ford F-150, $75/день
// TODO: Зарегистрировать клиента (C001, Alice Johnson)
// TODO: Вывести информацию о клиенте
// TODO: Вывести требования для грузовика (найти грузовик и вызвать getRequirements())
// TODO: Арендовать автомобиль (V001) для Alice (C001) на 3 дня
// TODO: Попробовать арендовать автомобиль снова (должно завершиться неудачей — недоступен)
// TODO: Отправить мотоцикл (V002) на техническое обслуживание
// TODO: Вывести количество доступных транспортных средств в формате 'Available vehicles: X'
// TODO: Вернуть автомобиль (V001)
// TODO: Вывести итоговое количество доступных транспортных средств
}
Все уроки раздела Объектно-ориентированное программирование
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Паттерн Strategy17Финальные испытания
Платформа онлайн-обученияБанковская системаСистема игровых персонажейСервис аренды транспорта3Свойства классов
Члены экземпляра и статические членыПоля Final и ConstПеременные LateСтатические методы и поляГеттеры и сеттерыИтоги — Менеджер банковского счета6Наследование
Основы наследованияКлючевое слово superПереопределение методовАннотация @overrideКлючевое слово final для классовКонструкторы и наследованиеИтоги: Иерархия сотрудников9Полиморфизм
Основы полиморфизмаПолиморфизм через интерфейсыПроверка типов во время выполненияОператоры is и asКлючевое слово covariantИтоги — Обработчик платежей12Асинхронное ООП
Futures и async/awaitОсновы StreamsКонтроллеры StreamАсинхронные конструкторыАсинхронность в методах классовИтоги — Data Fetcher15Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий