Sobes.tech
Middle+

Εργασία: Σας ζητήθηκε να κάνετε μια ανασκόπηση κώδικα μιας νέας λειτουργίας, της ουσίας της οποίας είναι η δυνατότητα κράτησης ενός τουρ (που αποτελείται από ένα αεροπορικό εισιτήριο και ένα ξενοδοχείο). Οι λειτουργίες για ξεχωριστή κράτηση του αεροπορικού εισιτηρίου και του τουρ ήδη υπάρχουν, και από αυτήν την εργασία αναμένεται να υπάρχει μια ενιαία μέθοδος που θα κρατάει είτε ολόκληρο το τουρ είτε κανένα από τα συστατικά του.

sobes.tech AI

Απάντηση από 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;
    }
}

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