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 criar 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, o padrão Factory e genéricos.

Seu serviço de aluguel gerenciará diferentes tipos de veículos, acompanhará seus estados de disponibilidade, cuidará dos aluguéis e manterá registros dos clientes. Você organizará tudo isso em sete arquivos:

  • vehicle_state.dart: Crie uma classe abstrata VehicleState que defina 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 final id (String), um final model (String), um _dailyRate (double) privado com um getter e um _state (VehicleState) privado inicializado como AvailableState. Inclua:
    • Um getter status que retorne 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
    Substitua toString() para retornar [Type] model (id) - status, em que Type é o tipo em tempo de execução.
  • vehicles.dart: Crie três tipos de veículos que estendam Vehicle:
    • Car — o custo padrão do aluguel é a tarifa diária multiplicada pelo número de dias. Requisitos: Valid driver's license
    • Motorcycle — o custo do aluguel é a tarifa diária multiplicada pelo número de dias, com um desconto de 10%. Requisitos: Motorcycle license, Age 21+
    • Truck — o custo do aluguel é a tarifa diária multiplicada pelo número de 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 retorne 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), name (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
    Substitua toString() para retornar Customer: name (id) - X rentals.
  • rental_service.dart: Crie uma classe RentalService usando genéricos, com uma List<Vehicle> para a frota e uma List<Customer> para os clientes. Inclua:
    • addVehicle(Vehicle vehicle) — adiciona à frota e imprime Added: vehicle.toString()
    • registerCustomer(Customer customer) — adiciona 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 e imprime customerId rented vehicleId for X days. Cost: $Y (Y formatado com 2 casas decimais). Caso contrário, imprime 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 e imprime vehicleId returned
    • sendToMaintenance(String vehicleId) — define o estado do veículo como Maintenance e 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 veículos 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