当前位置: 首页 > article >正文

高质量的子程序1

1、什么是子程序?

子程序是为实现一个特定的目的而编写的一个可被调用的方法或过程。

2、使用子程序有什么好处?

子程序的使用使得程序变得更加易读,更易于理解,比任何编程语言的任何功能特性都更容易。

子程序也是迄今为止发明出来的用以节约空间和提高性能的最重要手段。统一在一个地方进行修改。子程序的使用使得现代化编程成为可能。

2.1、降低复杂度。

创建子程序的一个最重要的原因,就是为了降低程序的复杂度。可以通过创建子程序来隐藏一些信息,这样你就不必再去考虑这些信息了。当然,在你要编写这个子程序的时候肯定是要考虑它们的。不过一旦程序写好了,你就应该能忘记这些细节,可以直接调用该子程序而无须了解其内部工作细节。创建子程序还有其他一些原因一一如缩小代码规模、改善可维护性、提高正确性等一一也都是很不错的,但如果没有子程序的抽象能力,我们的智力将根本无法管理复杂的程序。

当内部循环或条件判断的嵌套层次很深时,就意味着需要从子程序中提取出新的子程序了。把嵌套的部分提取出来形成一个独立的子程序,可以降低外围子程序的复杂度。

2.2、引入中间、易懂的抽象。

把一段代码放入一个命名恰当的子程序内,是说明这段代码用意最好的方法之一。与读下面这一串语句相比,

 if(node < > NULL)then while(node .next < > NULL)do node node.nextleafName node,name end while elseleafName end i f

读懂下面这条语句就更容易:

leafName = GetLeafName(node)

这段新程序如此之短,只要给它取个好的名字就足够说明它的用意了。与上面的8行代码相比,这个名字提供了更高层次的抽象,从而使代码更具可读性。

2.3、支持子类化(subclassing)。

覆盖(override)简短而规整的子程序所需新代码的数量,要比覆盖冗长而邋遢的子程序更少。如果你能让可覆盖的子程序保持简单,那你在实现派生类的时候也会减少犯错的几率。

2.4、隐藏顺序。

把处理事件的顺序隐藏起来是一个好主意。比如,如果一个程序通常都是先从用户那里读取数据,然后再从一个文件中读取辅助数据,那么,无论是从用户那里读取数据的子程序还是从文件中读取数据的子程序,都不应该依赖另一个子程序是否己执行。再举一个有关顺序的例子,假设你写了两行代码,先读取栈顶的数据,然后减少stackTop变量的值。你应该把这两行代码放到一个叫PopStack()的子程序中。从而把这两行代码所必须执行的顺序隐藏起来。把这种信息隐藏起来,比让它们在系统内到处散布要好很多。

2.5、隐藏指针。

操作指针操作的可读性通常都很差,而且也容易出错。通过把这些操作隔离在子程序内部,你就可以把精力集中于操作的意图本身,而不是指针操作机制的细节。同时,如果此类操作都能在一个位置完成,那么你对代码的正确性就会更有把握。如果你发现了比指针更合适的数据类型,也可以对程序做出修改,而不用担心会破坏了那些原本要使用指针的代码。

2.6、提高可移植性。

可以用子程序来隔离程序中不可移植的部分,从而明确识别和隔离未来的移植工作。不可移植的部分包括编程语言所提供的非标准功能、对硬件的依赖,以及对操作系统的依赖等。

2.7、简化复杂的布尔判断。

为了理解程序的流程,通常并没有必要去研究那些复杂的布尔判断的细节。应该把这些判断放入函数中,以提高代码的可读性,因为:

(1)这样就把判断的细节放到一边了;

(2)一个具有描述性的函数名字可以概括出该判断的目的。

把布尔判断的逻辑放入单独的函数中,也强调了它的重要性。这样做也会激励人们在函数内部做出更多的努力,提高判断代码的可读性。最终,代码的主流程和判断代码都变得更加清晰。简化布尔判断也是降低复杂度的一个例子,这一点在前面就己经讨论过了。

2.8、改善性能。

通过使用子程序,你可以只在一个地方优化代码。把代码集中在一处可以更方便地查出哪些代码的运行效率低下。 同时, 在一处进行的优化, 就能使用到 (无论是直接调用还是间接使用 ) 该子程序的所有代码都从中受益。 把代码集中在一处之后 , 想用更高效的算法或更快速高效的语言来重写代码也更容易做了。

3、所有的子程序都应该很小吗?

不是的。既然有这么多好的理由来把代码写成子程序,这一点就没有必要了。事实上,有些事情写一个大的子程序来完成还会更好。

4、有些操作似乎过于简单,还需要写成子程序吗?

编写有效的子程序时,一个最大的心理障碍是不情愿为一个简单的目的而编写一个简单子程序。写一个只有两三行代码的子程序可能看起来有些大材小用,但经验可以表明,一个很好而又小巧的子程序会很有用。

小的子程序有许多优点。其一便是它们能够提高其可读性。比如进行的是从设备单位(device unit)到磅数(point)的转换计算。人们也会看出这十几处代码都在做着同样的事情。但是,它们原本可以更清楚些,所以我创建了一个子程序,并给它起了个好的名字,使这一转换可以只在一个地方进行。

在用这个子程序取代了那些直接嵌入计算的代码之后,这行代码更具可读性一一甚至己经达到自我注解的地步。

这个例子还暗示出把简单操作写成函数的另一个原因:简单的操作常常会变成复杂操作。写这段子程序时我还没有认识到这一点,但在某些情况下,当某个设备激活(active)时,DevicetJnitPer1nch()会返回0。这意味着我必须考虑到除以零的情况,为此需要再多写3行代码。

 

http://www.lryc.cn/news/2419044.html

相关文章:

  • NXP JN5169使用代码模板新建外设工程
  • C# 反射(二)操作属性PropertyInfo
  • 基于 Chromium 的第三方浏览器一览
  • Android Kotlin 模块化清洁架构项目指南
  • sptd.sys不是病毒?
  • 网络工程专业主要要学习什么知识呢?
  • PropertyGrid控件由浅入深(二):基础用法
  • 《三国志14》运行提示kbdlt.dll丢失问题的详解解决策略
  • MyBatis foreach语句批量插入数据
  • 正则表达式之grep
  • spring学习之---spring整合Hibernate
  • IIS配置优化
  • 计算机基础入门1:计算机发展四阶段
  • 谷歌怎么搜索关键词
  • sql sever数据库出现恢复挂起的解决办法
  • 【原创】NES第二波:如何用VS Code,编写NES/FC游戏程序。
  • [gtalk]gtalk机器人
  • 时间序列分析:西安GDP 的 ARIMA 分析SAS操作过程(理论知识略)
  • 深入理解Linux内核-内存和磁盘-回收页框
  • 基于TP框架的PHP版本AI网址导航源码
  • SAP数据快速查询工具:Sqvi-QuickView
  • 133道Java面试题及答案(面试必看)
  • web画图技术(svg、canvas、fusioncharts、anychart)简介
  • 解决Jsoup 访问 https协议网站时产生connect reset错误
  • H.264编解码
  • 办公OA系统|基于SpringBoot+Vue实现银行OA系统的设计与实现
  • AssemblyInfo.cs文件的作用
  • Docker入门(二)Docker命令之镜像命令
  • 很漂亮的个人主页(附带源码)
  • Compiling... ,Error spawning cl.exe 解决方法(转自http://hi.baidu.com/%D3%DE%C8%CB%B3%C2/blog/item/f5d43d3f