《代码大全》用数据说话:关于子程序的最佳长度

Abaqus传热分析HETVAL和USDFLD子程序联合 Hetval子程序常用于定义内部热源,该子程序可以定义材料内部的生热量(如相变、高分子结晶生热),并且能够调用state variable 状态变量,可以与USDFLD子程序联合使用。HETVAL子程序用于计算传热系数并在单元上定义,USDFLD子程序用于在每个时间布更新温度场。 阅读详情

不少讨论编程风格的书都告诉我们,应该编写短小的函数(子程序),各家推荐的子程序最佳长度也不一样,从十多行到一二百行不等。《代码大全 第二版》的特点之一是“用数据说话”,书中列出:

■ Basili和Perricone所做的一项研究发现,子程序的长度与错误量成反比,即:随着子程序长度的增加(上至200行代码),每行代码所包含的错误数量就会减少(Basili和Perricone 1984)。
■ 另一项研究则发现,子程序的长度与错误量没有关联,而结构复杂度以及数据量却与错误量有关(Shen et al. 1985)。
■ 1986年所做的一项研究发现,短小的子程序(含有32行或更少代码)与更低的成本或错误率无关(Card,Church and Agresti 1986;Card and Glass 1990)。有证据表明,较长的子程序(含有65行或更多代码)使得每行代码的成本更低。
■ 一项对450个子程序所做的实证研究发现,相对较长的子程序而言,短小的子程序(包括注释在内少于143行语句)中每行代码所含的错误数量要多23%,而修改成本却低2.4倍(Selby and Basili 1991)。
■ 另一项研究发现,平均长度为100到150行代码的子程序需要被修改的几率最低(Lind and Vairavan 1989)。
■ IBM所做的一项研究发现,最容易出错的是那些超过500行代码的子程序。超过500行之后,子程序的出错率就会与其长度成正比(Jones 1986a)。

对此,作者作了一番分析,认为子程序并不是越短越好:“那么,上述这些研究对于面向对象程序中子程序的长度又意味着什么呢?在面向对象的程序中,一大部分子程序都是访问器子程序(accessor routines),它们都非常短小。在任何时候,复杂的算法总会导致更长的子程序。在这种情况下,可以允许子程序的长度有序地增长到100至200行(不算源代码中的注释行和空行)。数十年的证据表明,这么长的子程序也和短小的子程序一样不易出错。与其对子程序的长度强加限制,还不如让下面这些因素——如子程序的内聚性、嵌套的层次、变量的数量、决策点(decision points)的数量、解释子程序用意所需的注释数量以及其他一些跟复杂度相关的考虑事项等——来决定子程度的长度。”

然后得出结论:“这就是说,如果你要编写一段超过200行代码的子程序,那你就要小心了。对于超过200行代码的子程序来说,没有哪项研究发现它能降低成本和/或降低出错率,而且在超过200行后,你迟早会在可读性方面遇到问题。”

《代码大全》的最大特点之一,是“归纳总结来自专家经验、业界研究以及学术成果”并强调编程实践。这本书有数据,有分析,有指导建议;言之有据,论之有理。

用代码说话之Java功能库程序库01部. 自己做一电子书,相关Java的,初学者可以看看 立即下载

相关推荐

ABAQUS用户子程序全书USERSUBroutine

ABAQUS用户子程序全书USERSUBroutine,全面系统介绍了几乎所有subroutine的编写方法

开发轶事——为什么要求代码长度是80列

很多开发工具默认设定代码长度超过 80 列就换行,为什么呢?

山茶树和葡萄树 1585

USDFLD子程序

该子程序用于模拟蠕变裂纹自动扩展分析。本人一直在尝试与做蠕变裂纹扩展分析。

ABAQUS用户子程序HETVAL 与USDFLD子程序联用

利用ABAQUS进行热传导分析时,需要调用HETVAL,且同时需要与USDFLD子程序进行搭配使用, 1,要调用HETVAL,需要在inp文件中材料属性部分设置*HEAT GENERATION 或者在界面中设置时同样也是在property中设置HEAT GENERATION 2,调用USDFLD 子程序时,需要在inp文件材料属性的部分中添加关键字*USER DEFINED FIELD ,并且通过...

力学笃行 6754

VSCode+Keil高效开发STM32:Keil Assistant插件配置全攻略

