Serviço de Aluguel de Veículos
Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy — lição 110 de 110.
Desafio
FácilParabéns por chegar ao desafio final do curso de OOP! Vamos construir um Serviço de Aluguel de Veículos abrangente que reúne tudo o que você aprendeu - classes abstratas, herança, encapsulamento, o padrão State, padrão Factory e generics.
Seu serviço de aluguel gerenciará diferentes tipos de veículos, rastreará seus estados de disponibilidade, lidará com aluguéis e manterá registros de clientes. Você organizará isso em sete arquivos:
vehicle_state.dart: Crie uma classe abstrataVehicleStateque define como os veículos se comportam em diferentes estados. Inclua um método abstratoString getStatus()ebool canRent(). Em seguida, crie três estados concretos:AvailableState- retornaAvailablee permite o aluguelRentedState- retornaRentede não permite o aluguelMaintenanceState- retornaIn Maintenancee não permite o aluguel
vehicle.dart: Crie uma classe abstrataVehiclecom um idfinal(String), modelofinal(String), um_dailyRateprivado (double) com um getter, e um_stateprivado (VehicleState) inicializado comoAvailableState. Inclua:- Um getter
statusque retorna o status do estado bool isAvailable()- verifica se o estado atual permite o aluguelvoid setState(VehicleState state)- altera o estado do veículo- Um método abstrato
double calculateRentalCost(int days) - Um método abstrato
String getRequirements()- retorna quaisquer requisitos especiais
toString()para retornar[Type] model (id) - statusonde Type é o tipo em tempo de execução (runtime type).- Um getter
vehicles.dart: Crie três tipos de veículos estendendoVehicle:Car- o custo de aluguel padrão é a taxa diária vezes os dias. Requisitos:Valid driver's licenseMotorcycle- o custo de aluguel é a taxa diária vezes os dias com um desconto de 10%. Requisitos:Motorcycle license, Age 21+Truck- o custo de aluguel é a taxa diária vezes os dias mais uma taxa fixa de $50. Requisitos:Commercial license, Deposit required
vehicle_factory.dart: Crie uma classeVehicleFactorycom um método estáticoVehicle create(String type, String id, String model, double dailyRate)que retorna o veículo apropriado com base no tipo (car,motorcycle, outruck). Para tipos desconhecidos, o padrão deve ser criar um Car.customer.dart: Crie uma classeCustomercom um id (String), nome (String) e uma lista privada de registros de aluguel (lista de Strings). Inclua:addRental(String vehicleInfo)- adiciona um registro de aluguelgetRentalCount()- retorna o número de aluguéisbool isEligible()- retorna true se o cliente tiver menos de 3 aluguéis ativos
toString()para retornarCustomer: name (id) - X rentals.rental_service.dart: Crie uma classeRentalServiceusando generics com umaList<Vehicle>para a frota e umaList<Customer>para os clientes. Inclua:addVehicle(Vehicle vehicle)- adiciona à frota, imprimeAdded: vehicle.toString()registerCustomer(Customer customer)- registra o clienterentVehicle(String customerId, String vehicleId, int days)- se o cliente existir, for elegível e o veículo estiver disponível: altera o estado do veículo para Rented, adiciona o aluguel ao cliente, imprimecustomerId rented vehicleId for X days. Cost: $Y(Y formatado com 2 casas decimais). Caso contrário, imprima a mensagem apropriada:Customer not found,Customer not eligible,Vehicle not found, ouVehicle not availablereturnVehicle(String vehicleId)- define o estado do veículo como Available, imprimevehicleId returnedsendToMaintenance(String vehicleId)- define o estado do veículo como Maintenance, imprimevehicleId sent to maintenancegetAvailableVehicles()- retorna uma lista de veículos disponíveis
main.dart: Demonstre seu serviço de aluguel. Crie umRentalServicee use a factory para adicionar três veículos:- Um carro:
V001,Toyota Camry, $45/dia - Uma motocicleta:
V002,Honda CBR, $35/dia - Um caminhão:
V003,Ford F-150, $75/dia
C001,Alice Johnson) e imprima o cliente. Imprima os requisitos do caminhão. Alugue o carro para Alice por 3 dias. Tente alugar o carro novamente (deve falhar). Envie a motocicleta para manutenção. Imprima quantos veículos estão disponíveis comoAvailable vehicles: X. Devolva o carro. Imprima a contagem final de disponíveis.- Um carro:
Saída esperada:
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: 2Experimente você mesmo
import 'rental_service.dart';
import 'vehicle_factory.dart';
import 'customer.dart';
void main() {
// TODO: Criar uma instância de RentalService
// TODO: Usar VehicleFactory para criar e adicionar três veículos:
// - Car: V001, Toyota Camry, $45/dia
// - Motorcycle: V002, Honda CBR, $35/dia
// - Truck: V003, Ford F-150, $75/dia
// TODO: Registrar um cliente (C001, Alice Johnson)
// TODO: Imprimir o cliente
// TODO: Imprimir os requisitos do caminhão (encontrar truck e chamar getRequirements())
// TODO: Alugar o carro (V001) para Alice (C001) por 3 dias
// TODO: Tentar alugar o carro novamente (deve falhar - não disponível)
// TODO: Enviar a motocicleta (V002) para manutenção
// TODO: Imprimir a contagem de veículos disponíveis como 'Available vehicles: X'
// TODO: Devolver o carro (V001)
// TODO: Imprimir a contagem final de veículos disponíveis
}
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosBibliotecas e ImportaçõesIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosVariáveis de InstânciaFundamentos de ConstrutoresRecapitulação - Calculadora Simples4Null Safety
Introdução ao Null SafetyNullable vs Non-NullableOs Operadores ? e !Palavra-chave Late e Null SafetyOperadores Null-AwareNull Safety em ClassesRecapitulação - Sistema de Perfil de Usuário7Classes Abstratas e Interfaces
Classes AbstratasMétodos AbstratosInterfaces em DartInterfaces ImplícitasImplementando vs EstendendoMúltiplas InterfacesRecapitulação - Calculadora de Formas10Coleções e Generics
Visão Geral de List, Set e MapColeções Type-SafeClasses GenéricasMétodos GenéricosRestrições de GenericsIterable e IteratorRecapitulação - Armazenamento Genérico13Conceitos Avançados de POO
Composição vs HerançaMétodos de ExtensãoClasses ChamáveisClasses Seladas (Dart 3)Records (Dart 3)Patterns & Matching (3.0)Enums com Métodos16Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e Usuário2Construtores em Dart
Construtor PadrãoConstrutores NomeadosListas de InicializaçãoConstrutores ConstantesConstrutores FactoryConstrutores de RedirecionamentoRecapitulação - Shape Builder5Encapsulamento
Membros Públicos vs PrivadosA Convenção do Prefixo _Privacidade em Nível de BibliotecaAprofundamento em Getters & SettersOcultação de InformaçãoRecapitulação - Registros de Estudantes8Mixins
Introdução aos MixinsCriando MixinsUsando Múltiplos MixinsPalavra-chave on em MixinsMixin vs HerançaMixin vs InterfaceRecapitulação - Sistema Animal11Métodos Especiais
Sobrescrita de toString()Sobrescrita de hashCode & ==Interface ComparableMétodo call()Sobrescrita de noSuchMethodRecapitulação - Coleção Personalizada14Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy17Desafios Finais
Plataforma de E-LearningSistema BancárioSistema de Personagens de JogoServiço de Aluguel de Veículos3Propriedades de Classe
Membros de Instância vs EstáticosCampos Final & ConstVariáveis LateMétodos e Campos EstáticosGetters e SettersRecapitulação - Gerenciador de Conta Bancária6Herança
Herança BásicaA Palavra-chave superSobrescrita de MétodoA Anotação @overrideA Palavra-chave final para ClassesConstrutores e HerançaRecapitulação - Hierarquia de Funcionários9Polimorfismo
Fundamentos do PolimorfismoPolimorfismo via InterfacesVerificação de Tipos em Tempo de ExecuçãoOs Operadores is & asPalavra-chave CovariantRecapitulação - Processador de Pagamentos12POO Assíncrona
Futures e async/awaitFundamentos de StreamsStream ControllersConstrutores AssíncronosAsync em Métodos de ClasseRecapitulação - Data Fetcher15Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository