Menu
Coddy logo textTech

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.

challenge icon

Desafio

Fácil

Parabé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 abstrata VehicleState que define como os veículos se comportam em diferentes estados. Inclua um método abstrato String getStatus() e bool canRent(). Em seguida, crie três estados concretos:
    • AvailableState - retorna Available e permite o aluguel
    • RentedState - retorna Rented e não permite o aluguel
    • MaintenanceState - retorna In Maintenance e não permite o aluguel
  • vehicle.dart: Crie uma classe abstrata Vehicle com um id final (String), modelo final (String), um _dailyRate privado (double) com um getter, e um _state privado (VehicleState) inicializado como AvailableState. Inclua:
    • Um getter status que retorna o status do estado
    • bool isAvailable() - verifica se o estado atual permite o aluguel
    • void 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
    Sobrescreva toString() para retornar [Type] model (id) - status onde Type é o tipo em tempo de execução (runtime type).
  • vehicles.dart: Crie três tipos de veículos estendendo Vehicle:
    • Car - o custo de aluguel padrão é a taxa diária vezes os dias. Requisitos: Valid driver's license
    • Motorcycle - 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 classe VehicleFactory com um método estático Vehicle create(String type, String id, String model, double dailyRate) que retorna o veículo apropriado com base no tipo (car, motorcycle, ou truck). Para tipos desconhecidos, o padrão deve ser criar um Car.
  • customer.dart: Crie uma classe Customer com um id (String), nome (String) e uma lista privada de registros de aluguel (lista de Strings). Inclua:
    • addRental(String vehicleInfo) - adiciona um registro de aluguel
    • getRentalCount() - retorna o número de aluguéis
    • bool isEligible() - retorna true se o cliente tiver menos de 3 aluguéis ativos
    Sobrescreva toString() para retornar Customer: name (id) - X rentals.
  • rental_service.dart: Crie uma classe RentalService usando generics com uma List<Vehicle> para a frota e uma List<Customer> para os clientes. Inclua:
    • addVehicle(Vehicle vehicle) - adiciona à frota, imprime Added: vehicle.toString()
    • registerCustomer(Customer customer) - registra o cliente
    • rentVehicle(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, imprime customerId 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, ou Vehicle not available
    • returnVehicle(String vehicleId) - define o estado do veículo como Available, imprime vehicleId returned
    • sendToMaintenance(String vehicleId) - define o estado do veículo como Maintenance, imprime vehicleId sent to maintenance
    • getAvailableVehicles() - retorna uma lista de veículos disponíveis
  • main.dart: Demonstre seu serviço de aluguel. Crie um RentalService e 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
    Registre um cliente (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 como Available vehicles: X. Devolva o carro. Imprima a contagem final de disponíveis.

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: 2

Experimente 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