Sobes.tech
Middle+

Compito: ti è stato chiesto di fare una revisione del codice di una nuova funzionalità, la cui essenza è la possibilità di prenotare un tour (composto da un biglietto aereo e un hotel). Le funzionalità per prenotare separatamente il biglietto aereo e il tour esistono già, e si prevede che questa attività includa un metodo unificato che prenoti o l'intero tour o nessuno dei suoi componenti.

sobes.tech AI

Risposta dell'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;
    }
}

Таким образом, если бронирование отеля не удалось, мы отменяем бронирование авиабилета, обеспечивая целостность операции. В реальных условиях стоит учитывать обработку исключений, таймауты и возможные проблемы с консистентностью при работе с внешними сервисами.