Есть ли способ нанесения сухого и твердого основного - PullRequest
0 голосов
/ 26 июня 2018

Я работаю над этим кодом, чтобы сделать его короче, чтобы его было легче изучать или читать, и я уже продвинулся в применении принципа «сухого и надежного», чтобы вы могли помочь мне с тем, как выполнить рефакторинг этого рубина на коде рельсов, который содержит некоторые операторы if, чтобы сделать это. Так что с этими принципами становится легче читать и короче.

if brand.rating = high
  if price_reference < 15
    price_suggestion = (price_reference - product_database.shipping_cost * 0.75) * 1.1
    price_original = price_suggestion
  elsif price_reference < 25
    price_suggestion = (price_reference - product_database.shipping_cost * 0.775) * 1.1
    price_original = price_suggestion
  elsif price_reference < 50
    price_suggestion = (price_reference - product_database.shipping_cost * 0.8) * 1.1
    price_original = price_suggestion
  elsif price_reference < 75
    price_suggestion = (price_reference - product_database.shipping_cost * 0.825) * 1.1
    price_original = price_suggestion
  elsif price_reference < 100
    price_suggestion = (price_reference - product_database.shipping_cost * 0.85) * 1.1
    price_original = price_suggestion
  elsif price_reference < 200
    price_suggestion = (price_reference - product_database.shipping_cost * 0.875) * 1.1
    price_original = price_suggestion
  elsif price_reference < 400
    price_suggestion = (price_reference - product_database.shipping_cost * 0.9) * 1.1
    price_original = price_suggestion
  elsif price_reference < 600
    price_suggestion = (price_reference - product_database.shipping_cost * 0.925) * 1.1
    price_original = price_suggestion
  else
    price_suggestion = (price_reference - product_database.shipping_cost * 0.95) * 1.1
    price_original = price_suggestion
elsif brand.rating = low
  if price_reference < 15
    price_suggestion = (price_reference - product_database.shipping_cost * 0.75) * 0.9
    price_original = price_suggestion
  elsif price_reference < 25
    price_suggestion = (price_reference - product_database.shipping_cost * 0.775) * 0.9
    price_original = price_suggestion
  elsif price_reference < 50
    price_suggestion = (price_reference - product_database.shipping_cost * 0.8) * 0.9
    price_original = price_suggestion
  elsif price_reference < 75
    price_suggestion = (price_reference - product_database.shipping_cost * 0.825) * 0.9
    price_original = price_suggestion
  elsif price_reference < 100
    price_suggestion = (price_reference - product_database.shipping_cost * 0.85) * 0.9
    price_original = price_suggestion
  elsif price_reference < 200
    price_suggestion = (price_reference - product_database.shipping_cost * 0.875) * 0.9
    price_original = price_suggestion
  elsif price_reference < 400
    price_suggestion = (price_reference - product_database.shipping_cost * 0.9) * 0.9
    price_original = price_suggestion
  elsif price_reference < 600
    price_suggestion = (price_reference - product_database.shipping_cost * 0.925) * 0.9
    price_original = price_suggestion
  else
    price_suggestion = (price_reference - product_database.shipping_cost * 0.95) * 0.9
    price_original = price_suggestion
else
  if price_reference < 15
    price_suggestion = (price_reference - product_database.shipping_cost * 0.75) * 1
    price_original = price_suggestion
  elsif price_reference < 25
    price_suggestion = (price_reference - product_database.shipping_cost * 0.775) * 1
    price_original = price_suggestion
  elsif price_reference < 50
    price_suggestion = (price_reference - product_database.shipping_cost * 0.8) * 1
    price_original = price_suggestion
  elsif price_reference < 75
    price_suggestion = (price_reference - product_database.shipping_cost * 0.825) * 1
    price_original = price_suggestion
  elsif price_reference < 100
    price_suggestion = (price_reference - product_database.shipping_cost * 0.85) * 1
    price_original = price_suggestion
  elsif price_reference < 200
    price_suggestion = (price_reference - product_database.shipping_cost * 0.875) * 1
    price_original = price_suggestion
  elsif price_reference < 400
    price_suggestion = (price_reference - product_database.shipping_cost * 0.9) * 1
    price_original = price_suggestion
  elsif price_reference < 600
    price_suggestion = (price_reference - product_database.shipping_cost * 0.925) * 1
    price_original = price_suggestion
  else
    price_suggestion = (price_reference - product_database.shipping_cost * 0.95) * 1
    price_original = price_suggestion
end

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Вы можете применить ООП. В классе Brand вы можете использовать некоторые операторы .case, чтобы сделать его более читабельным ...

def prices
  case self.rating
    when 'high"
      case  
        when price_reference < 15
          (price_reference - product_database.shipping_cost * 0.75) * 1.1
        when price_reference < 25
          (price_reference - product_database.shipping_cost * 0.775) * 1.1
        when price_reference < 50
          (price_reference - product_database.shipping_cost * 0.8) * 1.1 
          etc...

    when 'low'
      case 
          etc...
    else
          etc...
  end
end

Вложенный оператор case немного проще для чтения. Также вы делаете много ненужных переназначений переменных. Помните, что Ruby всегда возвращает последнее утверждение, которое он оценивает. Поэтому, когда вы вызываете метод члена класса Brand, вы можете использовать его следующим образом:

brand = Brand.new(rating: 'high', price_reference: '25')
#let's assume product_database.shipping_cost = 5
brand.prices
 #returns the value 23.2375 which came from (25 - 5 * 0.775) * 1.1

Есть много способов сделать это. Вы можете абстрагировать намного больше своего кода, создав несколько хеш-словарей, которые будут содержать значения каждой формулы, а затем выполнить подстановку переменных для их вызова. Попробуй вещи с точки зрения объектов и методов. Все в Ruby - это какой-то объект, и вы можете создавать методы для вызова тех объектов, которые вызывают другие методы и используют другие объекты.

0 голосов
/ 26 июня 2018

Может быть что-то вроде:

def suggest_price(price_reference, shipping_cost)
  [
     [15, 0.75],
     [25, 0.775],
     [50, 0.8],
     ... etc ...
  ].each do |price_point, shipping_modifier|
    if price_reference < price_point
      return price_reference - shipping_cost * shipping_modifier
    end
  end
  return price_reference - shipping_cost * 0.95
end

def price_modifier(brand)
  if brand.rating == high
    1.1 
  elsif brand.rating == low
    0.9
  else
    1
  end
end

price_original = price_modifier(brand) * suggest_price(price_reference, product_database.shipping_cost)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...