Requirements

  1. Parking spot assignment based on vehicle size
  2. Entry/Exit ticket management
  3. Calculate parking fees based on duration
  4. Keep track of available and occupied spots


Define Core Objects

Vehicle

Spot

Floor

Garage

Parking System



Analyze Relationships

One vehicle to a spot

Multiple spots to a floor

Multiple floors in a garage

One garage for a parking system



Establish Hierarchy

Vehicles and Spots inherit from the size enum





Design Patterns

Consider using design patterns (e.g., Factory, Singleton, Observer, Strategy) that fit the problem...






import datetime import math from enum import Enum class Vehicle: def __init__(self, size): self.size = size class Driver: def __init__(self, id, vehicle): self.id = id self.vehicle = vehicle self.payment_due = 0 def charge(self, amount): self.payment_due += amount class Size(Enum): SMALL = 1 MEDIUM = 2 LARGE = 3 class Car(Vehicle): def __init__(self): super().__init__(Size.SMALL) class Limo(Vehicle): def __init__(self): super().__init__(Size.MEDIUM) class SemiTruck(Vehicle): def __init__(self): super().__init__(Size.LARGE) class Spot: def __init__(self, id, size): self.size = size self.id = id self.vehicle = None def assign_vehicle(self, vehicle): self.vehicle = vehicle def release_vehicle(self): vehicle = self.vehicle self.vehicle = None return vehicle class Floor: def __init__(self, small, medium, large): self.spots = [] for i in range(small): self.spots.append(Spot(f'Small-{i+1}', Size.SMALL)) for i in range(medium): self.spots.append(Spot(f'Medium-{i+1}', Size.MEDIUM)) for i in range(large): self.spots.append(Spot(f'Large-{i+1}', Size.LARGE)) self.vehicle_map = {} # vehicle: spot ID def find_available_spot(self, vehicle): for spot in self.spots: if not spot.vehicle and spot.size.value >= vehicle.size.value: return spot return None def assign_vehicle_to_spot(self, vehicle): available_spot = self.find_available_spot(vehicle) if available_spot: available_spot.assign_vehicle(vehicle) self.vehicle_map[vehicle] = available_spot return True return False def release_spot(self, id): for spot in self.spots: if spot.spot_id == spot_id: vehicle = spot.release_vehicle() del self.vehicle_map[vehicle] return True return False class Garage: def __init__(self): # [] self.floors = [] def addFloor(self, small, medium, large): self.floors.append(Floor(small, medium, large)) def park_vehicle(self, vehicle): for floor in self.floors: if floor.assign_vehicle_to_spot(vehicle): return True return False def remove_vehicle(self, vehicle): for floor in self.floors: if vehicle in floor.vehicle_map: floor.release_spot(self.vehicle_map[vehicle]) return True return False class ParkingSystem: def __init__(self, parkingGarage, hourlyRate): self.parkingGarage = parkingGarage self.hourlyRate = hourlyRate self.timeParked = {} # map driverId to time that they parked def park_vehicle(self, driver): isParked = self.parkingGarage.park_vehicle(driver.get_vehicle()) if isParked: self.timeParked[driver.id] = datetime.datetime.now() return isParked def remove_vehicle(self, driver): if driver.id not in self.timeParked: return False currentHour = datetime.datetime.now().hour time_parked = self.timeParked[driver.id] duration = datetime.datetime.now() - time_parked hours_billed = math.ceil(duration.total_seconds() / 3600) driver.charge(hours_billed * self.hourlyRate) del self.timeParked[driver.id] return self.parkingGarage.remove_vehicle(driver.id)




Adhere to SOLID Guidelines

Check and explain whether your design adheres to solid principles (Ask interviewer what SOLID principle is if you can not recall it.)...






Consider Scalability and Flexibility

Explain how your design can handle changes in scale and whether it would be easily to extend with new functionalities...






Create/Explain your diagram(s)

Try creating a class, flow, state and/or sequence diagram using the diagramming tool. Mermaid flow diagrams can be used to represent system use cases. You can ask the interviewer bot to create a starter diagram if unfamiliar with the tool. Briefly explain your diagrams if necessary...






Future improvements

Critically examine your design for any flaws or areas for future improvement...