代码可读性(Readability),顾名思义就是代码有多容易被人读懂,我们可以通过代码作者以外的开发人员需要多少时间能理解 1 个代码单元(代码单元指 1 个类或 1 个函数),来衡量这个代码单元的可读性。对代码的理解有两个层面:
理解一个代码单元(1 个类或 1 个函数)的作用;
理解一个代码单元的实现逻辑;
如果要使用(调用)1 个代码单元,至少要理解到第 1 层面;如果需要改进或重构,则需要理解到第 2 层面。
代码可读性是团队协作开发的前提;
代码可读性是软件可维护性的前提;
代码可读性是代码评审的前提,也是代码评审中的核心关注点之一;
假设你在开发 1 个业务功能,需要一个图片转换功能(把 DXF 图转换为 SVG 图),你读过系统已有的代码(包括 API 文档),没有发现看起来像这样功能的类或函数,你只好新写一个函数。但实际上已经有同事曾经写过相同功能,函数名叫“toImage()”,这个函数名无法体现其真实功能。
这就是一个典型的由于代码可读性低,降低了重用性,导致开发资源浪费的例子。
再假设在一个运输系统有一个调度函数,业务逻辑非常复杂而原有代码非常混乱难懂,原来的程序员已经离职。现在老板让你基于某种新场景加 1 种调度策略,并且要求尽快完成,那么你最佳的应对策略可能就是重新写一个调度函数,通过 if-else 语句把新的调度策略引入进来。
很显然,这会导致代码逐步腐烂,形成一个“屎山”,最终不可维护。
即使是在新的软件编码过程中,团队成员之间也不可避免互相调用或在同一个代码单元(类或函数)中共同开发。而这前提都是快速读懂原有代码。
因此,在团队开发中,软件可读性影响整个软件编码的协作成本,更影响交付后的软件维护成本。
最后,可读性低的代码,几乎无法进行代码评审。代码评审的两大作用:团队知识共享、软件质量把控,都需要基于代码可读性的前提。
Google 和腾讯对于代码可读性(Readability)都非常重视,都有一个认证体系。以腾讯为例,腾讯的代码可读性体系分为:
0 级:Foundation,参加了培训并通过了考试;
1 级:Wet-hands,参加了 Wet-hands 训练营,并通过了考试;
2 级:Workalone,通过项目日常的 CR(代码评审)并积分排队,并通过最终的评定;
3 级:Approver,优秀的代码可读性证书持有者,高水平代码的捍卫者 & 布道者。
评价一个代码的可读性,一般参考以下原则:
一致性原则
可读性优先于性能
SOLID(单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)
高内聚、低耦合
最小作用域
DRY(Don't Repeat Yourself)
KISS(Keep It Simple, Stupid)
YAGNI(You Ain't Gonna Need It)
SSH(Shit Stop Here) 我们不会每次代码评审都用到所有原则,但一致性原则(即使错也要错成一个样子)、可读性优先于性能这 2 个原则几乎是需要时刻谨记的。而当我们面对历史代码的时候,我们应该考虑 SSH(Shit Stop Here)原则。
基于上述原则,我们在评价一个代码单元的可读性时,会依次看几个方面:
设计问题:包括功能性设计(如是否解决了正确的问题、是否正确的解决方案)、整体设计、安全性问题
实现问题:包括命名、一致性、代码逻辑、复杂度、作用域、惯用法、错误处理等
规范问题:包括 MR 信息、注释、命名、魔法数字等等,这部分一般依据不同语言有所不同。
答案:代码评审!
Google 主要通过代码评审制度来确定代码的可读性,没有任何代码可以不经过代码评审就进入代码库。腾讯某 BG 从 2020 年开始全面推广代码审查制度,并推行代码可读性认证体系。
因此,可以说代码可读性的提升取决于代码评审制度的执行。原因很简单,代码评审,就是让第二个人来“读”代码。
代码评审的作用:
发现代码中的问题或缺陷——其实这是最不重要的一点,毕竟一眼就能看出来的问题,往往不是难以测出来的问题;
让开发人员写出更整洁的代码——当你知道有人要读你的代码的时候,你会有压力让代码尽量整洁些易读些;
传播知识:
1. 对团队成员编码能力的提升有极大帮助。回想一下,上课的时候老师讲完 45 分钟,我们最多只能记住 30%,但通过做作业和老师的批改,我们才能记住大部分的知识点。
2. 让重要代码有后备维护人员。很多团队里,一个开发人员负责一个模块,每个人都只关注自己的模块。长此以往,每个人模块都只有 1 个人熟悉和了解,一旦这个同事休假——但愿不是离职,其他人都束手无策了。
代码是资产,还是负债?资产:资产是指由企业过去的交易或事项形成的、由企业拥有或者控制的、预期会给企业带来经济利益的资源。负债:是指因为过去的交易或事件,使得未来必须要牺牲的经济利益。衡量一份代码,是资产还是收益,可以通过下面的公式:
软件带来的收益 - 软件维护成本 > 0
而代码可读性,在降低软件维护成本上,至关重要。
我国互联网遭境外网络攻击;俄罗斯或将多家外企“国有化”;Linux内核被发现易于利用的漏洞|Q资讯
点个在看少个 bug 👇