告别特性依恋:Ruby Science教你用Move Method为方法找到真正的家
告别特性依恋Ruby Science教你用Move Method为方法找到真正的家【免费下载链接】ruby-scienceThe reference for writing fantastic Rails applications项目地址: https://gitcode.com/gh_mirrors/ru/ruby-scienceRuby Science是一本教写 Rails 应用的实战参考书其中 Move Method移动方法重构手法正是解决特性依恋Feature Envy这个经典代码坏味道的首选方案。读完本文你将学会判断一个方法是否“放错了地方”并用 5 个简单步骤把它安全地移到正确的类里。什么是特性依恋方法“住错地方”的信号特性依恋Feature Envy指的是一个方法里的大部分逻辑其实在频繁访问别的对象而不是自己所在类的状态。就像一个人整天跑别人家串门说明他住错了房。 常见症状清单方法里反复引用同一个参数或局部变量参数、局部变量比本类的实例变量用得更勤方法名里带着别的类名例如invite_user同一个类里有一堆接收相同参数的私有方法违背了 Law of Demeter得墨忒尔法则 与 Tell, dont ask 原则特性依恋的代价是双重的逻辑被困在错误的类里难以复用而且往往藏在private方法中其他类根本用不到。Move Method为什么它是特性依恋的最佳解药Ruby Science 把 Move Method 定义为把方法整体搬到拥有它所依赖状态的类中。这样做能同时收获三件事收益说明消除特性依恋方法搬到了它“羡慕”的对象身边提升可复用性私有、带参数的方法变成公有、无参数的方法提高可读性方法与它依赖的其他方法住得更近了完整的操作规范见书籍的 Move Method 章节配套的坏味道分析在 Feature Envy 章节。移动方法的 5 步操作流程把方法定义和方法体完整搬入新类新类本来就拥有的状态不再作为参数传入直接引用原来属于旧类的状态补充为必要参数方法名在新语境下不合理就重命名如invite_user搬进User类后改叫invite把对旧方法的调用全部替换为对新方法的调用实战把评分逻辑从 Completion 搬进 Answer书里的示例应用是一个问卷调查应用源码位于example_app/。改造前的 completion.rb 中score方法里有个“越界”的块它反复访问answer的question和text典型的特性依恋def score answers.inject(0) do |result, answer| question answer.question result question.score(answer.text) end end作者用了两步走可对照提交记录d5b4871与fe3ef38第一步Extract Method提取方法先把依恋的部分隔离成score_for_answer私有方法此时代码依然能正常工作。第二步Move Method移动方法把这个方法搬到 answer.rb 并改名score逻辑从此回到数据的真正主人身边class Answer ActiveRecord::Base def score question.score(text) end end搬完之后Completion#score只剩干净的answers.sum { |a| a.score }式调用评分逻辑从私有小方法变成可被其他类复用的公有接口坏味道清零。⚠️ 常见误区别想一步到位新手最容易犯的错误是“边提取边移动”——一次性在新类里建方法、搬代码、改调用。书里专门警告了这一点拆成两个小步骤每一步跑完测试都绿代码“损坏”的窗口期更短出问题时排查范围也更小。练熟之后两步小重构的速度和一步大重构其实一样快。移动完成后的自检清单✅ 新方法在新家没有继续犯特性依恋若有继续拆分回迁✅ 新类没有因为收留方法而变成大类Large Class如何获取 Ruby Science 完整资源仓库里既有书籍的 Markdown 源文件也有一步步展示重构过程的示例 Rails 应用是练习 Move Method 的绝佳素材git clone https://gitcode.com/gh_mirrors/ru/ruby-science推荐阅读路径书籍目录总览book/book.md坏味道篇先学会识别book/code_smells/重点看feature_envy.md重构方案篇再动手开药book/solutions/重点看move_method.md、extract_method.md示例应用example_app/可用git log -- example_app/app/models/completion.rb查看真实的重构提交历史掌握 Move Method 之后你会发现 Rails 模型层的职责划分清晰了许多——每个方法都住在了它真正该待的家。【免费下载链接】ruby-scienceThe reference for writing fantastic Rails applications项目地址: https://gitcode.com/gh_mirrors/ru/ruby-science创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考