程序员编程标准-设计模块和过程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

廊坊师范学院计算机中心米新江第2章设计模块和过程米新江廊坊师范学院计算机中心米新江VisualBasic是一种可视化的语言•因此,相当一部分工作是设计各种用户界面。•不过,你仍然必须编写相应的代码,以便使你的应用程序能够执行某些操作。廊坊师范学院计算机中心米新江VisualBasic是一种可视化的语言•模块和过程是指应用程序代码的框架,而建立这样的框架必须进行慎密的考虑。•目前已经有许多成熟的方法可以用来创建更好的模块和过程,开发工程时,应该使用这些方法。廊坊师范学院计算机中心米新江模块和过程•当谈论模块和过程时,常常会听到许多不同的术语。廊坊师范学院计算机中心米新江廊坊师范学院计算机中心米新江2.1创建具有很强内聚力的模块•过程的重要性往往比模块的重要性更容易理解:–过程是指执行一个特定功能的一段代码。廊坊师范学院计算机中心米新江2.1创建具有很强内聚力的模块•但是对于许多开发人员来说,模块的作用比较难于弄清。–模块常常被错误地视为是一个仅仅用于存放过程的容器。–有些开发人员甚至把这种思路作了进一步的发挥,将他们的所有过程放入单个模块之中。廊坊师范学院计算机中心米新江•人们之所以不能正确地认识模块的功能,原因之一是模块的实现,实际上并不影响程序的执行。–当一个工程被编译时,如果所有过程都放在单个模块中或者放在几十个模块中,这没有任何关系。廊坊师范学院计算机中心米新江•虽然模块的数量对代码的执行并无太大的影响,•但是当创建便于调试和维护的代码时,模块的数量有时会带来很大的影响。•模块应该用来将相关的过程组织在一起。廊坊师范学院计算机中心米新江模块应该用来将相关的过程组织在一起。•在大多数应用程序中,按照某种共性来组织过程是相当容易的。廊坊师范学院计算机中心米新江•例如,可以将用于处理联系人记录的联系人管理程序中的所有例程组织在一起。–将这些相关的过程放在单个模块中,再加上一个描述这些过程的公用目的的名字,比如mdlContact。–但是,用于打开联系人数据库而并不直接处理联系人记录的过程,则可能并不属于联系人模块。廊坊师范学院计算机中心米新江内聚力•当模块包含一组紧密关联的过程时,该模块可以说具有强大的内聚力。•当模块包含许多互不相关的过程时,该模块便具有较弱的内聚力。应该努力创建内聚力比较强的模块。廊坊师范学院计算机中心米新江•我们没有经过职业训练同学所编写的工程,大多数都包含许多并不十分适合与其他过程组合在一起的过程。•在这种情况下,可以为这些不合群的过程,创建一个综合性收容模块,并命名为:–mdlGlobal、–mdlUtilities–mdlSupport。廊坊师范学院计算机中心米新江•但是,随着工程的扩大,应该随时注意这些模块的变化。–观察是否出现了可以给过程分组的条件,然后就可以考虑为过程的分组,而创建新模块。–组织得很好的一组模块应该类似表2-2的形式廊坊师范学院计算机中心米新江廊坊师范学院计算机中心米新江•通过创建专用模块,能增强模块的内聚力。–工程中的模块质量与模块组织的质量的重要性不能等量齐观。•一个非常大的VisualBasic工程可能只包含十几个模块,但是这些模块的组织结构应该非常完善廊坊师范学院计算机中心米新江•创建模块时,应该知道“模块化”这个术语的含义是什么。•模块的基本目的是创建相当独立的程序单元。–从根本上来讲,模块可以添加给另一个工程,并且可以通过直接调用它的公用过程来使用它。廊坊师范学院计算机中心米新江–这种通用模块并不依赖于全局数据或其他模块中的过程。•实际上,第二个特性是很难实现的,要想创建不包含对其他模块中的几个过程调用的模块很难的,但这是值得实现的目标。廊坊师范学院计算机中心米新江•如果你熟悉编写VisualBasic的类模块,以便创建可重复使用的对象,那么一定也了解创建模块的一般原理。–如果创建的程序体包含它的所有代码(本地过程),也包含它自己的数据(模块及变量),那么这称为封装,这是面向对象编程的主要概念。–如果能够创建封装完善的模块,你应该认真考虑将它们作为类模块(而不是标准模块)来创建、并且将它们作为对象来操作。廊坊师范学院计算机中心米新江2.2创建松散连接和高度专用的过程廊坊师范学院计算机中心米新江2.2.1使所有过程都执行专门的任务•首先要记住,每个过程都应该执行一项特定的任务,它应该出色地完成这项任务。•应该避免创建执行许多不同任务的过程。这常常需要具有一定的远见,因为究竟哪些成分构成一个任务,这并不总是十分明显。廊坊师范学院计算机中心米新江例如,在库存管理应用程序•你必须创建一个发布例程,用于发布采购单生成的收据。廊坊师范学院计算机中心米新江发布收据涉及的操作步骤包括:•检索接收到的产品的ID和成本。•确认库存产品主控表中存在的ID。•更新库存表中的当前库存量。•更新数据库中的产品的合计成本,平均成本和最新成本。•如果使用FIFO(先进先出)或LIFO(后进先出)会计方法,则更新FIFO或LIFO记录。廊坊师范学院计算机中心米新江•可以创建执行所有这些操作的单个发布过程,也可以创建如下所示的比较专用的过程:–PostPurchaseOrderReceipt–ValidateItemExistsInMasterInventoryTable–UpdateQuantityOnhand–UpdateItemCosts–UpdateFIFOLIFO廊坊师范学院计算机中心米新江创建专用过程有许多好处。•首先,调试将变得更加容易。–如果你的库存估价报表上出现了不正确的最新成本,就应该知道到UpdateItemCosts过程中去查找错误。–如果将所有代码放入单个PostPurchaseOrderReceipt过程中,那么就必须费劲地通过另一个任务才能到达与成本相关的代码。•当创建专用过程时,不一定能够在查找的第一个过程中找到错误,但是可以缩短查找错误所需的时间。廊坊师范学院计算机中心米新江创建专用过程的更重要的好处•可以按计划或者不按计划来修改代码。•例子,–假设你们公司机构的变化导致某些经营规则的更改,或者导致数据存储方式的变化。–你不再将库存物品保存在单个位置上,而是分散存储在多个仓库中。廊坊师范学院计算机中心米新江•当一项产品接收入库时,它必须用库存管理应用程序存入一个特定位置。•如果将添加产品到库存中时所用的代码隔离开来,在这里即UpdateQuantityOnhand过程,那么就可以确切地知道到何处去进行修改,并且只会影响代码的一个很小的和特定的区域。•如果将与发布收据相关的所有代码放入一个过程中,那么增加特性就会导致过程膨胀,使它越来越难以管理。廊坊师范学院计算机中心米新江如何将进程分割成专用过程?•没有一成不变的规则。•可以创建有效而可以维护的过程,但是你不想跟踪几十个很小的过程,因为作为大过程的组成部分,可以更好地使用它们。•当你感到有问题时,请让别人审查你的代码,这通常有助于获得新的看法。•在这个领域中,丰富的经验可以提高你的技能。久而久之,你就会懂得如何维护和修改代码的各个组成部分。廊坊师范学院计算机中心米新江2.2.2尽量使过程成为自成一体的独立过程•除了尽量使过程成为专用过程外(这是合乎道理的),还应该尽量使之成为独立的过程。•当一个过程依赖于对其他过程的调用时,称为与其他过程紧密连接的过程。•紧密连接的过程会使调试和修改变得比较困难,因为它牵涉到更多的因素。廊坊师范学院计算机中心米新江•当创建的过程依赖于较少的其他过程或者不需要调用其他过程时,那么它就是松散连接的过程。•松散连接的过程优于紧密连接的过程,但是你不可能使每个过程都成为独立的过程。•尽管如此,你应该尽量减少过程之间的连接关系廊坊师范学院计算机中心米新江•若要使过程具备较强的独立性,方法之一是尽量减少全局变量和模块级变量。•使用全局变量和模块级变量的过程都不是独立过程,因为它们要依赖于不受其全部控制的数据。•关于如何控制变量的作用域和全局变量的缺点等方面的详细说明,请参见第5章。廊坊师范学院计算机中心米新江•创建过程时,设法将每个过程视为一个黑箱,其他例程不应该要求了解该过程的内部工作情况,该过程也不应该要求了解它外面的工程情况。•这就是为什么你的过程应该依靠参数而不应该依靠全局变量的原因。•当一个过程通过前门接收参数时,这些参数就变成该过程的局部数据–每个过程都有一个进入点,称为前门;并且每个过程只应该包含一个退出点,称为后门)。•当过程使用全局变量或模块级变量时,它可以访问自己范围之外的数据。廊坊师范学院计算机中心米新江创建专用过程时,请考虑下列指导原则:•将复杂进程放入专用过程。如果应用程序使用复杂的数学公式,请考虑将每个公式放入它自己的过程中。–这样,使用这些公式的其他过程就不必包含用于该公式的实际代码。–这样也可以更容易发现与公式相关的问题。廊坊师范学院计算机中心米新江将数据输入/输出(I/O)放入专用过程。•当需要改变数据输入/输出的处理方法时。–例如,可能要修改使用文本文件的应用程序,使它能够使用MicrosoftJet之类的数据库引擎。•如果该应用程序的数据输入/输出代码在专用过程中被隔离,就可以更容易进行必要的修改。廊坊师范学院计算机中心米新江•将专用过程中可能要修改的代码区隔离。–如果你知道某个进程经常变更,请将这个多变的代码放入专用过程,以便以后可以更加容易地进行修改,并且减少无意中给其他进程带来问题的可能性。廊坊师范学院计算机中心米新江•将业务规则封装在专用进程中。–业务规则常常属于要修改的代码类别,应该与应用程序的其余部分隔开。–其他过程不应该知道业务规则,只有要调用的过程才使用这些规则。廊坊师范学院计算机中心米新江2.2.3尽量减少扇入和扇出廊坊师范学院计算机中心米新江•当某个过程被许多其他过程调用(并且因此许多其他过程依赖于他)时,就说明它是个高度扇入的过程,这是件好事。•高度扇入的过程通常是封装很好的过程,它支持代码复用的思路。廊坊师范学院计算机中心米新江•如果一个过程要调用许多其他过程,而它又是个高度扇出的过程,那么情况就不那么好了。•高度扇出意味着该过程要依赖于许多其他过程才能完成它的工作,–换句话说,它是个紧密连接的过程。–这使得程序的调试比较困难,因为寻找执行路径更加复杂。廊坊师范学院计算机中心米新江•对于给定工程来说,不存在完美无缺的解决办法。•如果遵循创建专用过程的所有指导原则,肯定会遇到这样一种情况,那就是有些过程会出现高度扇出,因为它们将许多不同任务交给其他专用过程去执行。•要使专用过程与松散连接、强大的内聚力、更高程度的扇入和较低程度的扇出之间取得平衡,这是个永远无法完全实现的目标。廊坊师范学院计算机中心米新江设计模块和过程要达到的目的•创建更加容易调试和维护的过程•创建具有强大内聚力的模块•创建高度专用的过程•创建松散连接的过程•尽量使过程具有独立性•提高过程的扇入性•降低过程的扇出性廊坊师范学院计算机中心米新江2.3编程原则•2.3.1为过程和模块赋予表义性强的名字•2.3.2为每个过程赋予单个退出点•2.3.3为每个过程赋予明确定义的作用域•2.3.4用参数在过程之间传递数据•2.3.5使用统一和直观明了的方式来调用过程廊坊师范学院计算机中心米新江2.3.1为过程和模块赋予表义性强的名字•为了使代码更加容易理解,最容易的方法之一是为你的过程赋予表义性强的名字。•函数名DoIt、GetIt和PrintIt的可读性很难与CalculateSalesTax、RetrieveUserID和PrintSpreadSheet相比。廊坊师范学院计算机中心米新江•给过程正确地命名,可使程序工程的调试和维护工作大大改观。•请认真对待过程命名的工作,不要为了减少键入操作量而降低过程的可理解度。廊坊师范学院计算机中心米新江廊坊师范学院计算机中心米新江(1)给过程命名时应该大小写字母混合使用廊坊师范学院计算机中心米新江(2)定义过程名时不要使用缩写•如果你认为应用程序中的某些工程应该使用缩写,那么请将这些情况加上注释,并确保每个人在所有时间内都

1 / 70
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功