Калькулятор тарифов для любого объекта

#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
 

Как и в приведенном выше сценарии, мы можем легко добавлять новые тарифы и отправлять их также как объект.