@GineTik

Как изменять значение зависимости от внешних факторов?

Привет. Есть следующая задача:
Клиент заказывает и оплачивает билет на рейс, беря во внимание присутствие багажа(цена билета не должна быть ниже цены багажа) и дату вылета. По мере приближения к рейсу или заполнению самолета цена билета должна увеличиться.

То есть для примера:
Цена билета 500 балов. У клиента также есть багаж, за это добавляем к цене 50 балов. До вылета осталось 3 дня и мест почти не осталось, поэтому цена увеличивается на 150 балов.
Значение при которых происходит влияние на цену может быть любым. То есть например, если дней до вылета меньше 5-ти, то каждый день добавляется 50 балов.

Каким образом я могу сделать это задание? Какой паттерн я могу использовать?
Если есть уже готовое решение и как с нуля сделать такое?
Если надо что-то уточнить, пишите!
  • Вопрос задан
  • 63 просмотра
Решения вопроса 1
@GineTik Автор вопроса
Что ж, решил ответить на свой вопрос, написать как я сейчас думаю можно решить это задание.

Если решать эту задачу с учетом того, что больше никак и никем улучшаться этот функционал (несколько условий) не будет, то как и указал mayton2019 можно написать простенький метод по типу:
// не знаю на счет работоспособности кода, не проверял
// константы можно куда-то вынести

private const decimal PRICE_FOR_BAGGAGE = 50D;

private const int LIMIT_DAYS_FOR_UP_PRICE = 5;
private const decimal PRICE_PER_OVERDUE_DAY = 10D;

public decimal CalculateActualPrice(Flight flight) 
{
    var actualPrice = flight.BasePrice;
    
    if (flight.HasBaggage == true)
        actualPrice += PRICE_FOR_BAGGAGE;

     int daysLeft = (flight.DateOfDeparture - DateTime.UtcNow).TotalDays;
     if (daysLeft <= LIMIT_DAYS_FOR_UP_PRICE && daysLeft > 0)
        actualPrice += daysLeft * PRICE_PER_OVERDUE_DAY;

    // ...

    return actualPrice;
}


Но, если нужно будет добавлять много функционала тогда можно было бы создать класс PriceBuilder и использовать его, например:
decimal actualPrice = new PriceBuilder(flight)
    .CorrectionForBaggage(priceForBaggageAvailability: 50D)
    .CorrectionForDaysLeft(limitDaysForUpPrice: 5,  pricePerOverdueDay: 10D)
    // ...
    .Build();


Кстати, я не против если вы предложите свои варианты или покритикуете мои.)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Пусть будет фасад и посредник.
Класс должен обеспечивать агрегацию данных, сохранение билетов, вычисление стоимости.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы