标签:
重构前
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一起,分开了就太琐碎了,不如和在一起。
标签:
原文地址:http://www.cnblogs.com/q-lee/p/4179194.html