/
NonerCo
/
Exam
Обзор
Документация
Войти
/
NonerCo
/
Exam
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Event.py
133 строки
4 KB
NonerCo
create Event.py
17 янв 2026, 15:03
Верифицирован
17 янв 2026, 15:03
3fba728
Код
Авторство
О чём код?
from abc import ABC, abstractmethod # Класс описывает состояние пользователь class User: def __init__(self, user_id, name): self.id = user_id self.name = name # Класс описывает состояние места class Seat: FREE = 'free' RESERVED = 'reserved' SOLD = 'sold' def __init__(self, seat_id, row, number): self.id = seat_id self.row = row self.number = number self.status = Seat.FREE self.current_user = None # Класс описывает состояние мероприятия class EventSession: def __init__(self, session_id, time, Seats): self.id = session_id self.time = time self.Seats = Seats # ключ — seat_id # Интерфейс команды бронирования и покупки билета class BookingCommand(ABC): @abstractmethod def execute(self, session, seat_id, user): pass @abstractmethod def undo(self): pass # Класс для команды бронирования class ReserveSeat(BookingCommand): def __init__(self): self.prev_state = None def execute(self, session, seat_id, user): Seat = session.Seats.get(seat_id) # Проверяем состояние места if Seat and Seat.status == Seat.FREE: self.prev_state = (Seat.status, Seat.current_user) Seat.status = Seat.RESERVED Seat.current_user = user else: return f"Место {seat_id} недоступно для бронирования." def undo(self): pass # Класс для команды отмены брони class CancelReservation(BookingCommand): def __init__(self): self.prev_state = None def execute(self, session, seat_id, user): Seat = session.Seats.get(seat_id) # Проверяем состояние места if Seat and Seat.status == Seat.RESERVED and Seat.current_user == user: self.prev_state = (Seat.status, Seat.current_user) Seat.status = Seat.FREE Seat.current_user = None else: return f"Невозможно отменить бронь для места {seat_id}." def undo(self): pass # Класс для покупки билета class PurchaseTicket(BookingCommand): def __init__(self): self.prev_state = None def execute(self, session, seat_id, user): Seat = session.Seats.get(seat_id) # Изменяем состояние места self.prev_state = (Seat.status, Seat.current_user) Seat.status = Seat.SOLD Seat.current_user = user def undo(self): # Возврат предыдущего состояния pass # Обеспечивает последовательность и атомарность операций class BookingProcessor: def __init__(self): self.history = [] def execute_command(self, command, session, seat_id, user): command.execute(session, seat_id, user) self.history.append(command) def undo_last(self): if self.history: command = self.history.pop() command.undo() # Пример if __name__ == '__main__': # Создаём места Seats = {f'Seat_{i}': Seat(f'Seat_{i}', 'A', i) for i in range(1, 11)} session = EventSession('session1', '2025-01-17 16:30', Seats) user1 = User('user1', 'Стас') user2 = User('user2', 'Генадий') processor = BookingProcessor() # Статус до брони print(f"Место 1 статус до бронирования: {session.Seats['Seat_1'].status}") # Бронь места reserve_cmd = ReserveSeat() processor.execute_command(reserve_cmd, session, 'Seat_1', user1) print(f"Место 1 статус после бронирования: {session.Seats['Seat_1'].status}") # Покупка места purchase_cmd = PurchaseTicket() processor.execute_command(purchase_cmd, session, 'Seat_1', user1) print(f"Место 1 статус после покупки: {session.Seats['Seat_1'].status}")