Servicio de alquiler de vehículos
Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 65 de 65.
Desafío
IntermedioConstruye un servicio de alquiler de vehículos: vehículos de dos tipos, alquileres y la agencia que gestiona ambos. Los precios son números enteros de dólares (int).
Vehicle en vehicle.gd:
- El constructor recibe
vin,make,modelydaily_rate;availableempieza comotrue. start_rental() -> bool: devuelvefalsecuando el vehículo no está disponible; de lo contrario, lo marca como no disponible y devuelvetrue.end_rental()hace que vuelva a estar disponible._to_string()devuelveMAKE MODEL (VIN: VIN) - Available, o- Rentedal final.
Car en car.gd y Motorcycle en motorcycle.gd extienden Vehicle. Sus constructores reciben los cuatro valores del vehículo más seats (coche) o engine_size (motocicleta). Su método _to_string() se basa en el texto de la clase padre: Car: + el texto del vehículo + - 5 seats, y Motorcycle: + el texto del vehículo + - 600cc.
Rental en rental.gd:
- El constructor recibe
rental_id, el objetovehicle,customer_nameydays;is_activeempieza comotrue. calculate_cost() -> int: la tarifa diaria multiplicada por los días.end_rental() -> bool:falsepara un alquiler que ya terminó; de lo contrario, lo finaliza, termina el alquiler del vehículo y devuelvetrue._to_string():Rental ID: MAKE MODEL for CUSTOMER, D days, $COST - Active, o- Completed.
RentalAgency en rental_agency.gd:
- El constructor recibe
agency_name.vehicleses un diccionario que asigna cada VIN a un vehículo,rentalses un diccionario que asigna cada id de alquiler a un alquiler, ynext_rental_idempieza en1. add_vehicle(vehicle)guarda un vehículo usando su VIN como clave.rent_vehicle(vin, customer_name, days) -> String: devuelve""si el VIN no existe, si se solicita menos de1día o si el vehículo no está disponible. De lo contrario, inicia el alquiler del vehículo, crea unRentalcon el idR1,R2... (el contador solo aumenta cuando el alquiler se realiza correctamente), lo guarda y devuelve el id.return_vehicle(rental_id) -> bool: devuelvefalsesi el id no existe; de lo contrario, devuelve el valor que devuelveend_rental()del alquiler.available_vehicles() -> Array[Vehicle]: los vehículos disponibles, en el orden en que se añadieron.total_revenue() -> int: la suma de los costos de todos los alquileres, activos o completados.
Un alquiler almacena su vehículo, pero un vehículo no almacena su alquiler, así que no hay dos objetos que se apunten mutuamente. Para esta entrada:
Speedy Rentals
car C1|Toyota|Camry|50|5
moto M1|Honda|CBR|40|600
rent C1|Ana|3
rent C1|Ben|2
available
kind M1
rentals
revenuela salida es:
Rented C1 as R1: $150
Cannot rent C1
Available at Speedy Rentals:
- Motorcycle: Honda CBR (VIN: M1) - Available - 600cc
M1: Vehicle true, Car false, Motorcycle true
Rental R1: Toyota Camry for Ana, 3 days, $150 - Active
Revenue: $150Tu código va en vehicle.gd, car.gd, motorcycle.gd, rental.gd y rental_agency.gd. main.gd contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
extends Node
func _ready():
# Código de entrada/salida proporcionado: mantenlo tal como está
var agency := RentalAgency.new(OS.read_string_from_stdin())
var line := OS.read_string_from_stdin()
while line != "":
var parts := line.split(" ", true, 1)
var f: PackedStringArray = parts[1].split("|") if parts.size() > 1 else PackedStringArray()
match parts[0]:
"vehicle":
agency.add_vehicle(Vehicle.new(f[0], f[1], f[2], int(f[3])))
"car":
agency.add_vehicle(Car.new(f[0], f[1], f[2], int(f[3]), int(f[4])))
"moto":
agency.add_vehicle(Motorcycle.new(f[0], f[1], f[2], int(f[3]), int(f[4])))
"rent":
var rental_id: String = agency.rent_vehicle(f[0], f[1], int(f[2]))
if rental_id == "":
print("Cannot rent ", f[0])
else:
var rental: Rental = agency.rentals[rental_id]
print("Rented %s as %s: $%d" % [f[0], rental_id, rental.calculate_cost()])
"return":
print("Return ", f[0], ": ", agency.return_vehicle(f[0]))
"available":
print("Available at ", agency.agency_name, ":")
for vehicle in agency.available_vehicles():
print("- ", vehicle)
"fleet":
for vin in agency.vehicles:
print(agency.vehicles[vin])
"kind":
var vehicle: Vehicle = agency.vehicles[f[0]]
print("%s: Vehicle %s, Car %s, Motorcycle %s" % [f[0], vehicle is Vehicle, vehicle is Car, vehicle is Motorcycle])
"rentals":
for rental_id in agency.rentals:
print(agency.rentals[rental_id])
"revenue":
print("Revenue: $", agency.total_revenue())
line = OS.read_string_from_stdin()
Todas las lecciones de Programación orientada a objetos
1Fundamentos de la programación orientada a objetos
Archivos externosIntroducción a la programación orientada a objetosClases vs. objetosLa palabra clave selfMétodosPropiedadesConstructor (_init)Repaso: calculadora sencilla4Polimorfismo
Repaso de la sobrescritura de métodosTipado patoClases y métodos abstractosDiseño de interfacesRepaso: calculadora de formas7Señales
¿Qué es una señal?Declarar y emitirConectarse a las señalesSeñales con argumentosRepaso: sistema de salud10Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite2Propiedades de clase
Variables de instancia y estáticasFunciones estáticasMétodos setter de propiedadesMétodos getter de propiedadesPrivado por convenciónRepaso: administrador de cuentas bancarias5Encapsulación
Miembros públicos y privadosValidación con settersOcultación de informaciónPropiedades de solo lecturaRepaso: sistema de registros de estudiantes8Conceptos avanzados de POO
Composición frente a herenciaClases internasNodos como componentesRefCounted frente a NodeEnums en clases3Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosCadenas de herenciaComprobaciones de tipo con isRepaso: jerarquía de empleados6Métodos especiales
Introducción a los métodos virtualesEl método _to_stringIteradores personalizadosRepaso: lista personalizada9Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy12Desafíos finales
Plataforma de aprendizaje en líneaSistema bancarioDesarrollo de personajes de videojuegosServicio de alquiler de vehículosPractica por tu cuenta: Compilador de GDScript online