Задача: вас попросили сделать код ревью новой фичи, суть которой в возможности забронировать тур (состоящий из авиабилета и отеля). Фичи для раздельного бронирования авиабилета и тура уже существуют, от данной задачи ожидается наличие единого метода, который забронирует либо тур целиком, либо ничего из компонентов тура.
AI-дан жауап
sobes.tech AI
Для реализации единого метода бронирования тура, который либо бронирует все компоненты (авиабилет и отель), либо ничего, нужно использовать транзакционный подход. Это значит, что бронирование должно быть атомарным: если бронирование авиабилета прошло успешно, а бронирование отеля — нет, то нужно отменить уже сделанное бронирование авиабилета.
В C# это можно реализовать с помощью паттерна "Транзакция" или используя механизмы управления транзакциями, если бронирование происходит через базы данных или внешние сервисы, поддерживающие откат.
Примерный подход:
public class BookingService
{
private readonly FlightService _flightService;
private readonly HotelService _hotelService;
public BookingService(FlightService flightService, HotelService hotelService)
{
_flightService = flightService;
_hotelService = hotelService;
}
public bool BookTour(TourRequest request)
{
var flightBookingId = _flightService.BookFlight(request.FlightDetails);
if (flightBookingId == null)
return false;
var hotelBookingId = _hotelService.BookHotel(request.HotelDetails);
if (hotelBookingId == null)
{
_flightService.CancelBooking(flightBookingId); // Откат бронирования авиабилета
return false;
}
return true;
}
}
Таким образом, если бронирование отеля не удалось, мы отменяем бронирование авиабилета, обеспечивая целостность операции. В реальных условиях стоит учитывать обработку исключений, таймауты и возможные проблемы с консистентностью при работе с внешними сервисами.