第一条:什么是编程规范:所谓编程规范即是千百万有经验的程序员经历长期教训后,极少数的一些人通过总结和反思而养成的信条和习惯。这一规范可给你:高效率地编程、高质量的代码、高奖金的回报。
第一章 项目管理
(善于鼓舞人心的领导,应能乐观看待一切,把失败当作是学习经验,则会有新的重大的突破。)
第二条:项目的管理由项目主管(经理)、技术主管(经理)、产品主管(经理)分工合作,共同管理。
项目主管(经理)必须由最有经验的程序员担任,职责是管理代码的规范性,程序编码进度。
技术主管(经理)也必须由有最有经验的程序员担任,技术主管必须了解当前市场最新技术。职责是代码实现技术,解决开发疑难,以及设计文档与实际开发的一致性维护与细化和程序抟量控制。
产品主管(经理)必须了解市场需求,管理需求文档的建立和软件的测试。
第二章 程序质量控制:
第三条:质量标准:程序应具备可移植性,是空间及速度上达最大优化。同时,对于程序可能的出错,必须要有相应的错误捕获。具体质量参数如下:
1, 空间,如果不是持殊要求,程序应当尽可能少用空间。
2, 速度,程序应当是能在最优化的即最快的速度运行。
3, 鲁棒性,不会应任何误操作(包括非法数值)使程序崩溃。
4, 安全性,对于有用户数据,或网络程序,应当保证其数据或网络的安全。
5, 可测试性,产品应有测试版(BETA版),能生成测试报告。
6, 可维护性,详细的注解,且程序应当具有面向对象的构件及模快。并且遵守对象与变量的命名规范。
7, 简单,易操作,易使用。
8, 可复用性,构件能用于其它产品中。
9, 可移植性。易于转换到不同的操作系统中。
第四条:界面要求:程序应具有以下友好的界面:1,操作简便,2,外观漂亮。
第五条:质量控制原则:
1, 任何程序在编程或制作前应有详细设计文档,保证有了方案后再写代码。
2, 必须利用面向对象的原则将项目细分,使其构件化,并将构件作为小的项目看待。
3 , 不得使用长于两个月周期的项目。应何产品,都应当有长度约为一周的短期目标。每一目标应当是可以运行且能够看到结果的目标。
4, 如果要实现某一功能,则一定要使其完善,即,送给用户"夹生的",不如只给用户"做熟的"。
5, 时刻应当注意,产品是一个整体,即只要有任一构件不足,则会毁了本产品。
6, 国际化:任何产品,不可将文字写在图片上,应只使用无文字的图片,界面文字,如能保存在资源文件中,则必须使用资源文件。保证产品易于国际化。
第五条:质量控制原则:
1, 任何程序在编程或制作前应有详细设计文档,保证有了方案后再写代码。
2, 必须利用面向对象的原则将项目细分,使其构件化,并将构件作为小的项目看待。
3 , 不得使用长于两个月周期的项目。应何产品,都应当有长度约为一周的短期目标。每一目标应当是可以运行且能够看到结果的目标。
4, 如果要实现某一功能,则一定要使其完善,即,送给用户"夹生的",不如只给用户"做熟的"。
5, 时刻应当注意,产品是一个整体,即只要有任一构件不足,则会毁了本产品。
6, 国际化:任何产品,不可将文字写在图片上,应只使用无文字的图片,界面文字,如能保存在资源文件中,则必须使用资源文件。保证产品易于国际化。
第六条:编程时的质量保证:
1, 程序员应从写代码时就开始查错。
2, 从写代码时就应保证代码(构件)可共享(可复用)。即开始编程时,就考虑,这一构件是否有可能用于今后的其它产品中,如果是,则应做成可复用性的构件,使其能共享。
3, 任何程序员都应当独立工作,公司按程序员的实际工作量付薪酬,而不是按工作时间付薪酬。因而,程序员应当严格遵守编程规范,以保证效率。
4, 保证无错代码:
如果遵守以下原则,则无错代码是可能的:
(1) 在用法不确定时,查看帮助。
(2) 编译通过时,应作边界值查错。
(3) 对于有警告选项的开发工具(如:VC),应当打开编译器警告开关。
(4) 数据库操作时,应当加入错误捕获。
(5) 动用编程时,应先理顺思路。(好的思路可能使代码更少,且效率更高)
(6) 当一个逻辑单元的程序写好时,及时加上详细的注解,写明逻辑流程。
(7) 动手编程时,应当考虑,该设计的实现手段易出错的程度如何?如果易出错,则应当找出更好的不易出错的手段再开始写程序。
(8) 微软在VB中的原则:
可用几个方法避免在应用程序中产生错误:
写出相关事件以及代码响应每个事件的方法,精心设计应用程序。为每个事件过程和每个普通过程都指定一个特定、明确的目标。
多加注释。如果用注释说明每个过程的目的,那么,在回过头来分析代码时,就能更深入理解这些代码。
尽可能显式引用对象。要象对象浏览器中所列举对象那样声明对象,而不用 Variant 或一般的 Object 数据类型。
在应用程序中对变量和对象提出一种前后一致的命名方案。更详细的信息,请参阅"编程约定"。
造成错误的一个最普通的原因就是键入了不正确的变量名,或把一个控件与另一个控件搞混了。可用 Option Explicit 避免变量名的拼写错误。 关于要求显式变量声明的详细信息,请参阅"编程基础"中的"变量、常量和数据类型概述"。
第七条:查错原则:
1, 在编程时,当程序发现错误,应当立即改错。现在就改,以避免程序完成时遗漏未改的错误。
2, 发现错误时,应当找出从错误的源头再修改。(对此,应当摒弃"工作量太大了"的思想)
3, 当代码有错时,绝不可以猜测错在哪里。试图碰运气改正它。必须停下来思考已发现的错误,从而判断是否别的地方有相关的错误还没有暴露出来。思考如何更易发现错误,如何避免此类错误。
第三章 技术会议
第八条:技术会议应遵守下列原则:
1, 不可分割工作时间,即:唯有周一早上或周五下午才是最佳时间。
2, 会议要有目的,即能通过会议作出决定时或确有重要信息传达时才开技术会议。
3, 会议最终一定要落实最终目标,具体实现用各人的具体任务。
4, 会议只对将来,故总结也为了将来,因而绝不可以有冗长的总结。
5, 会议一定要有详细的会议记录,以备查实际落实情况。
6, 应当遵守"不要带来问题,应当带来解决方案"的原则。不可将问题留到下一次会议。
7, 一个良好且具体的解决方案应明确:问题,详细方案,负责人与最后期限。
第四章 编码约定
第九条:为什么要进行编码约定?
使用统一编码约定集的主要原因,是使应用程序的结构和编码风格标准化,以便于阅读和理解这段编码。
好的编码约定可使源代码严谨、可读性强且意义清楚,与其它语言约定相一致,并且尽可能的直观。
最小编码约定:一组通用目的的编码约定应该定义完成上述目的所必需的、能让程序员自由地创建程序逻辑和功能流程的最小的要求。最小编码约定的目的是使程序易于阅读和理解,而不是用过份的约束和绝对的限制来束缚程序员本身的创造性。
所以,该附录中提出的约定是简洁和建意性的。这些约定中没列出每一个可能的对象或控件,也没列出每种有用的信息注释。根据工程及机构的特殊要求,也许希望扩充这些准则,以包含附加的元素,如:对于在家庭中开发的或从第三方厂商购买的特定对象及组件的约定、描述机构的商业活动或设备的变量、工程或企业认为对清楚性和可读性很重要的任何其它元素。
第十条:以下内容以VB为蓝本,任一开发工具均以此为参考。
第十一条:对象命名约定
应该用一致的前缀来命名对象,使人们容易识别对象的类型。下面列出了一些推荐使用的对象约定。
第十一条:对象命名约定
应该用一致的前缀来命名对象,使人们容易识别对象的类型。下面列出了一些推荐使用的对象约定。
第十二条:常量和变量命名约定
除了对象之外,常量和变量也需要良好格式的命名约定。
变量应该总是被定义在尽可能小的范围内。全局 (Public) 变量可以导致极其复杂的状态机构,并且使一个应用程序的逻辑非常难于理解。全局变量也使代码的重用和维护更加困难。所以,全局变量,在一个产品中应当不多于10 个。
在应用程序中,只有当没有其它方便途径在窗体之间共享数据时才使用全局变量。当必须使用全局变量时,在一个单一模块中声明它们,并按功能分组。给这个模块取一个有意义的名称,以指明它的作用,如 Public.bas。
较好的编码习惯是尽可能写模块化的代码。例如,如果应用程序显示一个对话框,就把要完成这一对话任务所需要的所有控件和代码放在单一的窗体中。这有助于将应用程序的代码组织在有用的组件中,并减小它运行时的开销。
除了全局变量(应该是不被传递的),过程和函数应该仅对传递给它们的对象操作。在过程中使用的全局变量应该在过程起始处的声明部分中标识出来。此外,应该用 ByVal 将参数传递给 Sub 过程及 function 过程,除非明显地需要改变已传递的参数值。
变量范围前缀:随着工程大小的增长,划分变量范围的工作也迅速增加。在类型前缀的前面放置单字母范围前缀标明了这种增长,但变量名的长度并没有增加很多。
如果一个变量在标准模块或窗体模块中被声明为 Public,那么该变量具有全局范围。如果一个变量在标准模块或窗体模块中被分别声明为 Private,那么该变量有模块级范围。
注意:一致性是卓有成效地使用这种技术的关键;Visual Basic 中的语法检查器不会捕捉以 "p." 开头的模块级变量。
常量:常量名的主体是大小写混合的,每个单词的首字母大写。尽管标准 Visual Basic 常量不包含数据类型和范围信息,但是象 i、s、g和 m 这样的前缀对于理解一个常量的值和范围还是很有用的。对于常量名,应遵循与变量相同的规则。例如:
mintUserListMax \'对用户列表的最大限制(整数值,本地到模块)
gstrNewLine \'新行字符(字符串,应用程序全局使用)
变量:声明所有的变量将会节省编程时间,因为键入操作引起的错误减少了(例如,究竟是 aUserNameTmp,还是sUserNameTmp,还是 sUserNameTemp)。在"选项"对话框的"编辑器"标签中,复选"要求变量声明"选项。OptionExplicit 语句要求在 Visual Basic 程序中声明所有的变量。
应该给变量加前缀来指明它们的数据类型。而且前缀可以被扩展,用来指明变量范围,特别是对大型程序。
描述变量和过程名:变量或过程名的主体应该使用大小写混合形式,并且应该足够长以描述它的作用。而且,函数名应该以一个动词起首,如 InitNameArray 或 CloseDialog。
对于频繁使用的或长的项,推荐使用标准缩略语以使名称的长度合理化。一般来说,超过 32 个字符的变量名在 VGA 显示器上读起来就困难了。
当使用缩略语时,要确保它们在整个应用程序中的一致性。在一个工程中,如果一会儿使用 Cnt, 一会儿使用 Count,将导致不必要的混淆。
用户定义的类型:在一项有许多用户定义类型的大工程中,常常有必要给每种类型一个它自己的三个字符的前缀。如果这些前缀是以 "u"开始的,那么当用一个用户定义类型来工作时,快速识别这些类型是很容易的。例如,ucli 可以被用来作为一个用户定义的客户类型变量的前缀。
第十三条:结构化编码约定
除了命名约定外,结构化编码约定,可以极大地改善代码的可读性,如代码注释和一致性缩进。
代码注释约定:所有的过程和函数都应该以描述这段过程的功能的一段简明注释开始(这段例程干什么)。这种描述不应该包括执行过程细节(它是怎么做的),因为这常常是随时间而变的,而且这种描述会导致不必要的注释维护工作,甚至更糟-成为错误的注释。代码本身和必要的嵌入注释将描述实现方法。
当参数的功能不明显且当过程希望参数在一个特定的范围内时,也应描述传递给过程的参数。被过程改变的函数返回值和全局变量,特别是通过引用参数的那些,也必须在每个过程的起始处描述它们。
过程头注释块应该包括下列节标题:
节标题 注释描述
目的 该过程完成什么(而不是怎么完成)
假设 列出每个外部变量、控件、打开文件或其它不明显元素
效果 列出每个被影响的外部变量、控件、或文件及其作用(只有当它不明显时)
输入 每一个可能不明显的参数。参数分别在单独的行上,并嵌入注释
返回 函数返回值的说明
记住下列几点:
每一个重要变量的声明应该包括一个嵌入注释,来描述该变量的使用。
变量、控件及过程的命名应该足够清楚,使得只有复杂的执行细节才需要嵌入注释。
.Bas 模块包含工程的 Visual Basic 一般常量声明,在其起始处,应该包括描述应用程序的综述,列举主要数据对象、过程、算法、对话、数据库及系统需求。有时,一段描述算法的伪码可能会有所帮助。
格式化代码:因为许多程序员仍然使用 VGA 显示器,所以在允许代码格式来反映逻辑结构和嵌套的同时,应尽可能地省屏幕空间。
下面列出几点:
标准的、基于制表位的嵌套块应该被缩进四个空格(缺省情况下)。
过程的功能综述注释应该缩进一个空格。跟在综述注释后面的最高级的语句应该缩进一个制表位,而每一个嵌套的块再缩进一个制表位。例如:
\'*****************************************************
\'目的: 在用户列表数组中找出
\' 一个指定用户的第一次出现位置。
\'输入:
\' strUserList(): 被搜索的用户列表。
\' strTargetUser: 要搜索的用户名。
\' 返回: 在rasUserList 数组中rsTargetUser
\' 的第一次出现的索引。
\' 如果目标用户没找到,返回-1。
\'*****************************************************
Function intFindUser (strUserList() As String, strTargetUser As _
String)As Integer
Dim i As Integer \' 循环计数器。
Dim blnFound As Integer \' 目标寻找标志。
intFindUser = -1
i = 0
While i <= Ubound(strUserList) and Not blnFound
If strUserList(i) = strTargetUser Then
blnFound = True
intFindUser = i
End If
Wend
End Function
给常量分组
变量和定义的常量应该按功能分组,而不是分散到单独区域或特定文件中。Visual Basic 一般常量应该在单一模块中分组,以将它们与应用程序特定的声明分开。
& 和 + 运算符
在连接字符串时总是使用 & 运算符,而当处理数值时常用 + 运算符。当在两个变体上操作时,用 + 运算符来连接可能会导致问题。例如:
vntVar1 = "10.01"
vntVar2 = 11
vntResult = vntVar1 + vntVar2 \'vntResult = 21.01
vntResult = vntVar1 & vntVar2 \'vntResult = 10.0111
为 MsgBox、InputBox 及 SQL 查询创建字符串
当产生长字符串时,使用下划线连接字符产生多行代码,这样便于阅读或调试字符串。当显示一个消息框(MsgBox) 或输入框 (InputBox),或产生一个 SQL 字符串时,这一技术特别有用。例如:
Dim Msg As String
Msg = "This is a paragraph that will be " _
& "in a message box. The text is" _
& " broken into several lines of code" _
& " in the source code, making it easier" _
& " for the programmer to read and debug."
MsgBox Msg
Dim QRY As String
QRY = "SELECT *" _
& " FROM Titles" _
& " WHERE [Year Published] > 1988"
TitlesQry.SQL = QRY
给常量分组
变量和定义的常量应该按功能分组,而不是分散到单独区域或特定文件中。Visual Basic 一般常量应该在单一模块中分组,以将它们与应用程序特定的声明分开。
& 和 + 运算符
在连接字符串时总是使用 & 运算符,而当处理数值时常用 + 运算符。当在两个变体上操作时,用 + 运算符来连接可能会导致问题。例如:
vntVar1 = "10.01"
vntVar2 = 11
vntResult = vntVar1 + vntVar2 \'vntResult = 21.01
vntResult = vntVar1 & vntVar2 \'vntResult = 10.0111
为 MsgBox、InputBox 及 SQL 查询创建字符串
当产生长字符串时,使用下划线连接字符产生多行代码,这样便于阅读或调试字符串。当显示一个消息框(MsgBox) 或输入框 (InputBox),或产生一个 SQL 字符串时,这一技术特别有用。例如:
Dim Msg As String
Msg = "This is a paragraph that will be " _
& "in a message box. The text is" _
& " broken into several lines of code" _
& " in the source code, making it easier" _
& " for the programmer to read and debug."
MsgBox Msg
Dim QRY As String
QRY = "SELECT *" _
& " FROM Titles" _
& " WHERE [Year Published] > 1988"
TitlesQry.SQL = QRY
第五章:程序验收
第五章:程序验收
第十四条:测试与验收:任何程序需经测试无错后,方能通过验收。
第十五条:程序测试应有详细的测试报告。 |