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

Pratique por conta própria: Compilador de Dart online