ImageVerifierCode 换一换
格式:DOCX , 页数:27 ,大小:30.78KB ,
资源ID:5646397      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5646397.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编码规范Delphi.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

编码规范Delphi.docx

1、编码规范Delphi软件开发标准技术文档(Delphi)编码规范SeanOuyang软件技术文档2012年修改记录序号版本号拟制人/修改人拟制/修改日期更改备注11.0seanouyang2012-07-10初稿(来源于网络)21.1seanouyang2012-07-14修改目录一、前言 5二、基本规范 62.1 缩进 62.2 空格 62.3 边距 62.4 保留字和关键字 62.5 声明和赋值 62.6 运算符号 62.7 注释 72.8 括号 72.9 begin.end 语句 82.10 库单元分类 8三、常用规范 93.1 过程和函数 93.2 变量 93.3 类型 103.4 语

2、句 113.5 结构异常处理 123.6 类类型 133.7 域 143.8 属性 14四、文件 154.1文件命名 154.2 Unit文件 154.3 窗体单元 164.4 构件单元 164.5 文件头 16五、窗体和数据模板 175.1 窗体 175.2 数据模板 18六、包 196.1 使用运行包和设计包的比较 196.2 文件命名标准 19七、构件 207.1 用户自定义构件 207.2 构件单元 207.3 使用注册单元 207.4 构件实例命名约定 207.5 构件的前缀 207.6 Standard页 207.7 Additional页 217.8 Win32页 217.9 S

3、ystem页 227.10 Internet页 227.11 Data Access页 237.12 Data Controls页 237.13 Decision Cube页 247.14 QReport页 247.15 Dialogs页 257.16 Win3.1页 257.17 Samples页 257.18 ActiveX页 267.19 Midas页 26八、注释规范 278.1修改历史记录 278.2新增代码行 278.3删除代码行 278.4修改代码行 27一、前言软件的长期价值直接源于其编码质量。在它的整个生命周期里,一个程序可能会被许多人阅读或修改。如果一个程序可以清晰的展现出

4、它的结构和特征,那就能减少在以后对其进行修改时出错的可能性。本文档详述了在Delphi下进行编程的代码编写标准。在通常情况下,本文档遵循“取消”式格式的指引方针,该方针由Borland国际通过一些例外来使用。在Delphi 开发者指南中包含本文档的目的在于阐述一种方法,通过该方法,开发小组可以在他们所编写的代码中保持一贯的风格。这样做的目的是使在开发小组中的每一个程序员都可以明白其他程序员的代码。这有助于提高代码编写的可读性和使用的一贯性。二、基本规范2.1 缩进缩进就是每级间有两个空格。不要在源代码中放置制表符(TAB)。这是因为,制表符的宽度随着不同的设置和代码管理实用程序(打印、文档及版

5、本控制等)而不同。通过使用Tools|Environment 菜单,在Environment Options 对话框的General页上,不要选中Use Tab Character 和Optional Fill 复选框,这样,制表符就不会被保存。2.2 空格遇到如下情况,需要添加空格:1) 逗号的后面;2) 冒号(不包括赋值语句中的冒号)的后面;3) 等号的前后;4) 赋值号的前后5) 运算符(+、-、*、/)的前后。2.3 边距边距一般设置为80个字符,如遇到特殊情况可以增加到90个字符(建议使用1024*768以上的分辨率查看)。本规则比较灵活。长度超过一行的语句应当用逗号或运算符换行。换

6、行后,应缩进两个字符。2.4 保留字和关键字Object Pascal 保留字和关键字永远是全部小写。2.5 声明和赋值声明形参时形参靠近冒号,类型与冒号空出一个格。例:aStr: string;多个同一类型的形参应当归并一起声明时,用逗号分开,后一个形参与逗号空一个格。例:aStr, aName, aPwd: string;付值时变量与数值均与付值符号间隔一个格。例:aStr := hello;2.6 运算符号运算符号与左右两个参量间空出一个格,如有两层以上的运算关系必须使用“()”来分隔开. 例:if aInt 100 then aInt := (aInt * 5) div (aInt d

7、iv 10);2.7 注释代码注释:解释函数、变量、参数、代码或者判断循环条件等需要使用代码注释。函数、变量、参数、代码解释用“/”表示,添加在要注释的代码前一行,与所注释的代码行对齐,“/”之后缩进一格。如果行代码过长(边距超过80)则在下面另起一行进行注释。判断循环条件的注释用“”表示。单元注释:当需要对单元进行注释时在该单元的Unit最顶端使用进行注释。其中包括编写日期,作者名称、单元简单说明、修改记录等。例:- Unit Name: uMeetingRoomFrm Author: Lee Purpose: 聊天室 History: 2005-09-09-分隔标志:当需要用醒目的标志将两

