#ruby-on-rails #ruby
#ruby-on-rails #ruby
Вопрос:
Я работаю над созданием калькулятора тарифов бронирования.
Есть 28
автобусные станции,
Базовая цена 100
указана до 5
автобусных станций.
Позже 50
дополнительно для каждой 5
автобусной станции.
Одна поездка из 1 to 28
is 300
.
Вот мое решение,
BASE = 100
stops = (start - end).abs
case stops
when 1..5
BASE
when 5..10
BASE 5
when 10..15
BASE 10
when 15..16
BASE 15
when (station_array.length - 1)..station_array.length
200
end
Я искал хорошее оптимизированное и масштабируемое решение.
Предположим, что если мы добавим новые станции, логика тарифа должна потребовать минимальных изменений.
Комментарии:
1. Каковы правила для 2000 станций? Всегда ли это 5 для каждых 5 станций? Вы упоминаете «дополнительные дополнительные 50» , но неясно, когда / где это применимо, потому
50
что не встречается в вашем коде.
Ответ №1:
Вы должны быть в состоянии сделать это с помощью простой математики, это может послужить примером для вас.
Позже 50 дополнительных за каждые 5 автобусных станций.
Это немного неясно, рассчитывается ли дополнительная плата за проезд после 5 дополнительных станций или уже на первой дополнительной?
например, это так?
A: 6 stations = BASE_FARE EXTRA_FARE
# or...
B: 6 stations = BASE_FARE only
Вы можете удалить этот ceil
метод, если хотите рассчитать дополнительные тарифы только после 5 станций, я делаю это так: дополнительные станции 1-4 уже добавляют дополнительный тариф.
Что касается поездки туда и обратно, вы можете просто добавить дополнительную проверку, чтобы узнать, являются ли stations = total_stations
TOTAL_STATIONS = 500
ROUNDFARE = 300 # or whatever
BASE_PRICE = 100
BASE_STATIONS = 5
EXTRA_PRICE = 50
EXTRA_STATIONS = 5
def calc_price(stations)
return ROUNDFARE if stations = TOTAL_STATIONS
total_price = base_price
# Substract the 5 base stations
stations -= BASE_STATIONS
# Add 50 for every 5 stations
# to_f is used so it does float division
# ceil is used to round up, e.g. 3 / 5 => 1
total_price = (stops / EXTRA_STATIONS.to_f).ceil * EXTRA_PRICE
total_price
end
Комментарии:
1. Просто обратите внимание, это не проверено тщательно, это опубликовано как нечто, на чем вы можете основываться.
Ответ №2:
На мой взгляд, мы можем использовать хэш для этого сценария.
BASE = 100
stops = (start - end).abs
price_for = {(1..5) => BASE,(6..10) => BASE 5,(11..15) => BASE 10 ..... }
eg: price_for[(1..5)] o/p => 100
Как и в приведенном выше сценарии, мы можем легко добавлять новые тарифы и отправлять их также как объект.