首页 > 代码库 > 重构的WechatLog

重构的WechatLog

重构前

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  endend

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