写点什么

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

  • 2019 年 11 月 12 日
  • 本文字数:1646 字

    阅读完需:约 5 分钟

为什么编程应遵循 “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:153110

评论

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

未签订劳动合同的CTO | 法庭上的 CTO(17)

赵新龙

CTO 法庭上的CTO

像用户一样测试:打破知识的诅咒

QualityFocus

测试 软件质量 可用性 用户体验

Alibaba面试官:“这该死的程序员,知识竟如此渊博!”

Java架构之路

Java 程序员 架构 面试 编程语言

创建493个测试账户,被公司索赔527万 | 法庭上的 CTO(14)

赵新龙

CTO 法庭上的CTO

程序员开发指南!1-3年的Android开发工程师看过来,经典好文

欢喜学安卓

android 程序员 面试 移动开发

犯“走私罪”的CTO | 法庭上的CTO(19)

赵新龙

CTO 法庭上的CTO

腾讯大牛亲自带你学:Java安全weblogic T3协议漏洞!

比伯

Java 编程 架构 面试 计算机

第八课性能优化作业-判断合并链表

Geek_michael

极客大学架构师训练营

Spring 源码学习 11:invokeBeanFactoryPostProcessors

程序员小航

Java spring 源码 源码阅读

业务架构设计迭代演进思路

程序员架构进阶

架构 中台 业务架构

这个问题值得讨论吗?

Alan

沟通 团队文化 七日更 28天写作

重学JS | 数组遍历的7种方法及兼容性处理(polyfill)

梁龙先森

大前端 编程语言

为什么要TDD(测试驱动开发)

sherlockq

敏捷开发 TDD 极限编程

大佬带你看源码!阿里内部Android笔记火爆IT圈,3面直接拿到offer

欢喜学安卓

android 程序员 面试 移动开发

大作业一

黄立

股东变员工,所以不发工资?| 法庭上的CTO(18)

赵新龙

CTO 法庭上的CTO

“盗窃”公司源代码被开除的CTO | 法庭上的CTO(20)

赵新龙

CTO 法庭上的CTO

字节面试坎坷之路,第一次二面凉了!捞起来之后一面就凉了;我太难了呀!

Java架构之路

Java 程序员 架构 面试 编程语言

阿里P8大牛手把手教你!高级Android晋升之View渲染机制,先收藏了

欢喜学安卓

android 程序员 面试 移动开发

英特尔赵宏:从硬件创新到平台突破,PC的未来非常值得期待

新闻科技资讯

甲方日常 75

句子

工作 随笔杂谈 日常

混合用工、被拖欠工资的 CTO | 法庭上的 CTO(16)

赵新龙

CTO 法庭上的CTO

劫持Chrome浏览器“获利”8000万元 | 法庭上的CTO(13)

赵新龙

CTO 法庭上的CTO

“有点技术之外,基本什么都没有”的CTO | 法庭上的CTO(15)

赵新龙

CTO 法庭上的CTO

生产环境全链路压测建设历程 21:某快递 A 股上市公司的生产压测案例之基于测试流量的混沌工程(故障演练)

数列科技杨德华

全链路压测 七日更

anonymous匿名者场外交易系统APP软件开发

系统开发

为新基建按下加速键:从openEuler看中国操作系统的产业生态未来

脑极体

ZooX首发双向电动无人车,会成为自动驾驶出行的主流吗?

脑极体

计算机网络简述

lee

计算机网络 网络协议 网络

工具词典:精力管理

lidaobing

精力管理 张遇升 28天写作

(经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路

Java鱼仔

Java 程序员 面试 大学生

为什么编程应遵循 “30” 规则_文化 & 方法_Riccardo Giorato_InfoQ精选文章