《代码重构》之方法到底多长算“长”?(下)

简介: 《代码重构》之方法到底多长算“长”?

这个代码还算不上已经处理得很整洁了,但至少同之前相比,已经简洁了一些。我们只用了最简单的提取函数这个重构手法,就把一个大函数拆分成了若干的小函数。


长函数往往还隐含着一个命名问题。如果你看修改后的sendChapter,其中的变量命名明显比之前要短,理解的成本也相应地会降低。因为变量都是在这个短小的上下文里,也就不会产生那么多的命名冲突,变量名当然就可以写短一些。


平铺直叙的代码,一个关键点就是没有把不同的东西分解出来。如果我们用设计的眼光衡量这段代码,这就是“分离关注点”没有做好,把不同层面的东西混在了一起,既有不同业务混在一起,也有不同层次的处理混在了一起。我在《软件设计之美》专栏中,也曾说过,关注点越多越好,粒度越小越好。

一次加一点

有时,一段代码一开始的时候并不长,就像下面这段代码,它根据返回的错误进行相应地错误处理:

if (code == 400 || code == 401) {
  // 做一些错误处理
}

然后,新的需求来了,增加了新的错误码,它就变成了这个样子:

if (code == 400 || code == 401 || code == 402) {
  // 做一些错误处理
}

这段代码有很多次被修改的机会,日积月累:

if (code == 400 || code == 401 || code == 402 || ...
  || code == 500 || ...
  || ...
  || code == 10000 || ...) {
}

后人看到就想骂人。任何代码都经不起这种无意识的累积,每个人都没做错,但最终的结果很糟糕。对抗这种逐渐糟糕腐坏的代码,需要知道“童子军军规”:

让营地比你来时更干净

Robert Martin 把它借鉴到了编程领域,我们应该看看自己对于代码的改动是不是让原有的代码变得更糟糕了,如果是,那就改进它。

但这一切的前提是,你要能看出自己的代码是不是让原有的代码变得糟糕了,所以,学习代码的坏味道还是很有必要的。


至此,我们看到了代码变长的几种常见原因:


  • 以性能为由
  • 平铺直叙
  • 一次加一点


代码变长根本是一个无意识的问题,写代码的人没有觉得自己把代码破坏了。但只要你认识到长函数是一个坏味道,后面的许多问题就自然而然地会被发掘出来,至于解决方案,你已经看到了,大部分情况下,就是拆分成各种小函数。

总结

没有人愿意去阅读长函数,但许多人又会不经意间写出长函数。

对于团队,一个关键点是要定义出长函数的标准。

过于宽泛的标准没有意义,想要有效地控制函数规模,几十行已经是标准上限,这个标准越低越好。

长函数产生的原因:

  • 性能为借口
  • 代码平铺直叙
    函数写长最常见的原因。之所以会把代码平摊在那里:
    - 把多个业务写到了一起
    - 把不同层次的代码写到了一起。究其根因,那是“分离关注点”没有做好
  • 每人每次加一点点
    应对主要办法就是要坚守“童子军军规”,但其背后更深层次的支撑就是要对坏味道有着深刻的认识


把函数写短,越短越好。

目录
相关文章
|
JavaScript 关系型数据库 MySQL
fastadmin 部署phpstudy,初步学习fastadmin,保姆级详细讲解
fastadmin 部署phpstudy,初步学习fastadmin,保姆级详细讲解
875 0
|
API 图形学
Unity设置播放模式下始终先执行指定的场景
通过我们使用Unity开发游戏,是在PC/Mac上。而一个游戏通常也会有很多的场景,比如A、B、C、D三个场景,正常流程下的执行顺序是 A –> B –> C –> D。在具体一点,比如 A —— 启动场景、B —— 资源加载场景、C —— 登录场景、D —— 战斗场景。
2128 0
|
11月前
|
存储 数据管理 大数据
数字化协作工具在酒店运营中的五大实践场景
**从“粗放管理”到“精细化运营”的转型** 酒店行业正从依赖经验和直觉的管理模式转向数据驱动的精细化运营。在线协同工具助力这一转型,通过集中化数据存储、多部门协作和大数据分析,实现科学决策、提升客户体验和运营效率。欧美酒店集团已率先采用此类工具,中国酒店业也需顺应这一趋势,利用本地化软件优化内部流程,满足客户需求,提升品牌价值。 (238字)
|
12月前
|
传感器 存储 算法
《探索机器人自主导航与路径规划技术的热点》
机器人自主导航与路径规划技术是当今科技热点,广泛应用于工业生产、物流配送及日常生活服务。传感器(如激光雷达、摄像头)、定位技术(如GPS、IPS)和地图构建为机器人提供环境感知能力。路径规划涉及搜索算法(如DFS、BFS、A*)和优化算法,确保机器人在复杂环境中高效、准确地完成任务。实时规划则使机器人能动态调整路径,适应环境变化。这些技术的不断进步正推动机器人在各领域的广泛应用,提升效率与便利性。
572 9
|
TensorFlow 算法框架/工具 C++
Python exe文件打包神器-Nuitka!
Python exe文件打包神器-Nuitka!
571 0
|
消息中间件 Java Maven
java.util.zip.ZipException: invalid LOC header (bad signature)
java.util.zip.ZipException: invalid LOC header (bad signature)
363 1
ggpattern包-基于几何图案或图像的自定义填充
平时我们做柱状图或饼图都会用彩色进行填充,但是文章有时候为了节约成本采用黑白印刷时候,图形一般都会做成各种阴影线条填充模式来进行区分(如下图),R中的ggpattern包刚好可以满足了我们的需求,若有需要就来学习下吧~
752 0
|
数据采集 消息中间件 大数据
爬虫识别-UA 种类统计-需求及实现思路|学习笔记
快速学习爬虫识别-UA 种类统计-需求及实现思路。
372 0
爬虫识别-UA 种类统计-需求及实现思路|学习笔记
|
人工智能 大数据 5G
服务器显卡直通和GPU问题分析
服务器显卡直通和GPU问题分析
服务器显卡直通和GPU问题分析