程序设计规范(Delphi)1. 概述:1.1. 编写目的本规范规定了YUNTONG-TECH程序在编写过程中涉及到的程序文件和编码风格本规范以 Delphi 语言为标准制定,使用其它编程语言的编码风格和规范在相关的文档中规定1.2. 参考资料(1)程序员指南,Microsoft Press(2)Windows界面应用程序设计指南,Microsoft Press(3)Delphi 5 开发人员指南,机械工业出版社(4)程序设计规范VB,聂俊华,北航十四系2. 程序文件1.1. 项目文件的组织在Delphi中,按照项目为单位来组织程序文件在一个典型的项目中包括:(1)项目文件(.DRP文件)含有工程主程序的Pascal源代码;(2)单元文件(.PAS文件)项目中每个窗体的Pascal源文件,包含该窗体的所有声明和过程(包括时间处理过程);(3)窗体文件(.DFM文件)含有一个窗体的设计属性的二进制文件,每个窗体的.DFM文件与.PAS文件相互对应;(4)资源文件(.RES文件)编译的二进制资源文件,被链接到应用程序的可执行文件中;(5)项目选项文件(.DOF文件)存储了Project|Options菜单命令所设置的项目选项;(6)桌面设置文件(.DSK文件)存储了Tools|Options菜单命令所设置的桌面选项;(7)包文件(.DPK/.BPL文件)用于共享组件、类、数据和代码的文件。
源文件为.DPK文件,编译后为.BPL文件;每个软件项目应使用独立的目录,软件项目下的不同类别文件、不同模块分设子目录以下给出软件项目及软件模块中,设置子目录名称的规范:子目录 说明\Bin 建立产品的工作目录,存放项目中所有可执行文件的当前版本 \Lib 与项目有关的库文件 \Man 包括项目的所有外部文档包括手册、帮助文件、其他文档、README文件以及其他将和产品一起发放到用户手中的文档\SQL 存放数据库的SQL文件(只针对数据库程序的开发) \Res 包括应用程序的所有共享资源,如ICON(图表)、资源文件、Bitmap等 \Include 公用的窗体或Unit \Control 存放项目内用的自编或第三方提供的控件\Source 程序源代码\Public 可以公用的模块或程序 本规范在以下的各小节中具体说明Delphi 两种文件类型.PAS和.DFM在程序文件中的相关内容要求1.2. 常量定义内容:l 逻辑值的定义;l 常数值的定义;l 错误码的定义;格式:一个定义占一行如下:Const <常量> : 类型 = 值; //注释说明:使用 Const 语句来声明用于代替文字值的常数。
示例:Const C_SQL:string='select CH_USERER_ID from T_CD_USER'; //查询用户ID Const C_PI:real =3.1415926; //圆周率1.3. 结构类型定义内容:结构类型定义格式:Type <类型名> //结构说明注释<变量名1> : 变量类型; //变量说明注释<变量名2> : 变量类型; //变量说明注释…End ;说明:<类型名>是以大写字母开头的字符串结构定义中定义变量类型的语句从第二行第五列开始示例:type TableList=record //系统树单元类型定义InID : integer; //单元编号Name : string; //单元名称PID : string; //上一级单元名称PT : PTableList; //指向下一单元类型的指针end;3. 程序风格程序风格规定了每个语句的定位规则及程序中的注释1.1. 函数(Function)/过程(Procedure)风格Name (变量 :变量类型[,…]); //函数/过程说明Var变量1:变量类型;//变量说明变量2:变量类型;//变量说明…Begin语句;语句;…End ;注: 变量声明、语句均从第三列写起,如有缩进,每次缩进两列,并与相对应语句对齐。
1.2. 语句风格说明:l 在程序体中通常最多每十行有一个段落功能说明;l 规范使用各种语句;l 语句中有缩进是以二列为单位1.2.1. 变量定义语句Var var_name : <数据类型>;1.2.2. 赋值语句var_name: = <表达式>;1.2.3. 条件语句If 条件 Then //注释Begin语句;…End;ElseIf 条件 Then //注释Begin语句;...EndElse //注释语句;注:如果执行语句只有一句,可省略Begin、End语句1.2.4. 循环语句l //循环功能注释For counter: = start To end DoBegin[语句];…End;l //循环功能注释While [condition] DoBegin[语句];…End;l //循环功能注释Repeat[语句];….Until [condition]1.2.5. 开关语句//开关功能说明Case <表达示> Of <值1>:[语句1];<值2>:[语句2];…<值n>: [语句n]End;1.3. 注释行在程序代码单元文件顶端必须拥有本单元文件“模块说明”及“单元说明”注释。
对于常量、结构类型、函数/过程、自定义变量、代码段功能块、关键语句等有含义的代码部分,必须有注释行进行详细说明注释行可在需说明部分行后以“//XXXXXXXX”方式添加,也可在需说明部分行上以“{XXXXXXXXXX}”方式添加多行或以“//XXXXXX”方式添加一行4. 变量名命名规则命名包括对程序中文件、变量(包括控件等对象)、常量、过程和函数等程序对象的命名本公司命名以匈牙利规则为参考,采用“限制 + 类型 + 名称”的命名方式l 限制是指变量与常量的区分和对作用域的确定,默认为变量和局部对象对于常量要特指出,对于非局部变量,要表明其使用范围,如全局或模块级l 类型以缩写表明该程序对象的类型,如32位有符号整数类型和列表框控件类型l 名称为对象的具体含义,要准确表达其用途,而不要使用与变量所代表的实体没有任何系的名字,以英文、英文缩写组合给出;名称的书写采用大小写结合的方式,如CaseCount表示事件计数、DeleteUser表示删除人员等命名不宜过短,也不宜过长,除去限制和类型外,以8~15为好过短的命名往往不能准确描述用意,如nCount命名含义太不明确,可以是雇员的计数,也可以是找到的文件的计数,而命名为nEmployeeCount和nFileCount将更有助于记忆和理解;过长的命名如recLoginUserInformation又显得冗长,改为recLoginUserInfor或recLoginUserInfo则会在不损失含义的情况下减少输入量,换言之,改动后的命名更合适。
命名中恰当使用反意词,可以提高可读性,下面是一些常用的容易理解的词对:Add/Remove Begin/End Create/DestroyInsert/Delete First/Last Get/ReleaseGet/Set Get/Put Increment/DecrementLock/Unlock Min/Max Next/PreviousNext/Prior Old/New Open/CloseShow/Hide Source/Destination Source/TargetStart/Stop Write/Read 记住一些常见布尔型变量的命名,对规范化的实施也会有不少帮助,如Done、Error、Found、Success、Ready等命名中的特例之一是单层循环的循环变量,使用i、j、k、l、m命名,简捷明快;当循环为多层时,各层的循环变量应尽可能命以有意义的名称,以避免使用时由于输入而产生的逻辑错误,尤其是在访问多维数组变量时,这种作法可以大大减少因数组下标指定失误引发的程序逻辑失败的机率,如将Cells[ i, j ]误作Cells[ j, i ],而Cells[ nRow, nCol ]就不易误为Cells[ nCol, nRow ]。
以下定义Delphi 中的变量命名规则:1.1. 变量命名1.1.1. 简单变量命名类型 缩写 含义Boolean b Boolean变量ByteBool bb Boolean Byte变量WordBool bw Boolean Word变量LongBool bl Boolean Long变量Integer n Number变量ShortInt nt Number Tiny变量SmallInt ns Number Short变量LongInt nl Number Long变量Int64 ne Number Extended变量Comp ne Number Extended变量Byte unt Unsigned Number Tiny变量Word uns Unsigned Number Short变量LongWord unl Unsigned Number Long变量Real f Float变量Single fs Float Single变量Double fd Float Double变量Extended fe Float Extended变量Char c Char变量AnsiChar ca Char Ansi变量WideChar cw Char Wide变量String s String变量ShortString ss String Short变量AnsiString sa String Ansi变量WideString sw String Wide变量Variant v Variant变量Enumerate e Enumerate变量Pointer p Pointer变量1.1.2. 结构型变量命名类型 缩写 含义Array a ArraySet m MassRecord r RecordClass o Object1.1.3. 复合变量命名命名中有些缩写词是基础类型缩写,而另有一些是类型限定词,如u代表Unsigned和a代表Array。
整体缩写采用从右至左的分析方式,举例如下:l Boolean数组命名为abXXXXl 单精度附点数数组命名为afsXXXXl 结构数组命名为arXXXXl 枚举数组命名为aeXXXXl 指针数组命名为apXXXXl 字符集合命名为mcXXXXl 32位整数集合数组命名为amnXXXXl 结构指针命名为prXXXXl PChar命名为pszXXXXl PChar数组命名为apszXXXX1.1.4. 命名中限制的法则l 全局冠以g_l 模块级冠以m_l 常量以C_开始l 全局常量以gC_开头,模块级常量则mC_1.1.5. 其它命名l 类型的命名采用Delphi通用的TXxxxYyyyZzzz形式l 枚举型变量的元素命名为以小写的类型英文名字母缩写开始,如TFontStyle = ( fsBold, fsItali。