8、部分代码分开表示时使用“/*/”的标志隔开,并在之后进行陈述。例:Statement1;/*陈述*/(分隔符开始)Statement2;/*/(分隔符结束)2.8 括号在左括号与下一字符之间没有空格。同样,右括号与前一字符也没有空格。下面的例子演示了正确与不正确的空格。/ 错!CallProc( Aparameter );/ 正确!CallProc(Aparameter);不要在语句中包含多余的括号。在源代码中,括号只有在确实需要时才使用。下面的例子演示了正确与不正确用法:/ 错,括号是多余的if (I = 42) then/ 正确,必须使用括号if (I = 42) or (J = 42)

9、then2.9 begin.end 语句begin 语句必须单独占一行。例如,下面第一行是错误的,而第二行正确:/ 错, begin 与for 在同一行for I := 0 to 10 do beginend/ 对for I := 0 to 10 dobeginend;本规则的一个特殊情况是,当begin 为else 语句的一部分时,例如:if some statement = thenbegin . . .endelse begin Some Other Statement;end;注意:end 语句总单独一行。当begin 不为else 语句的一部分时,相应的end 语句与begin 语句

10、的缩进量相同。2.10 库单元分类在每个单元的Uses项目里填写有本单元引用的所有库单元名称。库单元共分为3类。Delphi自带单元:Delphi自带控件、函数和方法的单元。(新建Unit后如有不必要的单元请手动删除)引入的第三方控件单元:第三方控件所属的单元名称,请在此类单元名称后面注明拥有的控件,用“”块注释。自己编写的单元:程序中调用的自己编写的单元名称,在单元后注明该单元的简单介绍,用“”块注释。三类库单元用“/*(说明)*/”的标志分隔开,例:uses/*(Delphi自带单元)*/Windows, Messages, SysUtils, Variants, Classes, Gra

11、phics, Controls, Forms, ShellAPI, Dialogs, Menus, ExtCtrls, StdCtrls, DB,/*(第三方控件单元)*/CoolTrayIcon托盘控件,/*(自编单元)*/ThreadUnit线程单元;三、常用规范3.1 过程和函数 命名过程名应当以大写字母开始,且大小写交错以增加可读性。/ 错procedure thisisapoorlyformattedroutinename;/ 正确procedure ThisIsMuchMoreReadableRoutineName;例程的名称应该同它的内容相符。一个会导致某个行为的例程应以动词开头

12、。例如:procedure FormatHardDrive;一个用于设置输入参数的例程应以单词set作为前缀,例如:procedure SetUserName;一个用来接收某个值的例程应以单词get作为前缀,例如:procedure GetUserName: string; 参数只要可能,同一类型的形参应当归并在一起,后一个形参与前面的逗号空一个格:procedure Foo(Param1, Param2, Param3:Integer;Param4:string); 参数的排序下面的形参的顺序重点说明了注册者调用约定调用的好处。 最常用的参数应放在第一位,其它的参数应按从左到右的顺序排列。

13、输入参数列表应放在输出参数列表的左边。 将通用的参数放在特殊参数的左边,例如:procedure SomeProc(Aplanet, AContinent, Acountry, Astate, Acity) 排序有可能有些例外,比如事件的处理。类型为TObject的Sender参数经常放在第一位。 常量参数要使记录、数组、短字符串或接口类型的参数不能被过程修改,就应当把形参标以const 。这样,编译器将以最有效的方式生成代码,保证传递的参数不可变。如果其他类型的参数希望不被过程所修改,也可以标上const 。尽管这对效率没有影响,但这给过程的调用者带来了更多的信息。类对外发布的数据成员全部以

14、property的形式。3.2 变量 命名变量的命名应以使用它们的目的相符循环控制变量应采用一个单独的字符作为名字,比如 I,J,或K,也可以采用更加有意义的名字,比如 UserIndex。逻辑变量的名字应能充分表达准确的真或假的意思。 局部变量一个过程中的局部变量应遵循所有其它变量的使用和命名约定。临时变量的取名应合理。如果必须的话,在一进入例程就应初始化局部变量。局部的AnsiString变量会自动初始化为一个空的字符串。局部接口和派分接口类型变量将会自动初始化为nil,并且局部变数和ole变数类型变量会自动初始化为Unassigned 全局变量的使用使用全局变量是不推荐的。但是,在某些时

