如何设计子程序

解决先决条件    在动手去做子程序本身的任何工作之前,应该先检查一下子程序要做的工作是不是已经定义好了,是不是能够与整体设计相匹配。另外要结合项目的需求,检查这个程序是否是真正必需的,至少是间接需要的。

 

即:确定子函数要完成的任务(有无必要),及是否与整体设计相比配。

 

定义子程序要解决的问题    陈述出该子程序将要解决的问题,叙述要足够详细,以使能去创建这个子程序。如果高层的设计已经足够详细,那么这项工作可能已经完成了。在这个高层的设计里至少要详细说明下列信息。

1)这一子程序将要隐藏的信息

2)传给这个子程序的各项输入

3)从该子程序得到的输出

4)在调用程序之前确保有关的前条件成立(如输入数据的取值位于特定范围之内、有关的流已经初始化、文件已经打开或者关闭、缓冲区已经填满或清空等)

5)在子程序将控制权交会调用方程序之前,确保其后条件的成立(如输出数据位于特定范围之内、流已经初始化、文件已经打开或者关闭、缓冲区已填满或清空等)

 

即:根据具体问题,完成至少上述五点。

 

为子程序命名    给子程序命名看似不很重要,但好的子程序却是优秀子程序的标志之一,七个好名字也并不那么容易。一般来说,子程序应该有一个清晰、无歧义的名字。如果在给程序起个好名字的时候犯难,通常就表明这个子程序的目标还没明确。应该尽所能让名称变得更清晰,但如果是由于含混不清的设计而导致含混不清的名称,那么就要留意这个警告信号了——回头去改善设计吧!

 

即:根据子程序的命名,就可知子程序的目标是否明确,设计是否完善。

 

决定如何测试子程序    在编写一个子程序的时候,要想一想怎么才能测试它。这个做对于自己做单元测试,以及那些要独立地测试你写的子程序的测试人员都有好处。

 

在标准库中搜寻可用的功能    要想提高代码的质量和生产率,有一个最重要的途径就是重用好的代码。如果发现自己苦苦设计的一段程序实在是过于复杂,那么请查看一下在你所用的编程语言、开发平台或者工具,看看其中是否提供该程序的全部或部分功能。了解一下公司维护的代码里是不是已经有这些功能了。人们已经发明、评价并改善了很多的算法,它们已经过了充分测试,在文献中也有所记录。与其在那些别人已经写成了博士论文的东西上浪费好ijian,还不如花几分钟时间去看看别人已经写成的代码,从而确保不会花冤枉功夫。

 

即:多收集可复用的优秀代码。

 

考虑错误处理    考虑在子程序中所有可能出错的环节。比如说错误的输入数值、从其他子程序返回的无效数据等。

 

        子程序可以使用多种方式来处理错误,应该特别注意去选择处理错误的方式。如果在程序架构中定义了出错处理策略,你只须遵循这一策略即可,否则,就必须针对对特定的子程序程序确定最佳的出错处理方式。  

 

考虑效率问题    第一种情况下,程序的效率并不是十分紧要。只要看看子程序的接口是否经过很好的抽象,看看程序时候易读,这样在日后需要的时候可以随时对它进行改进。如果封装做的很好,就可以使用更好的算法,或者更高效的低级语言代码代替高级语言所编写的代码,同时还不会影响到其他的子程序。

 

即:先注重子程序的抽象、可读性、封装。进一步选择算法,或使用效率更高的语言来实现一部分代码段。

 

第二种情况——性能非常重要。架构应指明每个子程序(或着类)有多少资源可使用,以及它们必须以多快的速度执行其操作。

 

根据所确定的资源及速度的目标来设计子程序。如果速度看上起更为重要,就牺牲一部分资源换取速度,反之亦然。在程序创建的起始阶段,先将其调校到能达到预定的资源和速度,也是可以的。

 

    除此之外,在每个子程序上为效率问题卖力通常是白费功夫。最主要的优化在于完善高层的设计,只有当这样叶满足不了系统的性能目标时,才需要进行微观的优化——不过除非整个程序全部完成,否则不会知道这一点。因此,不要在微不足道的点滴改进上浪费时间,除非确实有必要这样去做。

 

研究算法和数据类型    如果在可用的程序库中没有所需的功能,也许会在某本算法书中介绍过。因此,在决定从头开始编写一段复杂的代码之前,查一下算法书看看有什么可用的内容。如果要采用一个已有明确定义的算法,则要保证把这个算法正确地转换为所使用的编程语言。

 

编写伪代码    前述这些步骤的主要目的是为了确立一个思路,这在真正编写程序的时候是很有帮助的。之后就可以开始写伪代码了。

 

从最一般情况写起,向着更具体的细节展开工作。子程序最常见的部分是一段头部注释,用于描述这段程序应该做些什么,所以首先简要地用一句话来写下该子程序的目的。写出这句话将帮助澄清对该子程序的理解。如果连概要性得到注释写起来都很困难,那就得提醒自己,还得更好地理解这一子程序在整个程序中的角色才行。一般来说,如果很难总结出一个子程序的角色,可能就应该考虑是否什么环节出了问题。

 

考虑数据    可以在整个过程中的几个不同环节对子程序所用的数据进行设计。如果对数据的操作是某个子程序的重点,那么值得在考虑子程序的逻辑之前,首先考虑清楚主要的数据部分。把关键的数据类型定义好,对于设计一个子程序的逻辑是很有用的。

 

检查伪代码    在写完伪代码并设计完数据之后,花上几分钟时间复查所写的伪代码。然后抛开这些代码,想想该如何向别人解释这些代码。

 

在伪代码中试验一些想法,留下更好的想法(迭代)    在开始编写代码之前,应尽可能用伪代码去尝试更多的想法。一旦你真正开始编码,你和你所写下的代码就会有感情,从而就更难以抛弃不好的设计再重新来过了。

 

    通常的想法是,用伪代码反复描述这个子程序,直到用伪代码写出的句子已经足够简单了,可以在每个句子下面填入代码,并把原来的伪代码变成代码的文档为止。最初尝试写出的一些伪代码可能还是层次太高,这就需要进一步分解它。一定要进一步地分解它。如果还不确定该怎么编写代码,那么就继续在伪代码上下功夫,直到能确定为止。持续地精化和分解伪代码,直到觉得再写伪代码(而不是真正的代码)是在是浪费时间为止。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值