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¡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 abstractaVehicleStateque defina cómo se comportan los vehículos en diferentes estados. Incluye un método abstractoString getStatus()ybool canRent(). Luego crea tres estados concretos:AvailableState- devuelve'Available'y permite el alquilerRentedState- devuelve'Rented'y no permite el alquilerMaintenanceState- devuelve'In Maintenance'y no permite el alquiler
vehicle.dart: Crea una clase abstractaVehiclecon un idfinal(String), un modelofinal(String), un_dailyRateprivado (double) con un getter, y un_stateprivado (VehicleState) inicializado enAvailableState. Incluye:- Un getter
statusque devuelva el estado del vehículo bool isAvailable()- verifica si el estado actual permite el alquilervoid 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) - statusdonde Type es el tipo en tiempo de ejecución.- Un getter
vehicles.dart: Crea tres tipos de vehículos que extiendan deVehicle: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 claseVehicleFactorycon un método estáticoVehicle 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 claseCustomercon un id (String), nombre (String) y una lista privada de registros de alquiler (lista de Strings). Incluye:addRental(String vehicleInfo)- agrega 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 unaList<Vehicle>para la flota y unaList<Customer>para los clientes. Incluye:addVehicle(Vehicle vehicle)- agrega a la flota, imprime'Added: ${vehicle.toString()}'registerCustomer(Customer customer)- registra al 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, 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 unRentalServicey 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
'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.- Un coche:
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: 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 Repository