The before code mixes room and booking logic in one class, making it hard to extend. The after code separates concerns: Hotel manages rooms, Room manages bookings and availability, and Booking represents a reservation. This makes the system clearer and easier to maintain.
### Before: All logic in one class (bad design)
class HotelSystem:
def __init__(self):
self.rooms = {}
self.bookings = []
def add_room(self, room_number, room_type):
self.rooms[room_number] = {'type': room_type, 'booked_dates': []}
def book_room(self, room_number, date):
if date not in self.rooms[room_number]['booked_dates']:
self.rooms[room_number]['booked_dates'].append(date)
self.bookings.append({'room': room_number, 'date': date})
return True
return False
### After: Separate classes with clear responsibilities
class Booking:
def __init__(self, room, date):
self.room = room
self.date = date
class Room:
def __init__(self, number, room_type):
self.number = number
self.room_type = room_type
self.bookings = []
def is_available(self, date):
return all(booking.date != date for booking in self.bookings)
def book(self, date):
if self.is_available(date):
booking = Booking(self, date)
self.bookings.append(booking)
return booking
return None
class Hotel:
def __init__(self):
self.rooms = {}
def add_room(self, number, room_type):
self.rooms[number] = Room(number, room_type)
def book_room(self, number, date):
room = self.rooms.get(number)
if room:
return room.book(date)
return None