【问题标题】:Refactoring methods which depend on __method__依赖于 __method__ 的重构方法
【发布时间】:2012-07-26 14:14:30
【问题描述】:

因此,我迈出了将 Presenters 用于我的 Rails 应用程序的第一步,我只是在考虑重构我的一些代码。我有几个字段可以很好地显示电话号码(即电话、手机和传真)或显示“未给出”。显然,我最初在视图中有这个,但将逻辑移到了我的演示者中。到了那里,我注意到它都是一样的,所以将它重构为一个使用方法名称和发送函数的私有方法:

class CustomerPresenter < BasePresenter
  presents :customer

  def phone
    format_number(__method__)
  end

  def cell
    format_number(__method__)
  end

  def fax
    format_number(__method__)
  end

private

  def format_number(method)
    hande_none customer.send(method) do
      h.number_to_phone(customer.send(method), :area_code => true)
    end
  end
end

然而这段代码仍然看起来并不干燥。因为 format_number 使用方法名称,所以我似乎必须定义三个单独的方法。我很好奇这里是否可以做更多的事情。

附言如果有东西,hande_none 只是简单地返回块或返回“none given”

【问题讨论】:

    标签: ruby-on-rails ruby methods refactoring


    【解决方案1】:

    我通常避免将实际的 getter/方法/属性名称与用于格式化它们的方法混用。

    这就是我使用*_formatted 后缀的原因:使用通用后缀,您可以使用简单的method_missing,它会引导您:

    class CustomerPresenter < BasePresenter
      presents :customer
    
      private
    
      def format_number(method)
        hande_none customer.send(method) do
          h.number_to_phone(customer.send(method), :area_code => true)
        end
      end
    
      def method_missing(method_name, *args, &block)
        case method_name
        when /(.*)_formatted$/
          #here you could create the method on the fly to avoid method missing next time
          return format_number( $1 )
        end    
        super(method_name, *args, &block)
      end
    end
    

    基本上,我的 BasePresenter 中有 *_currency_format 的这个

    【讨论】:

      猜你喜欢
      • 2016-07-12
      • 2010-10-30
      • 2011-02-13
      • 2010-10-11
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多