AIGC在金融场景是如何落地的? 了解详情
写点什么

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

评论

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

JMeter笔记7 | JMeter脚本回放

测试 Jmeter 性能测试 自动化测试 接口测试

JMeter笔记8 | JMeter关联

测试 Jmeter 性能测试 自动化测试 接口测试

面试官:怎么保证Kafka的消息不丢失

做梦都在改BUG

Java kafka 面试 消息队列 消息中间件

分解GameFi链游游戏软件系统如何开发?

Congge420

Apache Hudi 在袋鼠云数据湖平台的设计与实践

袋鼠云数栈

数据湖 Hudi Apache Hudi

奇妙JVM(一):Java程序员必须知道的神秘黑箱

xfgg

Java JVM

GitHub上13个高赞Java项目推荐,会一个就能跟面试官谈笑风生

Java你猿哥

Java 微服务 秒杀系统 网约车项目 java项目

软件测试丨SeleniumIDE 自动化用例录制、测试用例结构分析

测试人

软件测试 自动化测试 测试开发 测试用例 selenium

SpringBoot 中实现定时任务的几种方式

做梦都在改BUG

Java Spring Boot

开源赋能 普惠未来|铜锁/Tongsuo诚邀您参与2023开放原子全球开源峰会

开放原子开源基金会

开源

实力上榜!ONES 荣获深圳市「专精特新」企业认定

万事ONES

零信任之访问代理

Flomesh

Pipy

开源赋能 普惠未来|XuperCore诚邀您参与2023开放原子全球开源峰会

开放原子开源基金会

开源

理解JVM工作机制(三)对象的内存布局

ue4

Java JVM

在 Kubernetes 上实现高速应用交付

NGINX开源社区

nginx Kubernetes

嘉为蓝鲸CMP多云管理平台解决方案成功入选!

嘉为蓝鲸

多云管理 IT运维 蓝鲸

开发者福利来了 | 京东云全系核心产品公开比价:我们承诺,买贵就赔!

京东科技开发者

数据库 云主机 京东云 云主机厂商 企业号 5 月 PK 榜

ChatGPT聊天系统开发基于GPT-3.5架构

Congge420

【技术】多端能力服务统一是一种关键的技术和架构

没有用户名丶

火山引擎DataLeap联合DataFun发布《数据治理知识地图》

字节跳动数据平台

数据治理 数据开发 数据库开发 数据研发

发挥数据价值!数据驱动的日志解析与异常检测方法介绍!

嘉为蓝鲸

日志分析 管理日志 日志统计

等保和网络安全法的关系是什么?怎么理解?

行云管家

网络安全 等保 等级保护

浅谈NFT盲盒游戏系统开发原理

Congge420

理解JVM工作机制(二) 对象的创建

ue4

Java JVM Java web

火山引擎多云安全平台,破解多云异构场景下的安全挑战

科技热闻

Python从0到1丨了解图像形态学运算中腐蚀和膨胀

华为云开发者联盟

Python 人工智能 华为云 华为云开发者联盟 企业号 5 月 PK 榜

NFTScan 正式发布 Bitcoin NFT 浏览器,支持 Ordinals NFT 和 BRC20 资产

NFT Research

Bitcoin NFT\

嘉为蓝鲸DevOps流水线工具如何为企业研发赋能?

嘉为蓝鲸

DevOps 流水线 蓝鲸

【云计算】谷歌云是国外的吗?是公有云还是私有云?

行云管家

公有云 私有云 谷歌云

透明LED显示屏与常规屏的区别

Dylan

LCD1602液晶显示屏 显示器 LED显示屏

  • 扫码添加小助手
    领取最新资料包
为什么编程应遵循 “30” 规则_文化 & 方法_Riccardo Giorato_InfoQ精选文章