码迷,mamicode.com
首页 > 其他好文 > 详细

重构的WechatLog

时间:2014-12-23 00:01:19      阅读:507      评论:0      收藏:0      [点我收藏+]

标签:

重构前

class WechatLog < ActiveRecord::Base
  has_many :wechats
  belongs_to :wechat_platform
  has_many :img_text_messages

  def self.add_wechat_text_message(options = {})
    keyword = WechatPlatformKeyword.find_by(name: options[:content])
    trigger_type = keyword.present? ? keyword : leave_message
    create(origin: wechat,
           content: options[:content],
           wechat_id: options[:wechat_id],
           message_type: text,
           trigger_type: trigger_type,
           wechat_platform_id: options[:wechat_platform_id]
    )
  end
 ...(好几个)  
end

options = { wechat_id: @wechat.id, wechat_platform_id: @wechat_platform_id, content: @xml[:Content] }

 WechatLog.add_platform_text_message(options.merge(reply: keyword.message)

重构后

class WechatLog < ActiveRecord::Base
  has_many :wechats
  belongs_to :wechat_platform
  has_many :img_text_messages

  def self.add(wechat)
    new(wechat_id: wechat.id, wechat_platform_id: wechat.wechat_platform_id)
  end

  def from(origin)
    self.origin = origin.to_s
    self
  end

  def as(label)
    self.trigger_type = label.to_s
    self
  end

  def save_text(text)
    return if text.blank?
    self.message_type = text
    self.content = text
    save
  end

  def save_event(options = {})
    self.message_type = event
    self.event = options[:event]
    self.event_key = options[:event_key]
    save
  end

  def save_reply(message)
    case message.class.name
    when TextMessage
      save_text(message.content)
    end
  end
end

WechatLog.add(@wechat).from(:platform).save_reply(message)

或者

 WechatLog.add(@wechat).from(:wechat)
           .as(:keyword)
           .save_text(@xml[:Content])

体会:

  1、每一个让人感到复杂或者庞大的方法,一定相信可以拆分成更小更精致的方法

  2、当一个方法给你笨重的感觉时,这个方法一定做了太多的事情。比如 add_wechat_text_message。

    1)这个里面首先要判断trigger_type,在判断的过程中又涉及到SQL查询

    2)然后根据复杂的庞大的Hash参数完成create

    3)调用的地方,因为参数太大,却必须为组织参数付出一定代价

  3、开始是重构:

    1)我试着把trigger_type的判断拿走。

      1)先抽到另一个方法里面,方法小了一些。

      2)然后再研究,我发现这个可以去掉,来自完全依靠传入。

    2)这个create的参数太庞大了。

      1)先创建一个空得对象

      2)一步一步地向里面塞数据,分步骤,更加清晰

      3)小步骤,也可以提高代码的复用率

      4)同时,又不需要太琐碎,如果设置message_type和设置文本内容content一起,分开了就太琐碎了,不如和在一起。

 

重构的WechatLog

标签:

原文地址:http://www.cnblogs.com/q-lee/p/4179194.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!