Serviço de Aluguel de Veículos
Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 65 de 65.
Desafio
MédioCrie um serviço de aluguel de veículos: veículos de dois tipos, aluguéis e a agência que gerencia ambos. Os preços são em dólares inteiros (int).
Vehicle em vehicle.gd:
- O construtor recebe
vin,make,modeledaily_rate;availablecomeça comotrue. start_rental() -> bool: retornafalsequando o veículo não está disponível; caso contrário, marca-o como indisponível e retornatrue.end_rental()torna o veículo disponível novamente._to_string()retornaMAKE MODEL (VIN: VIN) - Available, ou- Rentedno final.
Car em car.gd e Motorcycle em motorcycle.gd estendem Vehicle. Seus construtores recebem os quatro valores do veículo mais seats (carro) ou engine_size (motocicleta). O método _to_string() complementa o texto da classe pai: Car: + texto do veículo + - 5 seats, e Motorcycle: + texto do veículo + - 600cc.
Rental em rental.gd:
- O construtor recebe
rental_id, o objetovehicle,customer_nameedays;is_activecomeça comotrue. calculate_cost() -> int: a tarifa diária multiplicada pelos dias.end_rental() -> bool: retornafalsepara um aluguel que já terminou; caso contrário, encerra o aluguel, encerra o aluguel do veículo e retornatrue._to_string():Rental ID: MAKE MODEL for CUSTOMER, D days, $COST - Active, ou- Completed.
RentalAgency em rental_agency.gd:
- O construtor recebe
agency_name.vehiclesé um dicionário que associa VINs a veículos,rentalsé um dicionário que associa IDs de aluguel a aluguéis, enext_rental_idcomeça em1. add_vehicle(vehicle)armazena um veículo usando seu VIN como chave.rent_vehicle(vin, customer_name, days) -> String: retorna""para um VIN desconhecido, menos de1dia ou um veículo que não está disponível. Caso contrário, inicia o aluguel do veículo, cria umRentalcom o IDR1,R2... (o contador só aumenta quando um aluguel é bem-sucedido), armazena-o e retorna o ID.return_vehicle(rental_id) -> bool: retornafalsepara um ID desconhecido; caso contrário, retorna o valor retornado porend_rental()do aluguel.available_vehicles() -> Array[Vehicle]: os veículos disponíveis, na ordem em que foram adicionados.total_revenue() -> int: a soma dos custos de todos os aluguéis, ativos ou concluídos.
Um aluguel armazena seu veículo, mas um veículo não armazena seu aluguel, então nenhum par de objetos aponta um para o outro. 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
revenuea saída é:
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: $150Seu código deve ficar em vehicle.gd, car.gd, motorcycle.gd, rental.gd e rental_agency.gd. main.gd contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
extends Node
func _ready():
# Código de entrada/saída fornecido: mantenha-o 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 as lições de Programação orientada a objetos
1Fundamentos da POO
Arquivos externosIntrodução à POOClasses vs. objetosA palavra-chave selfMétodosPropriedadesConstrutor (_init)Revisão - Calculadora simples4Polimorfismo
Revisitando a Sobrescrita de MétodosDuck TypingClasses e Métodos AbstratosDesign de InterfacesRevisão - Calculadora de Formas7Sinais
O que é um sinal?Declarando e emitindoConectando-se a sinaisSinais com argumentosRevisão - Sistema de saúde10Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite2Propriedades de Classe
Variáveis de Instância vs. EstáticasFunções EstáticasMétodos Setters de PropriedadeMétodos Getters de PropriedadePrivado por ConvençãoRecapitulando: Gerenciador de Conta Bancária5Encapsulamento
Membros públicos e privadosValidação com settersOcultação de informaçõesPropriedades somente para leituraRevisão - Sistema de registros de alunos8Conceitos Avançados de POO
Composição vs. HerançaClasses InternasNós como ComponentesRefCounted vs. NodeEnums em Classes3Herança
Herança básicaA palavra-chave superSobrescrita de métodosCadeias de herançaVerificações de tipo com isRevisão - Hierarquia de funcionários6Métodos especiais
Introdução aos métodos virtuaisO método _to_stringIteradores personalizadosRevisão - Lista personalizada9Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy12Desafios Finais
Plataforma de Ensino OnlineSistema BancárioDesenvolvimento de Personagens de JogosServiço de Aluguel de VeículosPratique por conta própria: Compilador de GDScript online