Sobes.tech
Middle+

Vəzifə: Sizdən yeni funksiyanın kodunu nəzərdən keçirmək istənilib, onun mahiyyəti turu (aviasiya bileti və oteldən ibarət) bron etmək imkanını təmin etməkdir. Uçuş bileti və tur üçün ayrı-ayrı bronlama funksiyaları artıq mövcuddur və bu vəzifədən gözlənilir ki, bütün turu və ya onun heç bir komponentini bron edəcək vahid bir metod olsun.

sobes.tech Süni İntellekt

AI-dan cavab

Для реализации единого метода бронирования тура, который либо бронирует все компоненты (авиабилет и отель), либо ничего, нужно использовать транзакционный подход. Это значит, что бронирование должно быть атомарным: если бронирование авиабилета прошло успешно, а бронирование отеля — нет, то нужно отменить уже сделанное бронирование авиабилета.

В 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;
    }
}

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