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

¡Felicidades por llegar al desafío final del curso de POO! Construyamos un Servicio de alquiler de vehículos completo que reúna todo lo que has aprendido: clases abstractas, herencia, encapsulación, el patrón State, el patrón Factory y los genéricos.

Tu servicio de alquiler administrará distintos tipos de vehículos, hará un seguimiento de sus estados de disponibilidad, gestionará los alquileres y mantendrá los registros de los clientes. Organizarás todo esto en siete archivos:

  • vehicle_state.dart: Crea una clase abstracta VehicleState que defina cómo se comportan los vehículos en distintos estados. Incluye un método abstracto String getStatus() y bool canRent(). Después, crea tres estados concretos:
    • AvailableState: devuelve Available y permite alquilar
    • RentedState: devuelve Rented y no permite alquilar
    • MaintenanceState: devuelve In Maintenance y no permite alquilar
  • vehicle.dart: Crea una clase abstracta Vehicle con un final id (String), un final model (String), un _dailyRate (double) privado con un getter y un _state (VehicleState) privado inicializado en AvailableState. Incluye:
    • Un getter status que devuelva el estado del vehículo
    • bool isAvailable(): comprueba si el estado actual permite alquilar
    • 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 Vehicle:
    • Car: el costo estándar del alquiler es la tarifa diaria multiplicada por los días. Requisitos: Valid driver's license
    • Motorcycle: el costo del alquiler es la tarifa diaria multiplicada por los días, con un descuento del 10 %. Requisitos: Motorcycle license, Age 21+
    • Truck: el costo del alquiler es la tarifa diaria multiplicada 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 según el tipo (car, motorcycle o truck). Para tipos desconocidos, crea un Car de forma predeterminada.
  • customer.dart: Crea una clase Customer con un id (String), un name (String) y una lista privada de registros de alquiler (lista de Strings). Incluye:
    • addRental(String vehicleInfo): añade 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 un List<Vehicle> para la flota y un List<Customer> para los clientes. Incluye:
    • addVehicle(Vehicle vehicle): añade el vehículo a la flota e imprime Added: vehicle.toString()
    • registerCustomer(Customer customer): añade el 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, añade el alquiler al cliente e imprime customerId rented vehicleId for X days. Cost: $Y (Y con formato de 2 decimales). De lo contrario, imprime el mensaje correspondiente: Customer not found, Customer not eligible, Vehicle not found o Vehicle not available
    • returnVehicle(String vehicleId): establece el estado del vehículo en Available e imprime vehicleId returned
    • sendToMaintenance(String vehicleId): establece el estado del vehículo en Maintenance e 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 factoría para añadir 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 un cliente (C001, Alice Johnson) e imprime el cliente. Imprime los requisitos del camión. Alquila el coche a Alice durante 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: X. Devuelve el coche. Imprime el recuento final de vehículos disponibles.

Salida 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

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

Practica por tu cuenta: Compilador de Dart online