15、候还是必须使用,而且它们也只应在必须使用的时候才使用。在这种时候,你应努力只在一段上下文范围内使用全局变量。例如,一个全局变量只应在一个单元的implemntation部分内是全局的。如果打算在多个单元类使用全局数据,你应将它们移到一个公共的单元中然后被其它所有单元使用。全局变量可以在var子句中直接初始化为一个值。记住,所有的全局数据会自动初始化为0,因此不要将全局变量初始化为一个“空”值比如 0、nil、Unassigned、等等。这样做的一个理由是因为零初始化的全局数据在exe文件中不会占据任何空间。零初始化数据被存储在一个虚拟的数据段,它在应用程序启动后被分配在一段内存中。非零初始化的

16、全局数据在硬盘的exe文件占用空间。3.3 类型 大写约定如果类型的名字是保留字,那么它应全部小写。Win32 API类型通常全部大写,并且你必须遵循在Windows.pas或其他API单元中的详细类型名称的约定。对于其他变量名字,第一个字母应为大写,而其他字母应错落有致。下面是一些例子: var MyString : string; /保留字 WindowHandle : HWND; /Win32 API 类型 I : Integer; /在System单元中引进的类型标识符 浮点指针类型不推荐使用Real类型,因为它的存在只是为了向前兼容早期的Pascal代码。在通常情况下用Double来

17、实现浮点指针的需要。并且,Double对处理器和总线而言是做了最优化处理的,它也是IEEE中定义的标准数据格式。只有当需要的范围超出Double所定义的范围时才使用Extended。Extended是intel定义的类型且在Java中不支持。只有当浮点指针变量的实际字节大小有其意义时才使用Single。(比如当使用另一种语言的DLLs时)。 枚举类型枚举类型的名字需符合使用该类型的目的。该类型的名字需以字符T为前缀,以表明这是一个类型。枚举类型中的标识符列表必须包含两个或三个字符的前缀来对应于该枚举类型的名字 例如:TsongType = (stRock, stClassical, stCou

18、ntry, stAlternative, stHeavyMetal, stRB);一个枚举类型的实例的名字应与不要前缀的枚举类型(SongType)相同,除非有更好的原因来赋予该变量更特殊的名字,比如:FavoriteSongType1,FavoriteSongType2 等等。 变数和ole变数类型通常不建议使用变数和Ole变数类型。但在只有运行时刻才能知道数据类型的程序中必须使用该类型,这种情形多出现在COM和数据库开发中。Ole变数使用在以COM为基础的编程中例如自动化和ActiveX控制,而变数使用在非COM的编程中,这是因为变数可以十分有效地存储本地Delphi字符串(同一个字符串变

19、量一样),但Ole变数会将所有的字符串转换为Ole字符串(WideChar 字符串)并且并不实例运算 它们永远拷贝。 数组类型数组类型的名字需符合它们使用的目的。该类型的名字必须加以前缀T。如果须声明该数组类型的指针,那么该指针需加以前缀P而且应立即声明在该数组声明的前面。例如:typePCycleArray = TCycleArray; TCycleArray = array1100 of integer;在实际应用中,数组的变量实例的名称应是其类型的名字去掉前缀T。 记录类型记录类型的名字应符合使用它们的目的。其类型的声明应加以前缀T。如果要声明该记录类型的指针,就应加以前缀P并且应紧靠在

20、类型声明的前面声明。例如: type PEmployee = TEmployee; TEmployee = record EmployeeName : string; EmployeeRate : Double; end;3.4 语句 if 语句在if/then/else语句中最常发生的行为应放在then子句中,而其它发生可能性较小的行为应放在else子句中。尽量避免使用嵌套的if语句,在这种情形下应用多个if语句来判断各种可能。不要使用if嵌套超过五级深度。应使代码编写得更加清晰、明了。不要在if语句中使用不必要的圆括号。如果在if语句中有多个条件需测试,这些条件应按计算强度由少到多的顺序从

21、左到右排列。这样做能使编译器在编译代码时获得布尔估算逻辑的捷径,从而使你的代码获得最佳的优化。举例来说,如果条件1快过条件2,而条件2快过条件3,那么在if语句中的排列应是:if 条件1 and 条件2 and 条件3 then case 语句在一个case语句中的各个独立的单元应以数字或字母顺序排列。每一个case单元的动作行为应保持简单而不应该超过四到五行代码。如果所要执行的动作过于复杂应采用独立的过程或函数。Case语句中的else子句只有当需要缺省行为或处理错误时才使用。case语句应遵循其它结构的缩格和命名约定。 while 语句在一个while语句中不建议使用exit过程来跳出循环

22、,尽量仅使用循环条件来跳出循环。在一个while循环中所用的初始化代码应紧靠在进入while循环前面出现而不要被其它不相关的语句隔开。任何结束后的处理应在循环之后立即进行。 for 语句for语句只有当循环次数已知的情况下才能取代while语句使用。 repeat 语句repeat语句的使用同while语句一样,并且遵循同样的通用方针。 with 语句with语句应节省使用,并且带有大量的警告。避免过度使用with语句并且在with语句中小心使用多个对象、记录等等。例如:with Record1, Record2 do这些事情会使程序员感到困惑并难以发现问题所在。with 语句遵循本文档所说明

