【问题标题】:is there a way to apply dry and solid principal有没有办法涂抹干爽的本金
【发布时间】:2018-06-26 16:45:25
【问题描述】:

我正在编写此代码以使其更短,以便更容易学习或阅读,并且我已经提前应用了干燥和坚实的原则,所以你能帮助我如何重构这个 ruby​​ on rails 代码包含一些 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

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 dry solid-principles


    【解决方案1】:

    可能是这样的:

    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)
    

    我并不是说这是完美的代码,但它是您可以接近它的一种方式。您可能希望价格点和修饰符保持不变。

    【讨论】:

      【解决方案2】:

      您可以应用一些 OOP。在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 中的一切都是某种对象,您可以创建方法来调用那些调用其他方法并使用其他对象的对象。

      【讨论】:

      • price_reference 可以是介于0...2525...50 等之间的任何值。不完全是那个值
      • 好吧,当您说 “将使用 [R]anges 进行纠正”时,您已经简单地创建了一个 SyntaxError :O
      猜你喜欢
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      相关资源
      最近更新 更多