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.
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 abstractaVehicleStateque defina cómo se comportan los vehículos en distintos estados. Incluye un método abstractoString getStatus()ybool canRent(). Después, crea tres estados concretos:AvailableState: devuelveAvailabley permite alquilarRentedState: devuelveRentedy no permite alquilarMaintenanceState: devuelveIn Maintenancey no permite alquilar
vehicle.dart: Crea una clase abstractaVehiclecon unfinalid (String), unfinalmodel (String), un_dailyRate(double) privado con un getter y un_state(VehicleState) privado inicializado enAvailableState. Incluye:- Un getter
statusque devuelva el estado del vehículo bool isAvailable(): comprueba si el estado actual permite alquilarvoid 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
toString()para que devuelva[Type] model (id) - status, donde Type es el tipo en tiempo de ejecución.- Un getter
vehicles.dart: Crea tres tipos de vehículos que extiendanVehicle:Car: el costo estándar del alquiler es la tarifa diaria multiplicada por los días. Requisitos:Valid driver's licenseMotorcycle: 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 claseVehicleFactorycon un método estáticoVehicle create(String type, String id, String model, double dailyRate)que devuelva el vehículo apropiado según el tipo (car,motorcycleotruck). Para tipos desconocidos, crea un Car de forma predeterminada.customer.dart: Crea una claseCustomercon 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 alquilergetRentalCount(): devuelve el número de alquileresbool isEligible(): devuelve true si el cliente tiene menos de 3 alquileres activos
toString()para que devuelvaCustomer: name (id) - X rentals.rental_service.dart: Crea una claseRentalServiceusando genéricos, con unList<Vehicle>para la flota y unList<Customer>para los clientes. Incluye:addVehicle(Vehicle vehicle): añade el vehículo a la flota e imprimeAdded: vehicle.toString()registerCustomer(Customer customer): añade el clienterentVehicle(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 imprimecustomerId 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 foundoVehicle not availablereturnVehicle(String vehicleId): establece el estado del vehículo en Available e imprimevehicleId returnedsendToMaintenance(String vehicleId): establece el estado del vehículo en Maintenance e imprimevehicleId sent to maintenancegetAvailableVehicles(): devuelve una lista de vehículos disponibles
main.dart: Demuestra tu servicio de alquiler. Crea unRentalServicey 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
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 comoAvailable vehicles: X. Devuelve el coche. Imprime el recuento final de vehículos disponibles.- Un coche:
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: 2Prué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
1Fundamentos de POO
Archivos externosLibrerías e importacionesIntroducción a la POOClases vs. ObjetosLa palabra clave thisMétodosVariables de instanciaConceptos básicos de constructoresResumen - Calculadora sencilla4Seguridad de nulos
Introducción a la seguridad de nulosNulables vs No nulablesLos operadores ? y !Palabra clave Late y Null SafetyOperadores Null-awareNull Safety en clasesResumen - Sistema de perfil de usuario7Clases abstractas e interfaces
Clases abstractasMétodos abstractosInterfaces en DartInterfaces implícitasImplementar vs. ExtenderInterfaces múltiplesRepaso - Calculadora de figuras10Colecciones y Genéricos
Visión general de List, Set y MapColecciones con seguridad de tiposClases genéricasMétodos genéricosRestricciones genéricasIterable e IteratorResumen - Almacenamiento genérico2Constructores en Dart
Constructor por defectoConstructores nombradosListas de inicializaciónConstructores constantesConstructores de fábricaConstructores de redireccionamientoResumen - Constructor de formas5Encapsulamiento
Miembros públicos vs. privadosLa convención del prefijo _Privacidad a nivel de libreríaProfundidad en Getters y SettersOcultamiento de informaciónResumen - Registros de estudiantes8Mixins
Introducción a los MixinsCreación de MixinsUso de múltiples MixinsPalabra clave on en MixinsMixin vs HerenciaMixin vs InterfazResumen - Sistema Animal11Métodos especiales
Sobrescritura de toString()Sobrescritura de hashCode y ==Interfaz ComparableMétodo call()Sobrescritura de noSuchMethodResumen - Colección personalizada14Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy17Desafíos finales
Plataforma de E-LearningSistema bancarioSistema de personajes de juegoServicio de alquiler de vehículos3Propiedades de clase
Miembros de instancia vs. estáticosCampos Final y ConstVariables LateMétodos y campos estáticosGetters y SettersResumen - Gestor de cuentas bancarias6Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosLa anotación @overrideLa palabra clave final en clasesConstructores y herenciaResumen - Jerarquía de empleados9Polimorfismo
Fundamentos del polimorfismoPolimorfismo mediante interfacesComprobación de tipos en tiempo de ejecuciónLos operadores is y asPalabra clave covariantResumen - Procesador de pagos12POO Asíncrona
Futures y async/awaitFundamentos de StreamsStream ControllersConstructores asíncronosAsincronía en métodos de claseRepaso - Data Fetcher15Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón RepositoryPractica por tu cuenta: Compilador de Dart online