VB编程规范
1. 开发人员操作规程
1.1 VB选项参数的定义:
选项能数的规范有两方面的意义:一方面是及时排除程序中存在的拼写错误、语法错误,及时保存程序的修改;另一方面是将所有开发人员的开发界面一致化,以避免开发人员在其它开发人员的电脑上工作时因选项不同而造成的差错。
1) 打开“工具”菜单,在第一页“编辑器”中选定所有选项,并在Tab宽度中输入4。代码缩进时,先选中要缩进的代码块,然后使用快捷键是Tab(右移)和Shift+Tab(左移);如果手工输入空格完成缩进,请以4个空格为单位。
2) 在第二页“编辑器格式”中,不要修改任何选项,一律使用VB默认值,否则可能在其他人操作时因界面不一致,而产生操作失误。
3) 在第三页“通用”中,清除“请求时编译”前的复选框(此时“后台编译”选项会变成灰色),以确保每次程序执行时都是全编译执行。
4) 第四页“可连接的”,可按自己习惯设定,建议清除所有复选框,这样会编辑代码时代码窗口可获得最大的显示空间。
5) 第五页“环境”中“启动程序时”中一定选择“提示保存改变”(第二项),这样每次程序被修改后再运行时,VB都会提示保存,避免对程序的修改因偶然因素而丢失。
6) 第六页“高级”中各选项由开发人员按自己习惯定义,但要注意当使用SDI方式进行开发时,每次在设计环境中用鼠标拖动窗体都会导致窗体的StartUpPosition变为0-手动,原来在屏幕上居中(StartUpPosition为2-屏幕中心)的窗体运行时可能会改变位置。
1.2 快捷键的使用
使用快捷键提高操作速度。
F1 帮助
F2 显示对象浏览器
F4 查看当前选中控件的属性窗体
F5 运行
F7 由窗体设计切换到对应的代码窗体
F8 单步执行
Shift+F2 查看当前光标所在的变量或函数、子过程的定义
Shift+F7 由代码窗体切换到对应的窗体设计界面
Shift+F8 逐过程单步执行
Ctrl+F5 全编译执行
Ctrl+F 在代码窗体进行查找
Ctrl+G 查看立即窗体
Ctrl+R 查看工程窗口
2. 设计模块和过程
2.1 建具有很强内聚力的模块
过程的重要性往往比模块的重要性更容易理解,过程是指执行一个统一函数的一段代码。模块常被错误的视为是一个仅仅用于存放过程的容器。有些开发人员甚至把这种思路作了进一步的发挥,将他们的所有过程放入单个模块之中。
之所以不能正确的认识模块的功能,原因之一是模块的实现实际上并不影响程序的执行。当一个工程被编译时,如果所有过程都放在单个模块中或者放在几十个模块中,这没有任何关系。虽然模块的数量对代码的执行并无太大的影响,但是当创建便于调试和维护的代码时,模块的数量有时会带来很大的影响。
模块应该用来将相关的过程组织在一起。
当模块包含一组紧密关联的过程时,该模块可以说具有强大的内聚力。当模块包含许多互不相关的过程时,该模块便具有较弱的内聚力。应该努力创建内聚力比较强的模块。
大多数工程都包含许多并不十分适合与其他过程组合在一起的过程。在这种情况下,可以为这些不合群的过程创建一个综合性收容模块。
创建模块时,应知道“模块化”这个术语的含义是什么。模块的基本目的是创建相当独立的程序单元。从根本上来讲,模块可以添加给另一个工程,并且可以通过直接调用它的公用过程来使用它。
2.2 创建松散连接和高度专用的过程
1. 使所有过程都执行专门的任务
每个过程都应执行一项特定的任务,它应出色的完成这项任务。应避免创建执行许多不同任务的过程。
创建专用过程有许多好处。首先调试将变得更加容易。
2. 尽量使过程成为自成一体的独立过程
当一个过程依赖于其他过程的调用时,称为与其他过程紧密连接的过程。紧密连接的过程会使调试和修改变得比较困难,因为它牵涉到更多的因素。松散连接的过程优于紧密连接的过程,但你不可能使每个过程都成为独立的过程。
若要使过程具备较强的独立性,方法之一是尽量减少全局变量和模块级变量。
创建过程时,设法将每个过程视为一个黑箱,其他例程不应要求了解该过程的内部工作情况,该过程也不应要求了解它外面的工程情况。这就是为什么你的过程应依靠参数而不应依靠全局变量的原因。
创建专用过程时,请考虑下列指导原则:
1) 将复杂进程放入专用过程。如果应用程序使用复杂的数学公式,请考虑将每个公式放入它自己的过程中。这样使用这些公式的其他过程就不包含用于该公式的实际代码。这样也可以更容易发现与公式相关的问题。
2) 将数据输入/输出(I/O)放入专用过程。
3) 将专用过程中可能要修改的代码隔离。如果你知道某个进程经常变更,请将这个多变的代码放入专用过程,以便以后可以更容易的进行修改,并减少无意中给其他进程带来问题的可能性。
4) 将业务规则封装在专用过程中。业务规则常属于要修改的代码类别,应与应用程序的其余部分隔开。其他过程不应知道业务规则,只有要调用的过程才使用这些规则。
3. 设计模块和过程时,要达到下列目的:
1) 创建更加容易调试和维护的过程
2) 创建具有强大内聚力的模块
3) 创建高度专用的过程
4) 创建松散连接的过程
5) 尽量使过程具有独立性
6) 提高过程的扇入性
7) 降低过程的扇出性
2.3 编程原则:
1. 为过程和模块赋予表义性强的名字
为了使代码更加容易理解,最容易的方法之一是为你的过程赋予表义性强的名字。函数名DoIt、GetIt的可读性很难与CalculateSalesTax、 RetrieveUserID相比。
由缩写过程名组成的代码很难理解和维护,没有理由再这样做了。
给过程正确的命名,可使程序工程的调试和维护工作大大的改观。请认真对待过程命名的工作,不要为了减少键入操作量而降低过程的可理解度。
实际应用举例:
1) 给过程命名时应大小写字母混合使用。如果句子全使用大写字母,那么阅读起来就非常困难,而大小写字母混合使用的句子,阅读起来就很容易。
2) 定义过程名时不要使用缩写。如果你认为应用程序中的某些工程应使用缩写,那么请将这些情况加上注释,并确保每个人在所有时间内都使用这些缩写。决不要在某些过程中对某些单词进行缩写,而在别的过程中却不使用缩写。
2. 为每个过程赋予单个退出点
3. 创建过程时,始终都应显式地定义它的作用域。
1) VB使用Public作为默认作用域。如果你真的想创建一个公用过程,请向代码阅读者说明这一点。
2) 通过为每个过程赋予一个明确定义的作用域,可以减少代码阅读者需要投入的工作量。应确保你为过程赋予最有意义的作用域。如果一个过程只被同一模块中的另一个过程调用,那么请将它创建成专用过程。如果该过程是从多个模块中的多个过程中调用,请将该说明为公用过程。
3) 每个过程都应以Public、Private或Friend开头。
4. 用参数在过程之间传递数据
应尽量避免使用模块级变量。一般来说,变量的作用域越小越好。为了减少模块级变量和全局变量,方法之一是将数据作为参数在不同过程之间传递,而不是让过程共享模块级变量或全局变量。
1) 为每个参数指定数据类型。
2) 根据情况传递ByVal或ByRef。给每个参数冠以ByVal或ByRef所需要的规则是非常重要的
3) 始终要对数进行检验,决不要假设你得数据没有问题。程序员常犯的一个错误是在编写过程时假设数据没有问题。在初始编程阶段,当编写调用过程时,这样的假设并无大碍。这时你完全能够知道什么是参数的许可值,并按要求提供这些值。但如果你不对参数的数据进行检验,那么下列情况就会给你带来很大麻烦:另外某个人创建了一个调用过程,但此人不知道允许的值;你在晚些时候添加了新的调用过程,并错误的传递了坏数据。
4) 当参数只接受较小的一组值时,请使用枚举值。使用枚举值,可降低编码时出现数据输入错误的可能性。只要有可能,就可考虑使用枚举值。
3. 命名约定
所有变量的定义应该遵循匈牙利命名法,它使用3字符前缀来表示数据类型和控件类型,3个字符的前缀必须小写,前缀后面是由表意性强的一个单词或多个单词组成的名字,而且每个单词的首写字母大写,其它字母小写,这样保证了对变量名能够进行正确的断句。
这样,在一个变量名就可以反映出变量类型和变量所存储的值的意义两方面内容,这使得代码语句可读性强、更加容易理解。
3.1 变量类型前缀列表:
数据类型 前缀 示例
Boolean bln BlnLoggedIn
Currency cur curSalary
Control ctl ctlLastControl
Double dbl dblMiles
ErrObject err errLastError
Single sng sngYears
Handle hwnd hwndPicture
Long lng lngOnHand
Object obj objUserTable
Integer int intAge
String str strName
User-defined type udt udtEmployee
Variant (including Dates) vnt vntDateHired
Array a astrEmployees
3.2 控件类型前缀列表:
控件 前缀 举例
Check chk chkPrint
Combo cbo cboTitle
Command cmd cmdCancel
Data dat datBiblio
Directory list box dir dirSource
Drive list box drv drvTarget
File list box fil filSource
Frame fra fraLanguage
Form frm frmMain
Group push button gpb gpbChannel
Horizontal scroll bar hsb hsbVolume
Image img imgIcon
Label lbl lblHelpMessage
Line lin linVertical
List box lst lstResultCodes
MDI child form mdi mdiContact
Menu mnu mnuFileOpen
OLE container ole olePhoto
Option button opt optSpanish
Panel pnl pnlSettings
Picture box pic PicDiskSpace
Picture clip clp ClpToolbar
Shape shp ShpCircle
Text box txt TxtAddress
Timer tmr TmrAlarm
Vertical scroll bar vsb VsbRate
3.3 结构
当用户定义UDT(即用户自定义结构,Type结构)时,它应加上前缀“Type_”,以示与其它类型的区别。
3.4 其它
开发人员如果遇到上述表格中未列举的类型,请书面通知相关管理人员,由管理人员集中更新列表内容,不得擅自启用未经确定的新变量或控件前缀。
4. 使用常量和枚举值
4.1 使用常量
1) 常数很容易在数据输入时出错
常数存在的主要问题之一是你很容易在键入数字时出错,从而颠倒了数字的位置。例如,当你键入数字10876时,很容易的键入10867或18076。与处理变量和保留字的方法不同,vb的编译器并不在乎颠倒了位置和不正确的数字,有时简单的错误造成的问题不会立即表现出来,而当问题表现出来时,它们会以随机的计算错误的形式出现,这些错误很难准确定位。用常量来取代常数时,vb将在编译时检查常量的有效性。如果常量不存在,vb便将这一情况通知你,并拒绝进行编译,这可以消除错误键入的数字带来的问题,只要常量拥有正确的值,使用该常量的所有代码也有使用该正确值。
2) 常数很难不断更新
3) 常量使代码更容易阅读
使用常量后,得到的一个额外好处是可使创建的代码更容易阅读。常数很不直观。也许你对常数非常了解,但其他人则根本看不明白。通过合理的给常量命名,使用这些常量的代码就变得比较直观了,更容易阅读。
为常量赋予较宽的作用域,这与使用变量时的情况不同。在一个应用程序中你决不应该两次创建相同的常量。如果你发现自己复制了一个常量,请将原始的常量说明转至较宽的作用域,直到该常量可供引用它的所有过程为止。
4.2 使用枚举值
你不必记住参数的数值,错误地设定值的可能性也大大减少了。虽然你仍可为参数设定数值,而不是设定枚举成员的名字,但你决不应该这样去做。
1) 枚举值的所有成员都是长整型数,你不得使用其他数据类型。
2) 使用常量和枚举值的目的:
减少数字换位和键入错误带来的代码错误;
将来可以更容易更改各个值;
使代码更容易阅读。
4.3 编程原则
常量不同于变量的另一个标识特征是不使用数据类型前缀。
有些外部数据库仍然使用大写字母常量。例如,如果用 API浏览器查找和拷贝与API相关的常量,你常可看到它们是使用大写字母的常量。在这种情况下,请将这些常量保持原状,以便达成应用程序之间的一致性。
1) 将应用程序前缀或特定的前缀用于枚举成员
i. 不必用前缀来表示枚举成员的类型,因为所有成员总是属于长整型数。但应该使用专门的前缀来表示它的值来自应用程序或组件。
ii. 应该用一个指示符作为枚举成员的前缀,因为当vb遇到一个枚举成员名时,如果其他被引用的类型库中包含相同的名字,它就会搞混。
2) 若要了解键入的系统常量是否正确,方法之一是全部用小写字母键入该常量。如果该常量有效,vb就会将它转换成正确的大小写字母。如果该常量仍然保持全部为小写字母,就表示键入的名字不正确,必须进行纠正。
3) 当参数接受有限数量的值时,请使用枚举
4) 使用Select Case结构时,始终要加上一个Else子句,以便处理传递给过程的有效值。
5. 变量
5.1 定义有焦点的变量
用于多个目的的变量称为无焦点(多焦点)的变量。无焦点变量所代表的意义与程序的执行流程有关,当程序处于不同位置时,它所表示的意义是不固定的,这样就给程序的可读性和可维护性带来了麻烦。
比如:定义一个名为rs的RecordSet变量,先用这个变量取得了医院员工数据,之后又用同一个变量名取得了住院病人数据,那么单独抽取出一句使用了变量rs的语句,如果只凭这一句、不从头读起的话,很知道这句话究竟使用的是哪个表的数据。这给程序的维护带来了不必要的麻烦。
5.2 只对常用变量名和长变量名进行缩写
如果需要对变量名进行缩写时,一定要注意整个代码中缩写规则的一致性。例如,如果在代码的某些区域中使用Cnt,而在另一些区域中又使用Count,就会给代码增加不必要的复杂性。
变量名中尽量不要出现缩写。
5.3 使用统一的量词
通过在结尾处放置一个量词,就可创建更加统一的变量,它们更容易理解,也更容易搜索。例如,请使用strCustomerFirst和strCustomerLast,而不要使用strFirstCustomer和strLastCustomer。
量词列表:
量词后缀 说明
First 一组变量中的第一个
Last 一组变量中的最后一个
Next 一组变量中的下一个变量
Prev 一组变量中的上一个
Cur 一组变量中的当前变量
5.4 使用肯定形式的布尔变量
给布尔变量命名时,始终都要使用变量的肯定形式,以减少其它开发人员在理解布尔变量所代表的意义时的难度。
5.5 为每个变量选择最佳的数据类型
这样即能减少对内存的需求量,加快代码的执行速度,又会降低出错的可能性。用于变量的数据类型可能会影响该变量进行计算所产生的结果。在这种情况下,vb不会产生运行期错误,它只是迫使该值符合数据类型的要求。这类问题极难查找。
例如:对可能会出现浮点数的变量,定义为整形或长整形会导致VB在运算时将该变量的值自动取整,这种VB自动进行、隐式的的操作会增大程序排错时的难度。
5.6 只有在绝对必要时才使用Variant数据类型
Variant还存在其他缺陷。它们占用的内存比VB的任何其他数据类型都要多,而且对Variant中的数据进行操作时的速度几乎总是比对其他数据类型进行操作的速度要慢,另外变体类型还可能导致VB在程序运行过程中对数据类型进行自动转换。
只有在确实不能预料变量的类型时才能使用Variant。
注意:当你使用单个As﹤type﹥子句在同一个代码行上说明多个变量时,只有Dim语句中的最后一个变量被赋予特定数据类型。所有其他变量均被赋予Variant数据类型。
5.7 尽量缩小变量的作用域
如果变量的作用域大于它应有的范围,变量可继续存在,并且在不再需要该变量后的很长时间内仍然占用资源。
它们的主要问题是,任何模块中的任何过程都能对它们进行修改,并且很难跟踪究竟是何处进行修改的。
占用资源是作用域涉及的一个重要问题。如果创建全局的Recordset(记录集)变量,问题会复杂。对于Recordset
对变量来说,尽量缩小作用域将会对应用程序的可靠性产生巨大的影响。
5.8 使用“&”字符对字符串进行并置操作
“&”字符能清楚的传达函数的意图,消除阅读者可能存在的疑点,使阅读者清楚地理解目前的操作是加法、还是字符串连接,并且不会因为类型的强制转换而产生不正确的结果。
6. 代码的格式化
6.1 对代码进行格式化时,要达到的目的包括:
1) 通过代码分割成功能块和便于理解的代码段,使代码更容易阅读和理解;
2) 使用空行和注释行,将程序中逻辑上不相关的代码块分开。比如:变量声明部分和代码语句间的分隔;较长的过程中,完成不同功能的代码块间的分隔。要避免出现逻辑上混乱的分隔,如:某一逻辑功能代码块中间用空行进行了分隔,但是在相邻功能代码块之间却没有分隔,这样会给程序阅读者造成错觉。
3) 减少为理解代码结构而需要做的工作;
4) 使代码的阅读者不必进行假设;
5) 使代码结构尽可能做到格式清楚明了。
6.2 编程原则:
1) 要将多个语句放在同一行上
不论是变量声明,还是语句都不要在一行上书写多个。
2) 用行接续符
对较长语句,如API声明等,在代码窗体可视范围内给予换行,不要使别人必须通过滚动窗口才能查看到完整的代码。注意,当处理长字符串时,要使用
"字符串1" & _
"字符串2"
的格式。
3) 缩进后续行
当你将变量设置为某个值时,所有后续行的缩进位置应与第一行的变量值相同;
当你调用一个过程时,后续行缩进到第一个参数的开始处;
当你将变量或属性设置为等于表达式的计算结果时,请从后面分割该语句,以确保该表达式尽可能放在同一行上。
4) 在If语句后缩进;
在Else语句后缩进
在Select Case语句后缩进
在Case语句后缩进
在Do语句后缩进
已经用行接续符分割的语句的各个行要缩进
在With语句后缩进。
对从属于行标注的代码进行缩进。
5) 在执行统一任务的各个语句组之间插入一个空行。好的代码应由按逻辑顺序排列的进程或相关语句组构成。
7. 代码的注释
7.1 使用代码注释的目的:
1) 文字说明代码的作用(即为什么要用编写该代码,而不是如何编写);
2) 确指出该代码的编写思路和逻辑方法;
3) 人们注意到代码中的重要转折点;
4)使代码的阅读者不必在他们的头脑中仿真运行代码的执行过程.
7.2 编程原则:
1. 用文字说明代码的作用:
简单的重复代码做写什么,这样的注释几乎不能给注释增加什么信息.如果你使用好的命名方法来创建直观明了的代码那么这些类型的注释绝对增加不了什么信息.
2. 如果你想违背好的编程原则,请说明为什么
有的时候你可能需要违背好的编程原则,或者使用了某些不正规的方法,.遇到这种情况时,请用内部注释来说明你在做什么和为什么要这样做。
技巧性特别高的代码段,一定要加详细的注释,不要让其他开发人员花很长时间来研究一个高技巧但不易理解的程序段。
3. 用注释来说明何时可能出错和为什么出错
4. 在编写代码前进行注释
给代码加注释的方法之一是在编写一个过程前首先写上注释.如果你愿意,可以编写完整句子的注释或伪代码.一旦你用注释对代码进行了概述,就可以在注释之间编写代码.
5. 在要注释的代码前书写注释
注释一定出现在要注释的程序段前,不要在某段程序后书写对这段程序的注释,先看到注释对程序的理解会有一定帮助。
如果有可能,请在注释行与上面代码间加一空行。
6. 纯色字符注释行只用于主要注释
注释中要分隔时,请使用一行空注释行来完成,不要使用纯色字符,以保持版面的整洁、清晰。
7. 避免形成注释框
用星号围成的注释框,右边的星号看起来很好,但它们给注释增加了任何信息吗?实际上这会给编写或编辑注释的人增加许多工作。
8. 使用撇号来指明注释
不要使用Rem语句来注释。
9. 增强注释的可读性
注释是供人阅读的,而不是让计算机阅读的。
1) 使用完整的语句。虽然不必将注释分成段落(最好也不要分成段落),但你应尽量将注释写成完整的句子。
2) 避免使用缩写。缩写常使注释更难阅读,人们常用不同的方法对相同的单词进行缩写,这会造成许多混乱,如果必须对词汇缩写,必须做到统一。
3) 将整个单词大写,以突出它们的重要性。若要使人们注意注释中的一个或多个单词,请全部使用大写字母。
10. 对注释进行缩进,使之与后随的语句对齐。
注释通常位于它们要说明的代码的前面。为了从视觉上突出注释与它的代码之间的关系,请将注释缩进,使之与代码处于同一个层次上。
11. 为每个过程赋予一个注释标头
每个过程都应有一个注释标头。过程的注释标头可包含多个文字项,比如输入参数、返回值、原始作者、最后编辑该过程的程序员、上次修改日期、版权信息。
12. 当行尾注释用在上面这种代码段结构中时,它们会使代码更难阅读。
使用多个行尾注释时(比如用于过程顶部的多个变量说明),应使它们互相对齐。这可使它们稍容易阅读一些。
13. 何时书写注释
1) 请在每个If语句的前面加上注释。
2) 在每个Select Case语句的前面加上注释。与If语句一样,Select Case语句用于评估对程序执行产生影响的表达式。
3) 在每个循环(包括For…Next循环和Do循环)的前面加上注释。每个循环都有它的作用,许多情况下这个作用不清楚直观。
4) 在修改了全局变量的每个语句前面加上注释。全局变量很讨厌。但如果非常需要使用全局变量,请说明你为何要修改它。这将使代码的调试容易一些。
8. 循环结构
1. 循环结束后不要引用计数器变量。当For…Next循环结束时,计数器变量的最后值不等于end的值,它大于或小于Step的值。
2. 所有Next语句均应包含计数器变量。如果你在Next语句中省略了计数器变量,代码仍可执行,但它的可读性要差一些,因此更难维护.
3. 为了清楚起见,应对For…Next循环中的代码主体语句进行缩进。每当你的代码结构拥有一个开始语句和结束语句时,就必须对代码主体语句进行缩进。
4. 如果你必须提早退出For…Next循环,请使用Exit For语句。不要使用GoTo和一个标注来退出循环。
5. 请在循环的开始处计Do循环的退出条件。你常可选择究竟在循环的开始处还是结尾处放置退出条件。但在循环的开始处计算退出条件,这样的循环比较容易理解。
6. 当你在While和Until之间进行选择时,请使用能实现最简单的条件的这个关键字。
7. 为了保持代码见格的一致性,尽可能使用While子句来完成Do.Loop循环。
9. 控制代码流
9.1 控制代码流的目的:
1) 在规定的情况下使用正确的判断构造;
2) 降低代码的复杂性,使之更容易阅读和调试;
3) 最大限度的减少表达式计算中出错的机会。
9.2 编程原则:
1. 当根据一个条件是True还是False来做出判断时,使用If…Then…Else
即使只有一个语句被执行,也应考虑使用End If构造。当condition的计算结果是True时,如果只有一个语句被执行,该语句可以与If放在同一行上,并且End If可以省略。但若要使代码更便于阅读,请将该语句单独放在一行上,并以End If作为该构造的结束。
2. 对非布尔表达式与各种可能的值进行比较时,使用Select Case语句.
Select Case可以用许多高档次的方式来使用,比如将多个结果值放在一个Case行上。
这些条件互相之间可能毫不相关。这与Select Case结构完全相反。在Select Case结构中,通过对一个(通常是非布尔)测试表达式与Case语句中的每个表达式进行比较,从而构成了各个条件。
1) 即使不需要,也应在每个Select Case构造中包含Case Else语句。如果始终都加上Case Else子句,代码将更加清楚明了,就不会迫使其他编程人员去猜测为什么要处理Case语句中的没有特殊理由的结果。
2) 所有Case语句都应使用便于理解的顺序。
不能出现条件范围大的Case子句出现在前面情况。
如:Select Case lngAge
Case is <17
Case is <13
...
End Select
这样的结构导致第二个Case子句不能被执行,从而产生逻辑上的错误。
3) 不要编写决不会产生True结果的Case语句。
3. 对表达式进行格式化
对表达式进行正确的格式化可以减少代码出错的可能性,增加代码的可读性。
1) 要将布尔表达式与True或False相比较。
如:
错误:If rsEmployees.Eof = True then
正确:If rsEmployees.Eof then
布尔表达式与True或False相比较在Select Case 子句中更容易产生错误。
2) 建的布尔变量名应反映肯定的条件而不是否定的条件。使过程变得过分复杂的一个典型例子是创建一个反映否定条件的布尔变量名。根据这种变量进行判断,就会使代码变得更加复杂。代码就增加了出错的可能性。
3) 了清楚起见,用括号将表达式括起来。即使不要求,也要使用括号。不要书写复杂的依靠运算符优先级来执行的表达式,在必要的位置使用括号强调其运算优先级。
4) oTo标识全部使用大写字母。GoTo语句使得代码很难阅读。通过将GoTo标识全部使用大写字母,就可以减少查找过程的GoTo标识所需的工作量。
10. 创建对象和工程模板
如果要创建许多个项目,那么通过创建和使用对象和项目模板,就可以节省大量的开发时间,并增强应用程序的一致性。
10.1 使用对象模板
例如,假设创建了一个窗体对象,并希望在每次从Project菜单中选择Add Form(添加窗体)时使该窗体对象出现在Add Form对话框中,只需将窗体文件的拷贝放入Template文件夹的Forms子文件夹中。如果窗体拥有一个与其相关联的二进制文件(即.frx文件),该文件也必须放入Forms子文件夹中。若不希望对象出现在模板中,就从Template文件夹的相应子文件夹中删除或移走该对象的文件。
当模板对象被添加给一个项目时,便创建该对象的一个新实例,对该对象所作的修改并不传给模板本身。
10.2 设置模板文件夹
将项目中的所有对象模板放入这个自定义模板文件夹中,并让所有开发人员将新文件夹的路径输入他们的Template Directory文本框。
10.3 使用对象和项目模板的目的:
1) 代码的复用
2) 缩短新项目和现有项目的开发时间
10.4 编程原则:
1) 不要将对象模板中的特定应用程序的值或特定组件的值进行硬编码。
对象模板应该尽可能做到通用。
注意:在对象模板中用常量取代硬编码的“幻数”,这个问题很重要,这样开发人员就能更容易理解和替换各个值。
2) 不要将对象模板中的路径进行硬编码。不同的应用程序和不同的安装,其路径也不一样。就象不应该对任何对象中的路径进行硬编码一样,也不应该将对象模板中的路径进行硬编码。
3) 不要将对象模板中的应用程序进行硬编码。
4) 不要将对象模板中的版本号进行硬编码。
5) 展示模板对象的属性,以便接受来自主应用程序的数据。不要展示公用变量或使用全局变量,而应该使用Property 过程。如果使用Property过程,那么当值变更时,就能进行数据验证并执行代码。
10.5 在对象模板中提供内容广泛的注释。
将模板对象添加给项目时,不对它进行修改,这种情况是很少的。应该尽可能使开发人员将模板对象添加给项目时能够非常容易得了解必须在何处进行哪些修改,才能将对象与项目集成起来。要做到这一点的方法之一是使用统一的方法来加上注释,以便说明所做的必要修改,并将这个说明记录在程序模块的Declaration(说明)部分中。这样,开发人员就能非常容易的搜索注释,并进行必要的修改。