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




Analyze Relationships





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...