Requirements
- Assign parking lots based on vehicle sizes
- Track and manage available parking spots
- Calculate parking fees based on duration using various pricing models
- Handle vehicle entry with ticket issuance and process vehicle exits with payment settlements
Define Core Objects
Based on the requirements and use cases, identify the main objects of the system...
Analyze Relationships
Determine how these objects will interact with each other to fulfill the use cases...
Establish Hierarchy
Design inheritance trees where applicable to promote code reuse and polymorphism. This step involves identifying common attributes and behaviors that can be abstracted into parent classes...
Design Patterns
Consider using design patterns (e.g., Factory, Singleton, Observer, Strategy) that fit the problem...
class Vehicle:
def __init__(self, spot_size):
self._spot_size = spot_size
def get_spot_size(self):
return self._spot_size
class Driver:
def __init__(self, id, vehicle):
self._id = id
self._vehicle = vehicle
self._payment_due = 0
def get_vehicle(self):
return self._vehicle
def get_id(self):
return self._id
def charge(self, amount):
self._payment_due += amount
class Car(Vehicle):
def __init__(self):
super().__init__(1)
class Limo(Vehicle):
def __init__(self):
super().__init__(2)
class SemiTruck(Vehicle):
def __init__(self):
super().__init__(3)
class ParkingFloor:
def __init__(self, spot_count):
self._spots = [0]*spot_count
self._vehicle_map = {}
def park_vehicle(self, vehicle):
size = vehicle.get_spot_size()
l, r = 0, 0
while r < len(self._spots):
if self._spots[r] != 0:
l = r + 1
if r - l + 1 == size:
# we found enough spots, park the vehicle
for k in range(l, r+1):
self._spots[k] = 1
self._vehicle_map[vehicle] = [l, r]
return True
r += 1
return False
def remove_vehicle(self, vehicle):
start, end = self._vehicle_map[vehicle]
for i in range(start, end + 1):
self._spots[i] = 0
del self._vehicle_map[vehicle]
def get_parking_spots(self):
return self._spots
def get_vehicle_spots(self, vehicle):
return self._vehicle_map.get(vehicle)
class ParkingGarage:
def __init__(self, floor_count, spots_per_floor):
self._parking_floors = [ParkingFloor(spots_per_floor) for _ in range(floor_count)]
def park_vehicle(self, vehicle):
for floor in self._parking_floors:
if floor.park_vehicle(vehicle):
return True
return False
def remove_vehicle(self, vehicle):
for floor in self._parking_floors:
if floor.get_vehicle_spots(vehicle):
floor.remove_vehicle(vehicle)
return True
return False
import datetime
import math
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):
currentHour = datetime.datetime.now().hour
isParked = self._parkingGarage.park_vehicle(driver.get_vehicle())
if isParked:
self._timeParked[driver.get_id()] = currentHour
return isParked
def remove_vehicle(self, driver):
if driver.get_id() not in self._timeParked:
return False
currentHour = datetime.datetime.now().hour
timeParked = math.ceil(currentHour - self._timeParked[driver.get_id()])
driver.charge(timeParked * self._hourlyRate)
del self._timeParked[driver.get_id()]
return self._parkingGarage.remove_vehicle(driver.get_vehicle())
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...