23、的命名约定和缩格的格式规则。3.5 结构异常处理异常的处理大量地使用在错误纠正和资源保护方面。这就是说一旦资源被分配,一个tryfinally必需加以使用来保证该资源被正确的释放。这种异常的保护也是指在一个单元的initializition/finalization或一个对象的constructor/destructor中进行资源的分配和释放。 tryfinally的使用任何情形下,每一次的分配都应跟随一个tryfinally。举例来说,下面的代码会造成可能的错误: SomeClass1 := TsomeClass.Create; SomeClass2 ;= TsomeClass.Create

24、; 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; tryexcept的使用只有当在异常被触发而你想执行一些任务时才使用tryexcept。通常,你没有必要为了只是简单地在屏幕上显示一个错误信息

25、而使用tryexcept语句,因为这会被Application对象自动执行。如果你想在except子句中执行完一些任务之后调用缺省的异常处理,使用raise来重新触发异常到下一个句柄。 tryexceptelse的使用tryexcept中的else子句不建议使用,因为它会打断所有的异常包括那些你没有准备的异常。3.6 类类型类类型的名称应符合使用它们的目的。类型名字应加以前缀T以表明这是一个类型的定义 例如:type Tcustomer = class(TObject)类型的实例通常是没有前缀T的类型的名字 例如:var Customer :Tcustomer;注意:查阅“构件类型的命名标准”

26、来获得更多有关构件命名的信息。3.7 域 命名/格式类的域名遵循与变量标识符同样的约定除了它们应以F为前缀,来表明这是一个域的名称。 可视化所有的域都必需是私有的。想在类的范围之外存取域得通过属性来使用。 方法方法的命名应遵循本文档中有关过程和函数的约定叙述。使用静态的方法:如果使用一个静态的方法,那么该方法就不能被该类的后代类所继承。使用虚拟/动态的方法:如果你打算该类的方法能被后代的类所继承就得使用虚拟的方法。只有在该方法有多个继承时(直接的或间接的)才使用动态的方法。例如,一个类类型包含一个可继承的方法,而100个后代类要继承这种方法,那么这个方法就会动态地产生为100个后代类使用的内存

27、。使用抽象的方法:如果在一个类中使用抽象的方法,该类就不能被创建。只有在那些永远不会被创建的类中使用抽象的方法。属性存取方法:所有存取类的方法都只能出现在类的private或protected部分。属性存取方法的命名应遵循过程和函数的约定规则。读取存取方法(方法读取器)必需以单词Get为前缀。写入存取方法(方法写入器)必需以单词Set为前缀。方法写入器的参数的名字应为Value,并且它的类型应是它所操作的属性的类型。例如: TSomeClass = class(TObject) private FsomeField : Integer; protected function GetSomeFi

28、eld : Integer; procedure SetSomeField(Value : Integer); public property SomeField : Integer read GetSomeField write SetSomeField; end;3.8 属性 命名/格式属性如果是表示为一个私有域的存取器的话,那么它的名字应是它们所操作的域的名字除去解释符F。属性的名字应是名词,不是动词。属性表示的是数据,而方法表示的是行为。数组类型的名称应为复数。一般情况下属性的名称应为单数。 使用存取的方法尽管没有要求,但还是建议尽量少地为一个表示私有域的属性而使用写入存取方法。 四、

29、文件4.1文件命名 工程文件工程文件应取个描述性的名字。例如,Delphi 4开发者指南错误管理器 的工程名字是:DDGBugs.dpr。一个有关系统信息的程序的名字就应象 SysInfo.dpr。 窗体文件一个窗体文件的取名应可以描述使用该窗体的目的,并加以前缀Frm。例如,一个“关于”的窗体的文件名应是FrmAbout.pas。主窗体的文件名应是FrmMain.pas。 数据模板文件数据模板的取名应能表示使用该数据模板的目的,它的名称应加以两个字符的前缀DM。例如,自定义数据模板的文件名字应为DmCustomers.dfm。 远端数据模板文件远端数据模板的取名应能表示使用该远端数据模板的目的,它的名称应加以三个字符的前缀RDM。例如,自定义远端数据模板的文件名字应为RdmCustomers.dfm。4.2 Unit文件 通用Unit结构unit的名字Unit文件应取一个可描述性的名字。例如,包含应用程序主窗体的单元应叫做MainFrm.pas。uses子句在interface部分的uses子句应包含在interface部分中的代码所需要的单元。去掉那些Delphi可以自动加入到程序中

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1