写点什么

为什么编程应遵循 “30” 规则

2019 年 11 月 12 日

为什么编程应遵循 “30” 规则


软件质量,不但依赖于架构及项目管理,更与代码质量紧密相关。简洁高效的代码不但易于阅读,更能避免潜在 Bug 与风险,提高代码质量。这是显而易见的道理,但是要做到这个标准可不容易。想想看,据说 Oracle 12.2,有近2500万行代码,是不是很恐怖?你能做到在不破坏成千上万个现有测试的情况下更改这样产品中的单单一行代码吗?很难,对吧?要想避免这样的情况,就要从源头做起。“30”规则就是一个很好的办法,让我们看看 Riccardo Giorato 是怎么说的?


正文:


本文最初发布 Medium 博客,经原作者 Riccardo Giorato 授权,InfoQ 中文站翻译并分享。


如果你在编程中,不考虑代码长度的话,那么可维护性、未来更新或对代码库的更改,都将会变得异常困难。


方法或函数的大小应该多大呢?


我们都遇到过这样的问题,当一个函数太长的时候


或者类,或者包,或者任何其他代码块。在某些情况下,任何一段代码都有可能会变得过于庞大,以至于他人无法正确理解。但是,多大才算大呢?


Code Complete (《代码大全》,金戈等人译,电子工业出版社), Steve McConnell 指出,理论上,一个方法或函数的最佳最大限制是在一个屏幕上可以容纳的行数。


这种“适合屏幕”的尺寸相当于 65~200 行之间的函数的最佳点。这种大小的例程开发成本更低,每行代码的错误也更少,而且它们的可维护性也很高。


如果你写的代码超过了 200 行,那么,你就会进入了“危险区”:代码的可读性和正确性即将开始崩溃。


30 行代码规则


找寻找更严格的指导原则时,你可以在 Stephen Roock 和 Martin Lippert 合著的 Refactoring in Large Software Projects(《大型软件项目的重构》,暂无中文版)一书中找到“30”规则:


如果一个元素包含超过 30 个子元素,那么极有可能会存在严重的问题:


a) 方法的平均代码行数不应超过 30 行(不含行空和注释);

b) 一个类应该包含平均少于 30 个方法,最多可以包含 900 行代码;

c) 一个包包含的类不应超过 30 个,因此最多可包含 27000 行代码;

d) 应当避免使用超过 30 个包的子系统。这样一个子系统最多包含 900 个类,810000 行代码;

e) 因此,一个有 30 个子系统的系统,将拥有 27000 个类,2430 万行代码。


你应该遵循这些规则吗?如何做?


使用代码大小作为编码规则还是非常友好的;对于每个开发人员来说,无论年轻还是碾场,都很容易看到、理解。其他度量,如用于度量代码质量的循环复杂度(cyclomatic complexity),通常更难掌握,并且需要外部工具进行检查。


将类或函数长度限制在这些值范围内将是一个更好的起点,而不是对你的团队或开发人员没有真正的参考。你还会发现,当你审查或更新代码时,这“30”规则的真正价值是显而易见的。


试图将这些规则作为法律或强制性规则来执行,反而会让你置于危险之中——这并不是他们的目标。当你在编写方法中写到第 31 行时,你不会希望停下写代码,对吧?


此举将会降低工作速度,并迫使每个人都将代码分解以适应任意的大小限制,这将使他们的代码风格变得更糟,而不是更好。


正如 Jeff Langer 在讨论 Ken Beck 在 Clean Code(《代码整洁之道》,韩磊译,人民邮电出版社)一书中提到的简单设计的四条规则那样:


我们的目标是保持函数和类短小的同时,保持整个系统短小精悍。不过要记住,这在关于简单设计的四条规则里面是有限相机最低的一条。所以,尽管使类和函数的数量尽量少是很重要的,但更重要的确实测试、消除重复和表达力。


有时候,要完成一份连贯的工作需要 30 行或多或少的的代码。


更重要的是,在编写类时要小心,要考虑自己在这里添加了多少东西,其他人会理解这些结构和函数的分组吗?我应该分割这个文件呢,还是讲这个类与另一个类合并呢?


“30”规则将会给你带来帮助,但你必须不能让它支配你!


参考文献和资料



作者介绍:


摄影测量师,网页开发人员。


原文链接:


The rule of 30


2019 年 11 月 12 日 14:152047

评论

发布
暂无评论
发现更多内容

“工业互联网+区块链”融合发展新图景

CECBC区块链专委会

区块链 互联网 信息安全

架构师训练营第 1 期第 2 周作业

好吃不贵

极客大学架构师训练营

磨刀不误砍柴工,搞定云网络系统性能测试

毛爷爷

IaaS 云网络 质量保障

华为,与山河共舞这支芭蕾

脑极体

你觉得Android又凉了?那带你看下2020年Android开发的前景如何?

Geek_211aa0

android 程序员 中年危机 移动开发 前景

原来 8 张图,就可以搞懂「零拷贝」了

小林coding

Linux 计算机基础 高性能 零拷贝

机器学习笔记-概念

superman

学习笔记-人工智能概念(小白)

superman

01_Eureka源码初探

阿亮

源码 微服务 SpringCloud Eureka

Spring Cloud 微服务实践(4) - OAuth2

xiaoboey

微服务 Spring Cloud OAuth2 JWT

从零开始的机器学习:免费在线教科书

计算机与AI

学习

散步罗浮山

空山

游记 旅行

话题讨论 | 你的编程能力是如何突飞猛进的?

InfoQ写作平台

学习 写作平台 排行榜 代码

机器学习如何推进现代医疗护理服务的变革

Geek_b33b8e

学习 开源 跨平台 行业资讯 医疗方案

为什么选择敏捷软件开发-考虑敏捷开发的主要优势

小隐乐乐

敏捷开发

按自己的逻辑,避免千篇一律的呈现品牌官方商城

boshi

产品设计 页面展示 商城

第二周-框架设计-学习总结

刘希文

Flink 源码 | 自定义 Format 消费 Maxwell CDC 数据

Apache Flink

flink

提高网站的吞吐量

架构师修行之路

2020年9月编程语言排行榜TOP20:学习Java语言的前景

Java架构师迁哥

北京自贸区总体方案公布:建设法定数字货币试验区

CECBC区块链专委会

金融 国内宏观

架构师训练营第 1 期第 2 周学习总结

好吃不贵

极客大学架构师训练营

有感-人工智能学习

superman

中国消费者独享长达三个月的年终跨境网购狂欢季

爱极客侠

区块链行业简报

CECBC区块链专委会

区块链 金融 银行

一张图揭秘在阿里、腾讯、美团工作的区别

Java架构师迁哥

Spring Cloud 微服务实践(6) - 资源服务器

xiaoboey

微服务 Spring Cloud OAuth2 JWT 权限控制

Mac 系统 VS Code 设置向下复制粘贴当前行快捷键(Ctrl + D)

AlwaysBeta

ide vscode Mac

Spring Cloud 微服务实践(5) - 认证中心

xiaoboey

微服务 Spring Cloud OAuth2 JWT

Apache Pulsar 社区周报|09-12~09-18

Apache Pulsar

开源 云原生 pulsar Apache Pulsar 消息中间件

腾讯看点基于 Flink 的实时数仓及多维实时数据分析实践

Apache Flink

flink

为什么编程应遵循 “30” 规则-InfoQ