本文详细介绍了如何通过VSCode的Keil Assistant插件,将Keil MDK的编译调试能力与VSCode的现代编辑体验相结合,打造高效的STM32开发环境。文章涵盖了从环境配置、工程导入、智能提示设置到与STM32CubeMX协同工作的全流程攻略,旨在解决Keil编辑器效率低下的痛点,大幅提升嵌入式开发的编码与项目管理效率。

gold的博客 507

信创改造实战:SpringBoot项目迁移到宝兰德BES 9.5.5的完整避坑指南(附依赖配置)

本文详细介绍了将SpringBoot项目迁移到宝兰德BES 9.5.5中间件的完整流程,包括环境准备、依赖调整、Web.xml版本适配、部署配置优化及常见问题解决方案。特别针对信创改造需求,提供了排除Tomcat依赖、处理BES专用starter等实用技巧,帮助开发者顺利完成国产中间件迁移。

weixin_30825581的博客 1100

《代码大全2》第7章 高质量的子程序

在讨论高质量的子程序的细节之前,明确下面这两个基本术语会很有帮助。首先,什么是“子程序(routine)”?方法过程。那什么又是高质量的子程序呢?这个问题更难回答。也许回答这个问题的最简单的办法,是来看看什么东西不是高质量的子程序。这里举一个低质量的子程序的例子:这个子程序里有哪些不妥呢?给你一个提示:你应该能够从中发现至少10不同的问题。请你先列出自己发现的问题,然后再来看下面这份清单:很差劲的名字没有文档布局不好。.........

qq_43783527的博客 838

航空机载总线网络概述

1.机载总线网络概述 现代战斗机的航空电子系统是航空电子技术经历了半个多世纪的漫长演变和不断进步的结果。航空电子系统结构的每次变化,其核心的机载总线网络技术也不断跨上新台阶,而且每次变革都能使飞机性能得到大幅提升。现代飞机的飞行与作战任务包括起飞、巡航、飞行控制、目标搜索、识别跟踪、火控计算、武器投射、制导、电子战、通信等,都需要航空电子系统承担,航空电子系统是现代战斗机的“大脑”和“神经中枢”,机载总线网络则是其关键的“神经网络”。在机载通讯领域发展过程中,具有代表性的典型总线有ARINC429、1553

qq_41854911的博客 1万+

【代码大全】笔记-关于全局数据

文章目录全局数据(Global Data)与全局数据有关的问题只用万不得已时才使用全局数据用访问子程序来取代全局数据访问器子程序的优势如何使用访问器子程序:降低全局数据的风险要点 全局数据(Global Data) 全局数据可以在程序中任意一个位置访问,这一概念有时被延伸到作用域比局部变量更广的变量——例如可以在一个类内部的任意位置进行访问的类变量。但是,在一个类中的任意位置可访问,并不意味着该变量是全局的。 与全局数据有关的问题 如果随意使用全局变量,或者认为不能随心所欲地使用他们是一种约束,那么你可能

Clear Code 1811

多目标优化NSGA-II(快速精英非支配排序遗传算法)及python实现

文章目录前言一、什么是NSGA-II?二、学习NSGA-II1.快速非支配排序算法2.密度估计3.拥挤比较算子4.主循环5.代码6.总结 前言 NSGA-II适用于复杂的多目标优化问题,是K-Deb教授在2000年在一篇paper《MOEAs — A fast and elitist multi-objective genetic algorithm: nsga2》提出。 Keywords: optimization; multi-objective evolutionary algorithm; no

ricky_blog 9745

SQL Prompt 9.0插件突然无法使用解决办法(附防联网激活)多图+文字

可能由于Redgate公司最近抓盗版抓得严,导致激活后的SQL Prompt联网后突然无法使用,无论卸载重装都没办法继续使用,本人同时使用SQL Assistant和SQL Prompt,我喜欢SQL Assistant代码提示功能,而SQL Prompt我喜欢将查询结果复制后可以直接生产插入脚本,这是最爽的一件事,即便对表有多么熟悉,没有这些插件,几行语法都要敲大半天,目前本人已经离不开这两个插...

骚团长的博客 1万+
上一篇: 《代码大全》到底讲什么?
下一篇: 《代码大全》:review与inspection
陈硕
博客等级 码龄26年 1万+粉丝 144原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值