【问题标题】:Is this the right way to refactor? Anything better I can do?这是重构的正确方法吗?有什么更好的我可以做的吗?
【发布时间】:2011-09-15 16:55:48
【问题描述】:

我已经创建了一个Impressions 模型,它可以跟踪某张照片或某个事件有多少“浏览量”。它通过 remote_url、remote_ip 和 user_agent 跟踪。它按我想要的方式工作。

照片控制器:

def show

  @photo.impressions.create(:request_url => request.url, :controller_name => controller_name, :action_name => action_name,
                            :ip_address => request.remote_ip, :user_agent => request.user_agent)
....

还有我的事件控制器:

def show

  @event.impressions.create(:request_url => request.url, :controller_name => controller_name, :action_name => action_name,
                            :ip_address => request.remote_ip, :user_agent => request.user_agent)
....

但是,我正在考虑重构它(以使代码更清晰)。也许在PhotoEvent 模型中创建一个名为add_impression 的方法。它与上述完全相同,但封装了如何创建印象的功能。它看起来像:

照片控制器:

def show

  @photo.add_impression(request.url, controller_name, action_name, request.remote_ip, request.user_agent)
....

还有我的事件控制器:

def show

  @event.add_impression(request.url, controller_name, action_name, request.remote_ip, request.user_agent)
....

使用这种方法,我最终会在 PhotoEvent 模型中使用 add_impression 方法。不完全干燥(不要重复自己)。我正在考虑创建一个Impression 模块来解决这个问题。

这是正确的方法吗?或者还有什么我应该做的吗?

PS 我还没有很好地调整模块。因此,如果有人想留下代码 sn-p 或指向值得阅读的文章的链接。请这样做。

【问题讨论】:

    标签: ruby-on-rails-3 refactoring


    【解决方案1】:

    我个人会让 Impression 负责使用类方法创建印象,例如:

    class Impression < ActiveRecord::Base
    
      def self.add_impression impressionable, options
        impressionable.impressions.create options
      end
    
    end
    

    然后在控制器中:

    Impression.add_impression @photo, options
    

    【讨论】:

    • 顺便问一下,options 是什么东西的简写吗?或者,在我的情况下应该是:Impression.add_impression(@photo, request.url, controller_name, action_name, request.remote_ip, request.user_agent)
    • 我只是将选项作为占位符,您必须为所有参数扩展它。您可能只想传递控制器名称、操作名称和请求,因为您可以从方法本身的请求中提取您想要的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 2018-06-02
    • 2014-11-21
    • 1970-01-01
    • 2020-12-20
    • 2011-05-16
    相关资源
    最近更新 更多