新Delphi编码规范.pdf
《新Delphi编码规范.pdf》由会员分享,可在线阅读,更多相关《新Delphi编码规范.pdf(31页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 Delphi 编码规范 Sandy 精选 目 录 Delphi 编码规范.-1-一、序言.-1-二、通用源代码格式规则.-1-2.1 缩格.-1-2.2 页边空格.-1-2.3 BeginEnd 配对.-1-三、Object Pascal.-2-3.1 括号.-2-3.2 保留字和关键字.-2-3.3 过程和函数.-3-3.3.1 命名/格式化.-3-3.3.2 形式参数.-3-3.4 变量.-4-3.4.1 变量的命名和格式.-4-3.4.2 局部变量.-5-3.4.3 全局变量的使用.-5-3.5 类型.-5-3.5.1 大写约定.-5-3.5.2 结构类型.-6-3.6 语句.-7-3
2、.6.1 if 语句.-7-3.6.2 case 语句.-7-3.6.3 while 语句.-8-3.6.4 for 语句.-8-3.6.5 repeat 语句.-8-3.6.6 with 语句.-8-3.7 结构异常处理.-8-3.7.1 一般话题.-8-3.7.2 tryfinally 的使用.-9-3.7.3 tryexcept 的使用.-10-3.7.4 tryexceptelse 的使用.-10-3.8 类.-10-3.8.1 命名和格式.-10-3.8.2 域.-10-3.8.4 属性.-12-四、文件.-12-4.1 工程文件.-12-4.1.1 命名.-12-4.2 窗体文件.
3、-12-4.2.1 命名.-12-4.3 数据模板文件.-12-4.3.1 命名.-12-精选 4.4 远端数据模板文件.-13-4.4.1 命名.-13-4.5 Unit 文件.-13-4.5.1 通用 Unit 结构.-13-4.5.3 数据模板单元.-14-4.5.4 一般目的单元.-14-4.5.5 组件单元.-14-4.6 文件头.-14-五、窗体和数据模板.-15-5.1 窗体.-15-5.1.1 窗体类型命名标准.-15-5.1.2 窗体实例命名标准.-15-5.1.3 自动创建窗体.-15-5.1.4 模式窗体实例化函数.-15-5.2 数据模板.-17-5.2.1 数据模板命
4、名标准.-17-5.2.2 数据模板实例命名标准.-18-六、包.-18-6.1 使用运行包和设计包的比较.-18-6.2 文件命名标准.-18-七、组件.-19-7.1 用户自定义组件.-19-7.2 组件单元.-19-7.3 使用注册单元.-19-7.4 组件实例命名约定.-19-7.5 组件的前缀.-20-7.6 Standard 页.-20-7.7 Additional 页.-21-7.8 Win32 页.-21-7.9 System 页.-22-7.10 Internet 页.-22-7.11 Data Access 页.-24-7.12 Data Controls 页.-24-7.
5、13 Decision Cube 页.-25-7.14 QReport 页.-25-7.15 Dialogs 页.-26-7.16 Win3.1 页.-26-7.17 Samples 页.-27-7.18 ActiveX 页.-27-7.19 Midas 页.-28-精选 Delphi 编码规范 一、序言 本文档详述了在 Delphi 下进行编程的代码编写标准。在 Delphi 开发者指南中包含本文档的目的在于阐述一种方法,通过该方法,开发小组可以在他们所编写的代码中保持一贯的风格。这样做的目的是使在开发小组中的每一个程序员都可以明白其他程序员的代码。这有助于提高代码编写的可读性和使用的一贯性
6、。二、通用源代码格式规则 2.1 缩格 缩格是指在每一级有两个空格。不要在源代码中保留 tab 字符,这是因为 tab 字符会随着不同用户的不同设置和不同的资源管理工具(打印、文档、版本控制等)而代表不同的宽度。你可以通过关闭 Environment 选项对话框中 Editor 页上的“Use tab character”和“Optimal fill”检查框(通过 Tools|Environment)来禁止保存 tab 字符。2.2 页边空格 页边空格会被设置成 80 字符宽。通常,源码不会超出这个边界,但这个方针会有一些弹性。不管是否有可能,那些超出到另一行的语句会在一个逗号或其他操作符之后
7、与前面的语句相连。当一个语句被打断相连时,它应比原来的那一行语句缩进两个字符。2.3 BeginEnd 配对 Begin 子句应写在独立的一行。例如,下面第一行是错误的写法而第二行是正确的。for I:=0 to 10 do begin /错误,begin同for在同一行 for I:=0 to 10 do /正确,begin出现在独立的一行 begin 这个规则的例外是当 begin 子句的出现是作为一个 else 子句的一部分参考例子:精选 if some statement then begin end else begin end;end 语句永远出现在独立的一行。当 begin 语句
8、不是一个 else 子句的一部分时,相应的 end 语句永远缩进到与 begin 部分相对应的位置。三、Object Pascal 3.1 括号 永远不要在括号与括号之间的字符中间留下空格。下面的例子示范了错误的与正确地使用括号中的空格:CallProc(Aparameter);/错误 CallProc(Aparameter);/正确 永远不要在一个语句中使用不必要的括号。括号只应在源代码中需要的地方使用。以下的例子示范了错误和正确的使用:if(I=42)then /错误 多余的括号 if(I=42)or(J=42)then /正确 需要括号 3.2 保留字和关键字 Object Pascal
9、 保留字和关键字永远是全部小写。精选 3.3 过程和函数 3.3.1 命名/格式化 过程的名字永远应该以大写的字母开头并且中间错落分明以增加代码的可读性。下面是一个不正确格式的过程名称:procedure thisisapoorlyformattedroutinename;/错误 下面是一个合适的大小写过程名称:procedure ThisIsMuchMoreReadableRoutineName;/正确 过程的名称应该同它的内容相符。一个会导致某个行为的过程应以动词开头。例如:procedure FormatHardDrive;一个用于设置输入参数的过程应以单词 set 作为前缀,例如:pr
10、ocedure SetUserName(aName:string);一个用来接收某个值的过程应以单词 get 作为前缀,例如:function GetUserName:string;3.3.2 形式参数 3.3.2.1 格式化 如果有的话,相同类型的形参应合并在一个语句中:procedure Foo(Param1,Param2,Param3:Integer;Param4:string);3.3.2.2 命名 所有形参的名字应是十分符合它们所代表的意义,特别是应该以传送到过程中的标志符的名称为基础。一个好的参数名称应以字符 A 为前缀 例如:procedure SomeProc(AuserNam
11、e:string;AuserAge:integer);“A”前缀按约定表示该参数的名称是与类类型中的一个属性或域的名称相对应的。3.3.2.3 参数的排序 精选 下面的形参的顺序重点说明了注册者调用约定调用的好处。最常用的参数应放在第一位,其它的参数应按从左到右的顺序排列。输入参数列表应放在输出参数列表的左边。将通用的参数放在特殊参数的左边,例如:procedure SomeProc(Aplanet,AContinent,Acountry,Astate,Acity)排序可能有些例外,如事件的处理。类型为 TObject 的 Sender 参数经常放在第一位。3.3.2.4 常量参数 当一个参数
12、为记录型、数组类型、ShortString、接口类型等并且在过程中不被改变时,这些参数应设为常量标记。这样编译器会产生更加有效率的代码。而过程中另外一些非变参数也可常量来传送。尽管这样做没有产生任何效果和提高效率,这将会给调用过程的使用者提供更多的信息。3.3.2.5 名称的冲突 当使用拥有两个名称相同的过程的两个单元时,如果你调用该过程时,在 uses 子句中排在后面的单元中的过程将会被调用。为了解决这种“在 uses 子句上的模糊”冲突,要在调用该过程时写上相关的单元的前缀,例如:sysUtile.FindClose(SR);或 windows.FindClose(Handle);3.4
13、变量 3.4.1 变量的命名和格式 变量的命名应与使用它们的目的相符。循环控制变量应采用一个单独的字符作为名字,比如 I,J,或 K,也可以采用更加有意义的名字,比如 UserIndex。逻辑变量的名字应能充分表达准确的真或假的意思。精选 3.4.2 局部变量 一个过程中的局部变量应遵循所有其它变量的使用和命名约定。临时变量的取名应合理。如果必须的话,在一进入过程就应初始化局部变量。局部的 AnsiString 变量会自动初始化为一个空的字符串。局部接口和派分接口类型变量将会自动初始化为 nil,并且局部变数和 ole 变数类型变量会自动初始化为 Unassigned 3.4.3 全局变量的使
14、用 使用全局变量是不推荐的。但是,在某些时候还是必须使用,而且它们也只应在必须使用的时候才使用。在这种时候,你应努力只在一段上下文范围内使用全局变量。例如,一个全局变量只应在一个单元的 implemntation 部分内是全局的。如果打算在多个单元类使用全局数据,你应将它们移到一个公共的单元中然后被其它所有单元使用。全局变量可以在 var 子句中直接初始化为一个值。记住,所有的全局数据会自动初始化为0,因此不要将全局变量初始化为一个“空”值比如 0、nil、Unassigned、等等。这样做的一个理由是因为零初始化的全局数据在 exe 文件中不会占据任何空间。零初始化数据被存储在一个虚拟的数据
15、段,它在应用程序启动后被分配在一段内存中。非零初始化的全局数据在硬盘的 exe 文件占用空间。3.5 类型 3.5.1 大写约定 如果类型的名字是保留字,那么它应全部小写。Win32 API 类型通常全部大写,并且你必须遵循在 Windows.pas 或其他 API 单元中的详细类型名称的约定。对于其他变量名字,第一个字母应为大写,而其他字母应错落有致。下面是一些例子:var MyString:string;/保留字 WindowHandle:HWND;/Win32 API 类型 I:Integer;/在System单元中引进的类型标识符 3.5.1.1 浮点指针类型 不推荐使用 Real 类
16、型,因为它的存在只是为了向前兼容早期的 Pascal 代码。在通常情况下用 Double 来实现浮点指针的需要。并且,Double 对处理器和总线而言是做了最优化处精选 理的,它也是 IEEE 中定义的标准数据格式。只有当需要的范围超出 Double 所定义的范围时才使用 Extended。Extended 是 intel 定义的类型且在 Java 中不支持。只有当浮点指针变量的实际字节大小有其意义时才使用Single。(比如当使用另一种语言的DLLs时)。3.5.1.2 枚举类型 枚举类型的名字需符合使用该类型的目的。该类型的名字需以字符 T 为前缀,以表明这是一个类型。枚举类型中的标识符列
17、表必须包含两个或三个字符的前缀来对应于该枚举类型的名字 例如:TsongType=(stRock,stClassical,stCountry,stAlternative,stHeavyMetal,stRB);一个枚举类型的实例的名字应与不要前缀的枚举类型(SongType)相同,除非有更好的原因来赋予该变量更特殊的名字,比如:FavoriteSongType1,FavoriteSongType2 等等。3.5.1.3 Variant 和 ole Variant 类型 通常不建议使用 Variant 和 OleVariant 类型。但在只有运行时刻才能知道数据类型的程序中必须使用该类型,这种情形
18、多出现在 COM 和数据库开发中。Ole Variant 使用在以 COM为基础的编程中例如自动化和 ActiveX 控制,而 Variant 使用在非 COM 的编程中,这是因为 Variant 可以十分有效地存储本地 Delphi 字符串(同一个字符串变量一样),但 Ole变数会将所有的字符串转换为 Ole 字符串(WideChar 字符串)并且并不实例运算 它们永远拷贝。3.5.2 结构类型 3.5.2.1 数组类型 数组类型的名字需符合它们使用的目的。该类型的名字必须加以前缀 T。如果须声明该数组类型的指针,那么该指针需加以前缀 P 而且应立即声明在该数组声明的前面。例如:type P
19、CycleArray=TCycleArray;TCycleArray=array1100 of integer;在实际应用中,数组的变量实例的名称应是其类型的名字去掉前缀 T。3.5.2.2 记录类型 记录类型的名字应符合使用它们的目的。其类型的声明应加以前缀 T。如果要声明该记录类型的指针,就应加以前缀 P 并且应紧靠在类型声明的前面声明。例如:精选 type PEmployee=TEmployee;TEmployee=record EmployeeName:string;EmployeeRate:Double;end;3.6 语句 3.6.1 if 语句 在 if/then/else 语句
20、中最常发生的行为应放在 then 子句中,而其它发生可能性较小的行为应放在 else 子句中。尽量避免使用嵌套的 if 语句,在这种情形下应用多个 if 语句来判断各种可能。不要使用 if 嵌套超过五级深度。应使代码编写得更加清晰、明了。不要在 if 语句中使用不必要的圆括号。如果在if语句中有多个条件需测试,这些条件应按计算强度由少到多的顺序从左到右排列。这样做能使编译器在编译代码时获得布尔估算逻辑的捷径,从而使你的代码获得最佳的优化。举例来说,如果条件 1 快过条件 2,而条件 2 快过条件 3,那么在 if 语句中的排列应是:if 条件 1 and 条件 2 and 条件 3 then
21、3.6.2 case 语句 3.6.2.1 一般性话题 在一个 case 语句中的各个独立的单元应以数字或字母顺序排列。每一个 case 单元的动作行为应保持简单而不应该超过四到五行代码。如果所要执行的动作过于复杂应采用独立的过程或函数。Case 语句中的 else 子句只有当需要缺省行为或处理错误时才使用。3.6.2.2 格式 精选 case 语句应遵循其它结构的缩格和命名约定。3.6.3 while 语句 在一个 while 语句中不建议使用 exit 过程来跳出循环,尽量仅使用循环条件来跳出循环。在一个while循环中所用的初始化代码应紧靠在进入while循环前面出现而不要被其它不相关的
22、语句隔开。任何结束后的处理应在循环之后立即进行。3.6.4 for 语句 for 语句只有当循环次数已知的情况下才能取代 while 语句使用。3.6.5 repeat 语句 repeat 语句的使用同 while 语句一样,并且遵循同样的通用方针。3.6.6 with 语句 3.6.6.1 一般话题 with 语句应节省使用,并且带有大量的警告。避免过度使用 with 语句并且在 with 语句中小心使用多个对象、记录等等。例如:with Record1,Record2 do/错误 这些事情会使程序员感到困惑并难以发现问题所在。3.6.6.2 格式 with 语句遵循本文档所说明的命名约定和
23、缩格的格式规则。3.7 结构异常处理 3.7.1 一般话题 异常的处理大量地使用在错误纠正和资源保护方面。这就是说一旦资源被分配,一个tryfinally 必需加以使用来保证该资源被正确的释放。这种异常的保护也是指在一个单元的 initializition/finalization 或一个对象的 constructor/destructor 中进行资源的分配和释放。精选 3.7.2 tryfinally 的使用 任何情形下,每一次的分配都应跟随一个 tryfinally。举例来说,下面的代码会造成可能的错误:SomeClass1:=TsomeClass.Create;SomeClass2;=T
24、someClass.Create;try do some code finally SomeClass1.Free;SomeClass2.Free;end;一个更安全更合适的分配过程应是:SomeClass1:=TSomeClass.Create;try SomeClass2:=TsomeClass.Create;try do some code finally SomeClass2.Free;end;finally SomeClass1.Free;end;精选 3.7.3 tryexcept 的使用 只有当在异常被触发而你想执行一些任务时才使用 tryexcept。通常,你没有必要为了只是简
25、单地在屏幕上显示一个错误信息而使用 tryexcept 语句,因为这会被Application 对象自动执行。如果你想在 except 子句中执行完一些任务之后调用缺省的异常处理,使用 raise 来重新触发异常到下一个句柄。3.7.4 tryexceptelse 的使用 tryexcept 中的 else 子句不建议使用,因为它会打断所有的异常包括那些你没有准备的异常。3.8 类 3.8.1 命名和格式 类的名称应符合使用它们的目的。类名字应加以前缀 T 以表明这是一个类型的定义 例如:type Tcustomer=class(TObject)类型的实例通常是没有前缀 T 的类型的名字 例如
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Delphi 编码 规范
限制150内