Skip to content

Latest commit

 

History

History
159 lines (123 loc) · 4.72 KB

File metadata and controls

159 lines (123 loc) · 4.72 KB

Designing a Vehicle Rental System

In this article, we explore the object-oriented design and implementation of a Vehicle Rental System using Python3.

This system facilitates the renting of vehicles for short and long durations.

System Requirements

The Vehicle Rental System should:

  1. Vehicle Management: Handle various types of vehicles available for rent.
  2. User Account Management: Manage customer registrations and profiles.
  3. Rental Process: Enable users to rent and return vehicles.
  4. Pricing and Payment: Calculate rental charges and process payments.
  5. Reservation System: Support advance booking of vehicles.

Core Use Cases

  1. Adding and Managing Vehicles
  2. Registering and Managing User Accounts
  3. Renting and Returning Vehicles
  4. Calculating Rental Charges
  5. Handling Reservations

Key Classes:

  • VehicleRentalSystem: Manages the overall system.
  • User: Represents a system user or customer.
  • Vehicle: Abstract class for various types of vehicles.
  • Rental: Represents a vehicle rental transaction.

Python3 Implementation

Vehicle Class (Abstract)

Represents a generic vehicle.

from abc import ABC, abstractmethod

class Vehicle(ABC):
    def __init__(self, vehicle_id: str, model: str, rate_per_day: float):
        self.vehicle_id = vehicle_id
        self.model = model
        self.rate_per_day = rate_per_day

    # Python doesn't need explicit getters/setters unless additional processing is required.

User Class

Manages user account information.

class User:
    def __init__(self, user_id: str, name: str, driver_license_number: str):
        self.user_id = user_id
        self.name = name
        self.driver_license_number = driver_license_number

Rental Class

Represents a vehicle rental transaction.

from datetime import datetime

class Rental:
    def __init__(self, rental_id: str, user: User, vehicle: Vehicle, rental_date: datetime):
        self.rental_id = rental_id
        self.user = user
        self.vehicle = vehicle
        self.rental_date = rental_date
        self.return_date = None
        self.total_charge = 0.0

    def complete_rental(self, return_date: datetime):
        self.return_date = return_date
        self.total_charge = self.calculate_total_charge()

    def calculate_total_charge(self) -> float:
        rental_days = (self.return_date - self.rental_date).days
        return rental_days * self.vehicle.rate_per_day

VehicleRentalSystem Class

Manages the vehicle rental system operations.

class VehicleRentalSystem:
    def __init__(self):
        self.users = []
        self.vehicles = []
        self.rentals = []

    def add_user(self, user: User):
        self.users.append(user)

    def add_vehicle(self, vehicle: Vehicle):
        self.vehicles.append(vehicle)

    def rent_vehicle(self, user_id: str, vehicle_id: str, rental_date: datetime):
        user = self.find_user_by_id(user_id)
        vehicle = self.find_vehicle_by_id(vehicle_id)
        if user and vehicle:
            rental = Rental(self.generate_rental_id(), user, vehicle, rental_date)
            self.rentals.append(rental)
            return rental
        return None

    def return_vehicle(self, rental_id: str, return_date: datetime):
        rental = self.find_rental_by_id(rental_id)
        if rental:
            rental.complete_rental(return_date)

    def find_user_by_id(self, user_id: str):
        for user in self.users:
            if user.user_id == user_id:
                return user
        return None

    def find_vehicle_by_id(self, vehicle_id: str):
        for vehicle in self.vehicles:
            if vehicle.vehicle_id == vehicle_id:
                return vehicle
        return None

    def find_rental_by_id(self, rental_id: str):
        for rental in self.rentals:
            if rental.rental_id == rental_id:
                return rental
        return None

    def generate_rental_id(self) -> str:
        import time
        return f"RENTAL_{int(time.time() * 1000)}"

Example Usage

def main():
    system = VehicleRentalSystem()
    user = User("u123", "John Doe", "DL12345678")
    vehicle = Vehicle("v123", "Toyota Camry", 45.0)  # You will need to subclass Vehicle or modify it to be non-abstract
    system.add_user(user)
    system.add_vehicle(vehicle)

    rental_date = datetime.now()
    rental = system.rent_vehicle("u123", "v123", rental_date)
    if rental:
        print(f"Vehicle rented: {rental.vehicle.model}")

    return_date = rental_date + timedelta(days=4)
    system.return_vehicle(rental.rental_id, return_date)
    if rental.total_charge > 0:
        print(f"Total charge for the rental: ${rental.total_charge:.2f}")

if __name__ == "__main__":
    main()