Requirements
- Parking spot assignment based on vehicle size
- Entry/Exit ticket management
- Calculate parking fees based on duration
- 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...