1Delphi源程序代码规范V1.0鼎创公司2005-8-132I.总则1.1目的为了对程序员的开发进行适当的规范化,特制定本规范。其根本目的,是为了保证程序具有良好的、一致的结构,以期提高程序的可读性及可维护性,方便程序的测试、维护、升级等工作,同时,也培养程序员书写代码的规范性。1.2原则名称反映含义,形式反映结构;1.3申明本规范适用于采用DELPHI作开发工具的公司所有项目,程序员应严格按照本规范编写代码,如项目有确实需要的特殊要求,也必须经项目经理审核后,把该特殊要求形成文档当作本文档的随附文件一起保存。1.4文档编写:XXX2001年6月23日第一次修改:XXX2001年7月7日第二次修改:XXX2001年9月28日II.代码规范2.1项目规范2.1.1.每一个项目的代码、文档按模块、功能必须在项目文件夹中有条理的归类存放,每个项目文件夹中均必须包含以下子文件夹:Code:源代码目录Sql:数据库脚本目录Demodata:演示数据目录Userdata:用户数据目录Help:帮助文档目录Install:安装文件目录Document:文档目录Picture:图片目录templates:报表模板目录子文件夹下也必须依照详细的用途分类建立子目录。详细的示例如下:示例:ProjectName|codesqldemodataPicturehelpinstalldocumenttemplates||appserverclient||测试文档设计文档数据字典需求分析用户文档module1module2module3……32.1.2.每个项目的主目录下均必须有一个项目说明文件,说明该项目的一些概要性提示和相关规范。2.1.3.在项目文件夹下的每层每个子目录中必须有一个文件夹说明文件,说明该层文件夹及其子文件夹的分类方法和含义。任何时候,新增一个文件夹时,均必须在同层目录下的文件夹说明文件中添加所新增文件夹的分类含义,同时创建该文件夹下的文件夹说明文件。2.1.4.工程文件代码规范:A.任何一个工程文件(包括动态链接库工程文件)的第一部分必须用注释的形式说明项目名称、公司版权、工程描述、版本说明、创建日期、作者以及后续更新人员。B.除主模块、公共函数模块和公共数据模块外,所有该项目下的单元不可由项目自动创建(CREATE),在加入新单元后,必须在工程文件中删除自动CREATE的语句。C.工程文件的其余代码遵行本文档约定的单元规范及其它代码规范;2.2单元总体规范2.2.1每个单元的第一部分必须用注释的形式说明项目名称、公司版权;2.2.2必须紧接在单元名之后以注释的形式说明项目名称、模块名称、模块描述、模块版本、创建日期、作者、更新人以及TODO列表;2.2.3在INTERFACE部分USE的单元原则上只允许DELPHI的IDE自动添加,如确需自己添加必须在引用到的单元名后用{}注释添加原因。用于编译开关控制的伪指令插入在USES之前。2.2.4Interface部分应当只包含需要被外部单元访问的类型、变量、过程和函数的声明,而且这些声明应当在Implementation部分之前。2.2.5Implementation部分包含本单元私有的类型、变量、过程和函数的声明。2.2.6除非确实需要,不要在Initialization部分写过多代码,如有代码应详细注释说明必须写在Initialization部分的原因。2.2.7在Finalization部分释放所有在Initialization部分中分配的资源。2.2.8除主FORM外,每个FORM单元都应当含有实例化函数(入口函数),用于创建、设置、显示和释放FORM。FORM的变量应当从单元中移走,改在实例化函数中作为局部变量定义(要先从ProjectOptions对话框的自动生成列表中移走该FORM)。(参见2.1.4.B)2.2.9总体风格4缩进规则:每级间保持两个空格。不要将Tab符号存储到源文件中,原因是Tab字符在不同的源代码管理中宽度会有不同的定义。在Tools|EditorOptions的General页不要选中SetTabCharacter和OptimalFill复选框,制表符Tab即不会被保存。边距页宽:边距应保持默认设置的80个字符,只要可能,长度超过一行的语句必须用逗号或运算符换行。换行后,应缩进两个字符。注释规则:只有在一行的行末注释时才用//,否则均必须使用{}来注释。空行使用:需使用空行的地方有:版权块、类之间、方法过程函数之间、方法内部算法分段。空行只能用一行,多余的空行必须删除。Begin…End:任何情况下,Begin和End均必须各自独占一行。End总和对应的Begin左对齐。工具使用:所有单元提交给版本控制工具之前必须用SourceCodeFormatter格式化过。示例:{*******************************************************}{}{项目名称}{}{版权所有(C)2000,2001公司名称}{}{*******************************************************}unitUnitName;{*******************************************************项目:模块:描述:版本:日期:作者:更新:TODO:*******************************************************}interface{$IIS.inc}uses----,----,----,----,----,----,----,----,----,----,----,----;const--------------------;type5--------------------;var--------------------;implementationuses----,----,----,----;{$R*.RES}{$R*.DFM}--------------------------------;--------------------------------;--------------------------------;end.2.3单元内部规范2.3.1常量区:A,所有常量的第一个前缀必须为C,常量必须分主题归类定义,如有多个主题,每一个主题必须加一个主题前缀。前缀与前缀之间、前缀与名称之间用_分割。B,每个常量的定义单独一行,在同一行上,必须用//加注释说明该常量的含义。C,按主题归类的常量,在每个主题开始的第一行必须用{}注释主题含义。D,示例:Const{主题1}C_主题前缀1_---=----;//含义C_主题前缀1_---=----;//含义C_主题前缀1_---=----;//含义C_主题前缀1_---=----;//含义{主题2}C_主题前缀2_---=----;//含义C_主题前缀2_---=----;//含义C_主题前缀2_---=----;//含义C_主题前缀2_---=----;//含义2.3.2类型区:A,不提供服务的数据类型定义格式为:T----=---------//类型含义6B,有状态并提供服务的数据类型定义格式为:T----=class(----)//类型含义private--------protected--------public--------published--------end;C,原则上,数据类型及其内部方法、属性、数据定义时应按字母顺序排列。属性的读写方法分别以Get和Set为前缀命名。D,内部数据、属性、方法定义规则:D1,Private区1、所有数据放在Private区,以F打头。2、所有事件属性对应的方法指针放在Private区,以F打头。3、不准备被继承的属性的Get与Set方法放在Private区。4、响应消息的方法放在Private区。D2,Protected区1、被子类调用的但不能被外界调用的方法与属性。2、供子类重载的方法virtual;abstract。D3,Public区1、构建析构方法2、供外界调用的方法3、供外界调用的属性D4,Published区1、出现在ObjectInspector里供设计时用的属性2、出现在ObjectInspector里供设计时用的事件响应E,特殊的数据应在定义一行的行末用//注释其含义。特殊的属性、方法应在定义前一行用{}注释其含义。事件指针的定义不需注释,但事件类型定义时必须在其前一行用{}注释其含义。2.3.3变量区A,在变量区定义单元的全局变量。B,每个需要注释的变量单独一行,在行末用//注释其含义。C,同一类型且含义逻辑上不并列的变量分开定义,同一类型且含义逻辑上并列的变量在一起定义。D,一般不鼓励使用全局变量。在确实需要使用全局变量的时候,必须把全局变量限制在需要的环境内,如:一个全局变量可能只在单元的Implementation部分是全局的,所以必须把其定义在该部分内。被多个单元使用的全局数据应该被移入一个公共模块中。E,全局变量可以在定义时直接初始化为某一个值。注意:所有的全局变量将自动进行零初始化,所以,不要将全局变量初始化为空值,如0,nil,'',7Unassigned。零初始化的全局变量在可执行文件中不占用空间,非零初始化的全局变量则在可执行文件中占空间。F,变量的命名规则参见本文档后面的命名规则项。2.3.4实现区A,事件、过程、函数应按主题分类归集在一起,每个主题开始的第一行用{}注释该类主题。约定归类方法如下:同一个元件的事件应归集在一起,被事件调用或与之相关系的函数或过程应紧跟在该事件之后,函数、过程、方法之间如存在调用关系也应归集在一起,除非该函数、过程被多处调用。被多处调用的单元内部函数、过程应归集在单元的公共过程主题内。可以自定义归类方法,比如按实现功能归类,但如归类方法不同于本约定的,应在所有主题之前用{}注释说明归类方法。B,每一个事件、方法必须在其代码前用{}注释说明名称、描述、参数含义、创建时间、作者、更新人、更新时间。在事件、方法内部不同含义的算法或不同主题的代码间空一行,每段算法或主题的开始用{}注释算法或主题的目的。关键性的算法行应在行末用//注释算法目的。事件、方法内部的变量定义时必须遵行2.3.3约定的变量区规范。C,SQL语句书写规则:在SQL语句中,所有SQL保留字统一用大写,所有字段名以及数据表名全部用小写,SELECT,FROM,WHERE,ORDERBY顶格起行,各子句中要求每个字段或每个条件或每个关联单独起行,并缩进对齐,缩进两格。示例如下:strMasterSql:='SELECTpreload.*,'+'codelib.codenamevesselname'+'blstatus=CASEblstatusidWHEN“1”THEN“订舱”'+'WHEN“2”THEN“配航线”'+'ELSE“其他”'+'END;'+'FROMpreload'+'LEFTJOINcodelib'+'ONcodelib.codecd=preload.vesselcd'+'ANDcodelib.classid=03';strMasterFilter:='WHEREpreload.companycd=:companycd'+'ANDpreload.idno=:idno';strMasterOrder:='ORDERBYpreloadno';注意:CASE...WHEN...THEN...ELSE...END等SQL语句的关键字用大写。D,代码中用到数据库字段名称的地方,统一用小写。E,元件本身的属性、事件名,要按照DELPHI自动提示的格式写。2.4ObjectPascal语法约定2.4.1语法杂项:A,运算符前后要有各一个空格。8B,在开始圆括号和后一个字符,以及结束圆括号和上一个字符中不出现空格。不要在语句中出现不必要的括号。如if(