Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16497869
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 21:33:06

下载本文示例代码
  我见过那种一个main函数写了1000多行的程序员,而且为数还不在少数。难道说他们不懂得用函数吗?不见得,但可以肯定的一点是他们没有编写优美代码的意识。那么我们为什么需要子程序呢?我们来看看STEVE McCONNELL是怎么说的。   以下是关于为什么要生成于程序的一些合理原因,其中有些原因之间可能有互相重叠的地方。  降低复杂性  使用子程序的最首要原因是为了降低程序的复杂性,可以使用子程序来隐含信息,从而使你不必再考虑这些信息。当然,在编写子程序时,你还需要考虑这些信息。但是,一旦写好子程序,就可能不必再考虑它的内部工作细节,只要调用它就可以了。创建子程序的另外一个原因是尽量减小代码段的篇幅,改进可维护性和正确性。这也是一个不错的解释,但若没有子程序的抽象功能,将不可能对复杂程序进行明智的管理。 一个子程序需要从另一个子程序中脱离出来的原因之一是,过多重数的内部循环和条件判断。这时,可以把这部分循环和判断从子程序中脱离出来,使其成为一个独立的子程序,以降低原有子程序的复杂性。  避免代码段重复  无可置疑,生成子程序最普遍的原因是为了避免代码段重复。事实上,如果在两个不同子程序中的代码很相似,这往往意味着分解工作有误。这时,应该把两个子程序中重复的代码都取出来,把公共代码放入一个新的通用子程序中,然后再让这两个子程序调用新的通用子程序。通过使公共代码只出现一次,可以节约许多空间。这时改动也很方便,因为只要在一个地方改动代码就可以了。这时代码也更可靠了,因为只需在一个地方检查代码。而且,这也使得改动更加可靠,因为,不必进行不断地、非常类似地改动,而这种改动往往又是认为自己编写了相同的代码这一错误假设下进行的。 限制了改动带来的影响。由于在独立区域进行改动,因此,由此带来的影响也只限于一个或最多几个区域中。要把最可能改动的区域设计成最容易改动的区域。最可能被改动的区域包括:硬件依赖部分、输入输出部分、复杂的数据结构和商务规则。  隐含顺序  把处理事件的非特定顺序隐含起来是一个很好的想法。比如,如果程序通常先从用户那里读取数据,然后再从一个文件中读取辅助数据,那么,无论是读取用户数据的子程序,还是读取文件中数据的子程序,都不应该对另一个子程序是否读取数据有所依赖。如果利用两行代码来读取堆栈顶的数据,并减少一个Stacktop变量,应把它们放入一个PopStack()子程序中,在设计系统时,使哪一个都可以首先执行,然后编写一个子程序,隐含哪一个首先执行的信息。 改进性能。通过使用子程序,可以只在一个地方,而不是同时几个地方优化代码段。把相同代码段放在子程序中,可以通过优化这一个子程序而使得其余调用这个子程序的子程序全部受益。把代码段放入子程序也使得用更快的算法或执行更快的语言(如汇编)来改进这段代码的工作变得容易些。  进行集中控制  在一个地方对所有任务进行控制是一个很好的想法。控制可能有许多形式。知道一个表格中的入口数目便是其中一种形式,对硬件系统的控制,如对磁盘、磁带、打印机、绘图机的控制则是其中另外一种形式。使用子程序从一个文件中进行读操作,而使用另一个子程序对文件进行写操作便是一种形式的集中控制。当需要把这个文件转化成一个驻留内存的数据结构时,这一点是非常有用的,因为这一变动仅改变了存取子程序。专门化的子程序去读取和改变内部数据内容,也是一种集中的控制形式。集中控制的思想与信息隐含是类似的,但是它有独特的启发能力,因此,值得把它放进你的工具箱中。  隐含数据结构  可以把数据结构的实现细节隐含起来,这样,绝大部分程序都不必担心这种杂乱的计算机科学结构,而可以从问题域中数据是如何使用的角度来处理数据。隐含实现细节的子程序可以提供相当高的抽象价值,从而降低程序的复杂程度。这些子程序把数据结构、操作集中在一个地方,降低了在处理数据结构时出错的可能性。同时,它们也使得在不改变绝大多数程序的条件下,改变数据结构成为可能。  隐含全局变量  如果需要使用全局变量,也可以像前述那样把它隐含起来、通过存取子程序来使用全局变量有如下优点:不必改变程序就改变数据结构;监视对数据的访问;使用存取子程序的约束还可以鼓励你考虑一下这个数据是不是全局的;很可能会把它处理成针对在一个模块中某几个子程序的局部数据,或处理成某一个抽象数据的一部分。  隐含指针控作  指针操作可读性很差,而且很容易引发错误。通过把它们独立在子程序中,可以把注意力集中到操作意图而不是机械的指针操作本身。而且,如果操作只在一处进行,也更容易确保代码是正确的。如果找到了比指针更好的数据结构,可以不影响本应使用指针的子程序就对程序作改动。  重新使用代码段  放进模块化子程序中的代码段重新使用,要比在一个大型号程序中的代码段重新使用起来容易得多。计划开发一个程序族。如果想改进一个程序,最好把将要改动的那部分放进子程序中,将其独立。这样,就可以改动这个子程序而不致影响程序的其余部分,或者干脆用一个全新的子程序代替它。几年前,我曾经负责一个替保险推销员编写系列软件的小组,我们不得不根据每一个推销员的保险率、报价单格式等等来完成一个特定的程序。但这些程序的绝大部分又都是相同的:输入潜在客户的子程序,客户数据库中存储的信息、查看、计算价格等等。这个小组对程序进行了模块化,这样,随推销员而变化的部分都放在自己的模块中。最初的程序可能要用三个月的时间来开发,但是,在此之后,每来一个推销员,我们只改写其中屈指可数的几个模块就可以了。两三天就可能写完一个要求的程序,这简直是一种享受!共2页。 1 2 :   我见过那种一个main函数写了1000多行的程序员,而且为数还不在少数。难道说他们不懂得用函数吗?不见得,但可以肯定的一点是他们没有编写优美代码的意识。那么我们为什么需要子程序呢?我们来看看STEVE McCONNELL是怎么说的。   以下是关于为什么要生成于程序的一些合理原因,其中有些原因之间可能有互相重叠的地方。  降低复杂性  使用子程序的最首要原因是为了降低程序的复杂性,可以使用子程序来隐含信息,从而使你不必再考虑这些信息。当然,在编写子程序时,你还需要考虑这些信息。但是,一旦写好子程序,就可能不必再考虑它的内部工作细节,只要调用它就可以了。创建子程序的另外一个原因是尽量减小代码段的篇幅,改进可维护性和正确性。这也是一个不错的解释,但若没有子程序的抽象功能,将不可能对复杂程序进行明智的管理。 一个子程序需要从另一个子程序中脱离出来的原因之一是,过多重数的内部循环和条件判断。这时,可以把这部分循环和判断从子程序中脱离出来,使其成为一个独立的子程序,以降低原有子程序的复杂性。  避免代码段重复  无可置疑,生成子程序最普遍的原因是为了避免代码段重复。事实上,如果在两个不同子程序中的代码很相似,这往往意味着分解工作有误。这时,应该把两个子程序中重复的代码都取出来,把公共代码放入一个新的通用子程序中,然后再让这两个子程序调用新的通用子程序。通过使公共代码只出现一次,可以节约许多空间。这时改动也很方便,因为只要在一个地方改动代码就可以了。这时代码也更可靠了,因为只需在一个地方检查代码。而且,这也使得改动更加可靠,因为,不必进行不断地、非常类似地改动,而这种改动往往又是认为自己编写了相同的代码这一错误假设下进行的。 限制了改动带来的影响。由于在独立区域进行改动,因此,由此带来的影响也只限于一个或最多几个区域中。要把最可能改动的区域设计成最容易改动的区域。最可能被改动的区域包括:硬件依赖部分、输入输出部分、复杂的数据结构和商务规则。  隐含顺序  把处理事件的非特定顺序隐含起来是一个很好的想法。比如,如果程序通常先从用户那里读取数据,然后再从一个文件中读取辅助数据,那么,无论是读取用户数据的子程序,还是读取文件中数据的子程序,都不应该对另一个子程序是否读取数据有所依赖。如果利用两行代码来读取堆栈顶的数据,并减少一个Stacktop变量,应把它们放入一个PopStack()子程序中,在设计系统时,使哪一个都可以首先执行,然后编写一个子程序,隐含哪一个首先执行的信息。 改进性能。通过使用子程序,可以只在一个地方,而不是同时几个地方优化代码段。把相同代码段放在子程序中,可以通过优化这一个子程序而使得其余调用这个子程序的子程序全部受益。把代码段放入子程序也使得用更快的算法或执行更快的语言(如汇编)来改进这段代码的工作变得容易些。  进行集中控制  在一个地方对所有任务进行控制是一个很好的想法。控制可能有许多形式。知道一个表格中的入口数目便是其中一种形式,对硬件系统的控制,如对磁盘、磁带、打印机、绘图机的控制则是其中另外一种形式。使用子程序从一个文件中进行读操作,而使用另一个子程序对文件进行写操作便是一种形式的集中控制。当需要把这个文件转化成一个驻留内存的数据结构时,这一点是非常有用的,因为这一变动仅改变了存取子程序。专门化的子程序去读取和改变内部数据内容,也是一种集中的控制形式。集中控制的思想与信息隐含是类似的,但是它有独特的启发能力,因此,值得把它放进你的工具箱中。  隐含数据结构  可以把数据结构的实现细节隐含起来,这样,绝大部分程序都不必担心这种杂乱的计算机科学结构,而可以从问题域中数据是如何使用的角度来处理数据。隐含实现细节的子程序可以提供相当高的抽象价值,从而降低程序的复杂程度。这些子程序把数据结构、操作集中在一个地方,降低了在处理数据结构时出错的可能性。同时,它们也使得在不改变绝大多数程序的条件下,改变数据结构成为可能。  隐含全局变量  如果需要使用全局变量,也可以像前述那样把它隐含起来、通过存取子程序来使用全局变量有如下优点:不必改变程序就改变数据结构;监视对数据的访问;使用存取子程序的约束还可以鼓励你考虑一下这个数据是不是全局的;很可能会把它处理成针对在一个模块中某几个子程序的局部数据,或处理成某一个抽象数据的一部分。  隐含指针控作  指针操作可读性很差,而且很容易引发错误。通过把它们独立在子程序中,可以把注意力集中到操作意图而不是机械的指针操作本身。而且,如果操作只在一处进行,也更容易确保代码是正确的。如果找到了比指针更好的数据结构,可以不影响本应使用指针的子程序就对程序作改动。  重新使用代码段  放进模块化子程序中的代码段重新使用,要比在一个大型号程序中的代码段重新使用起来容易得多。计划开发一个程序族。如果想改进一个程序,最好把将要改动的那部分放进子程序中,将其独立。这样,就可以改动这个子程序而不致影响程序的其余部分,或者干脆用一个全新的子程序代替它。几年前,我曾经负责一个替保险推销员编写系列软件的小组,我们不得不根据每一个推销员的保险率、报价单格式等等来完成一个特定的程序。但这些程序的绝大部分又都是相同的:输入潜在客户的子程序,客户数据库中存储的信息、查看、计算价格等等。这个小组对程序进行了模块化,这样,随推销员而变化的部分都放在自己的模块中。最初的程序可能要用三个月的时间来开发,但是,在此之后,每来一个推销员,我们只改写其中屈指可数的几个模块就可以了。两三天就可能写完一个要求的程序,这简直是一种享受!共2页。 1 2 : 下载本文示例代码


优美程序还需优美子程序优美程序还需优美子程序优美程序还需优美子程序优美程序还需优美子程序优美程序还需优美子程序优美程序还需优美子程序优美程序还需优美子程序优美程序还需优美子程序优美程序还需优美子程序优美程序还需优美子程序优美程序还需优美子程序优美程序还需优美子程序优美程序还需优美子程序优美程序还需优美子程序优美程序还需优美子程序
阅读(108) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~