Sobes.tech
Middle+

Feladat: Önt arra kérték, hogy végezzen kódellenőrzést egy új funkcióhoz, amely lényege, hogy lehetőséget adjon egy túra (amely egy repülőjegyből és egy szállodából áll) foglalására. A külön foglalási funkciók már léteznek a repülőjegyre és a túrára, és elvárás, hogy ez a feladat egy egységes módszert tartalmazzon, amely vagy az egész túrát, vagy egyik komponensét sem foglalja.

sobes.tech MI

Válasz az MI-től

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

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

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