Menu
Coddy logo textTech

Servicio de alquiler de vehículos

Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy — lección 110 de 110.

challenge icon

Desafío

Fácil

¡Felicitaciones por llegar al desafío final del curso de POO! Vamos a construir un Servicio de Alquiler de Vehículos integral que reúna todo lo que has aprendido: clases abstractas, herencia, encapsulamiento, el patrón State, el patrón Factory y genéricos.

Tu servicio de alquiler gestionará diferentes tipos de vehículos, rastreará sus estados de disponibilidad, manejará los alquileres y mantendrá registros de los clientes. Organizarás esto en siete archivos:

  • vehicle_state.dart: Crea una clase abstracta VehicleState que defina cómo se comportan los vehículos en diferentes estados. Incluye un método abstracto String getStatus() y bool canRent(). Luego crea tres estados concretos:
    • AvailableState - devuelve 'Available' y permite el alquiler
    • RentedState - devuelve 'Rented' y no permite el alquiler
    • MaintenanceState - devuelve 'In Maintenance' y no permite el alquiler
  • vehicle.dart: Crea una clase abstracta Vehicle con un id final (String), un modelo final (String), un _dailyRate privado (double) con un getter, y un _state privado (VehicleState) inicializado en AvailableState. Incluye:
    • Un getter status que devuelva el estado del vehículo
    • bool isAvailable() - verifica si el estado actual permite el alquiler
    • void setState(VehicleState state) - cambia el estado del vehículo
    • Un método abstracto double calculateRentalCost(int days)
    • Un método abstracto String getRequirements() - devuelve cualquier requisito especial
    Sobrescribe toString() para que devuelva [Type] model (id) - status donde Type es el tipo en tiempo de ejecución.
  • vehicles.dart: Crea tres tipos de vehículos que extiendan de Vehicle:
    • Car - el costo de alquiler estándar es la tarifa diaria por los días. Requisitos: "Valid driver's license"
    • Motorcycle - el costo de alquiler es la tarifa diaria por los días con un 10% de descuento. Requisitos: 'Motorcycle license, Age 21+'
    • Truck - el costo de alquiler es la tarifa diaria por los días más una tarifa fija de $50. Requisitos: 'Commercial license, Deposit required'
  • vehicle_factory.dart: Crea una clase VehicleFactory con un método estático Vehicle create(String type, String id, String model, double dailyRate) que devuelva el vehículo apropiado basado en el tipo ('car', 'motorcycle', o 'truck'). Para tipos desconocidos, crea un Car por defecto.
  • customer.dart: Crea una clase Customer con un id (String), nombre (String) y una lista privada de registros de alquiler (lista de Strings). Incluye:
    • addRental(String vehicleInfo) - agrega un registro de alquiler
    • getRentalCount() - devuelve el número de alquileres
    • bool isEligible() - devuelve true si el cliente tiene menos de 3 alquileres activos
    Sobrescribe toString() para que devuelva Customer: name (id) - X rentals.
  • rental_service.dart: Crea una clase RentalService usando genéricos con una List<Vehicle> para la flota y una List<Customer> para los clientes. Incluye:
    • addVehicle(Vehicle vehicle) - agrega a la flota, imprime 'Added: ${vehicle.toString()}'
    • registerCustomer(Customer customer) - registra al cliente
    • rentVehicle(String customerId, String vehicleId, int days) - si el cliente existe, es elegible y el vehículo está disponible: cambia el estado del vehículo a Rented, agrega el alquiler al cliente, imprime '$customerId rented $vehicleId for $days days. Cost: \${cost.toStringAsFixed(2)}'. De lo contrario, imprime el mensaje apropiado: 'Customer not found', 'Customer not eligible', 'Vehicle not found', o 'Vehicle not available'
    • returnVehicle(String vehicleId) - establece el estado del vehículo a Available, imprime '$vehicleId returned'
    • sendToMaintenance(String vehicleId) - establece el estado del vehículo a Maintenance, imprime '$vehicleId sent to maintenance'
    • getAvailableVehicles() - devuelve una lista de vehículos disponibles
  • main.dart: Demuestra tu servicio de alquiler. Crea un RentalService y usa la fábrica para agregar tres vehículos:
    • Un coche: 'V001', 'Toyota Camry', $45/día
    • Una motocicleta: 'V002', 'Honda CBR', $35/día
    • Un camión: 'V003', 'Ford F-150', $75/día
    Registra a un cliente ('C001', 'Alice Johnson') e imprime el cliente. Imprime los requisitos del camión. Alquila el coche a Alice por 3 días. Intenta alquilar el coche de nuevo (debería fallar). Envía la motocicleta a mantenimiento. Imprime cuántos vehículos están disponibles como 'Available vehicles: ${service.getAvailableVehicles().length}'. Devuelve el coche. Imprime el conteo final de disponibles.

Resultado esperado:

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

Pruébalo tú mismo

import 'rental_service.dart';
import 'vehicle_factory.dart';
import 'customer.dart';

void main() {
  // TODO: Crear una instancia de RentalService
  
  // TODO: Usar VehicleFactory para crear y añadir tres vehículos:
  // - Car: V001, Toyota Camry, $45/día
  // - Motorcycle: V002, Honda CBR, $35/día
  // - Truck: V003, Ford F-150, $75/día
  
  // TODO: Registrar un cliente (C001, Alice Johnson)
  
  // TODO: Imprimir el cliente
  
  // TODO: Imprimir los requisitos del camión (buscar truck y llamar a getRequirements())
  
  // TODO: Alquilar el coche (V001) a Alice (C001) por 3 días
  
  // TODO: Intentar alquilar el coche de nuevo (debería fallar - no disponible)
  
  // TODO: Enviar la motocicleta (V002) a mantenimiento
  
  // TODO: Imprimir el recuento de vehículos disponibles como 'Available vehicles: X'
  
  // TODO: Devolver el coche (V001)
  
  // TODO: Imprimir el recuento final de vehículos disponibles
}

Todas las lecciones de Programación Orientada a Objetos