Delphi代码编写标准指南

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

· 日月光华 精华区文章阅读

  
 发信人: Delphii (Delphi), 信区: VCL
标  题: Delphi编码规则
发信站: 日月光华站 (Fri Sep  7 12:03:07 2001) , 站内信件

Delphi代码编写标准指南
■■■■■■■■■■■■■■■■■■■■■■■■
目录
■■■■■■■■■■■■■■■■■■■■■■■■
一、序言
二、通用源代码格式规则
2.1 缩格
2.2 页边空格
2.3 Begin…End 配对
三、Obje ct Pascal
3.1 括号
3.2 保留字和关键字
3.3 过程和函数(例程)
    3.3.1 命名/格式化
    3.3.2 形式参数
        3.3.2.1 格式化
        3.3.2.2 命名
        3.3.2.3 参数的排序
        3.3.2.4 常量参数
        3.3.2.5 名称的冲突
3.4 变量
    3.4.1 变量的命名和格式
    3.4.2 局部变量
    3.4.3 全局变量的使用
3.5 类型
    3.5.1 大写约定
        3.5.1.1 浮点指针类型
        3.5.1.2 枚举类型
        3.5.1.3 变数和ole变数类型
    3.5.2 结构类型
        3.5.2.1 数组类型
        3.5.2.2 记录类型
3.6 语句
    3.6.1 if 语句
    3.6.2 case 语句
        3.6.2.1 一般性话题
        3.6.2.2 格式
    3.6.3 while 语句
    3.6.4 for 语句
    3.6.5 repeat 语句
    3.6.6 with  语句
        3.6.6.1 一般话题
        3.6.6.2 格式
3.7 结构异常处理
    3.7.1 一般话题
    3.7.2 try…finally的使用
    3.7.3 try…except的使用
    3.7.4 try…except…else的使用
3.8 类类型
    3.8.1 命名和格式
    3.8.2 域
        3.8.2.1 命名/格式
        3.8.2.2 可视化
    3.8.3 方法
        3.8.3.1 命名/格式
        3.8.3.2 使用静态的方法
        3.8.3.3 使用虚拟/动态的方法
        3.8.3.4 使用抽象的方法
        3.8.3.5 属性存取方法
    3.8.4 属性
        3.8.4.1 命名/格式
        3.8.4.2 使用存取的方法
四、文件
4.1 工程文件
    4.1.1 命名
4.2 窗体文件
    4.2.1 命名
4.3 数据模板文件
    4.3.1 命名
4.4 远端数据模板文件
    4.4.1 命名
4.5 Unit文件
    4.5.1 通用Unit结构
        4.5.1.1 unit的名字
        4.5.1.2 uses子句
        4.5.1.3 interface部分
        4.5.1.4 implementation部分
        4.5.1.5 initialization部分
        4.5.1.6 finalization部分
    4.5.2 窗体单元
        4.5.2.1 命名
    4.5.3 数据模板单元
        4.5.3.1 命名
    4.5.4 一般目的单元
        4.5.4.1 命名
    4.5.5 构件单元
        4.5.5.1 命名
4.6 文件头
五、窗体和数据模板
5.1 窗体
    5.1.1 窗体类型命名标准
    5.1.2 窗体实例命名标准
    5.1.3 自动创建窗体
    5.1.4 模式窗体实例化函数
5.2 数据模板
    5.2.1 数据模板命名标准
    5.2.2 数据模板实例命名标准
六、包
6.1 使用运行包和设计包的比较
6.2 文件命名标准
七、构件
7.1 用户自定义构件
7.2 构件单元
7.3 使用注册单元
7.4 构件实例命名约定
7.5 构件的前缀
7.6 Standard页
7.7 Additional页
7.8 Win32页
7.9 System页
7.10 Internet页
7.11 Data Access页
7.12 Data Controls页
7.13 Decision Cube页
7.14 QReport页
7.15 Dialogs页
7.16 Win3.1页
7.17 Samples页
7.18 ActiveX页
7.19 Midas页
■■■■■■■■■■■■■■■■■■■■■■■■
一、序言
■■■■■■■■■■■■■■■■■■■■■■■■
    本文档详述了在Delphi 4开发者指南下进行编程的代码编写标准。在通常情况下,
本文档遵循“取消”式格式的指引方针,该方针由Borland国际通过一些例外来使用。在
Delphi 4开发者指南中包含本文档的目的在于阐述一种方法,通过该方法,开发小组可
以在他们所编写的代码中保持一贯的风格。这样做的目的是使在开发小组中的每一个程
序员都可以明白其他程序员的代码。这有助于提高代码编写的可读性和使用的一贯性。

    本文档并不意味着包含了所有存在于代码中的标准。但是,它的内容已足够帮你起
个好头。你可以自由的增加修改这些标准来满足你的需要。我们不赞成你偏离这些由Bo
rland开发人员所使用的标准太远。我们推荐这么做是因为一旦有新的程序员加入到你的
开发小组中,而他们最喜欢和最熟悉的是Borland的标准。象大多数代码标准文档,本文
档也会根据需要进行改动。因此,你可以到www.xapware.com/ddg中找到最新的更新版本
。本文档不包括用户接口标准。本文档是独立的但也是同样重要的。已经有足够的第三
方书籍和Microsoft文档包括了另外一些指导方针,而我们决定并不复制这些信息,但我
们会指引你到Microsoft Developers Network 和一些资源,在那儿可以找到你所需的信
息。
■■■■■■■■■■■■■■■■■■■■■■■■
二、通用源代码格式规则
■■■■■■■■■■■■■■■■■■■■■■■■
2.1 缩格
    缩格是指在每一级有两个空格。不要在源代码中保留tab字符,这是因为tab字符会
随着不同用户的不同设置和不同的资源管理工具(打印、文档、版本控制等)而代表不
同的宽度。
    你可以通过关闭Environment选项对话框中Editor页上的“Use tab character”和
“Optimal fill”检查框(通过ools|Environment)来禁止保存tab字符。
2.2 页边空格
    页边空格会被设置成80字符宽。通常,源码不会超出这个边界,但这个方针会有一
些弹性。不管是否有可能,那些超出到另一行的语句会在一个逗号或其他操作符之后与
前面的语句相连。当一个语句被打断相连时,它应比原来的那一行语句缩进两个字符。

2.3 Begin…End 配对
    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
  someOtherStatement;
end;
    end 语句永远出现在独立的一行。
    当begin语句不是一个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 保留字和关键字永远是全部小写。
3.3 过程和函数(例程)
3.3.1 命名/格式化
    例程的名字永远应该以大写的字母开头并且中间错落分明以便于可读性。下面是一
个不正确格式的过程名称:
         procedure thisisapoorlyformattedroutinename;
    下面是一个合适的大小写例程名称的例子:
         procedure ThisIsMuchMoreReadableRoutineName;
    例程的名称应该同它的内容相符。一个会导致某个行为的例程应以动词开头。例如

         procedure FormatHardDrive;
    一个用于设置输入参数的例程应以单词set作为前缀,例如:
         procedure SetUserName;
    一个用来接收某个值的例程应以单词get作为前缀,例如:
         procedure GetUserName : string;
3.3.2 形式参数
3.3.2.1 格式化
    如果有的话,相同类型的形参应合并在一个语句中:
  procedure Foo(Param1, Param2, Param3 : Integer; Param4 : string);
3.3.2.2 命名
    所有形参的名字应是十分符合它们所代表的意义,特别是应该以传送到例程中的标
志符的名称为基础。一个好的参数名称应以字符A为前缀 - 例如:
  procedure SomeProc(AuserName : string; AuserAge : integer);
    “A”前缀按约定表示该参数的名称是与类类型中的一个属性或域的名称相对应的。

3.3.2.3 参数的排序
    下面的形参的顺序重点说明了注册者调用约定调用的好处。
- 最常用的参数应放在第一位,其它的参数应按从左到右的顺序排列。
- 输入参数列表应放在输出参数列表的左边。
- 将通用的参数放在特殊参数的左边,例如:
      procedure SomeProc(Aplanet, AContinent, Acountry, Astate, Acity)
- 排序有可能有些例外,比如事件的处理。类型为TObject的Sender参数经常放在第一
位。
3.3.2.4 常量参数
    当一个参数为记录型、数组类型、ShortString、或接口类型并且在例程中不被改变
时,这些参数应做上常量标记。这样做会让编译器更加有效率的产生有关这些不改变的
参数的代码。
    而例程中另外一些非变参数也可常量来传送。尽管这样做没有产生任何效果和提高
效率,这将会给调用例程的使用者提供更多的信息。
3.3.2.5 名称的冲突
    当使用拥有两个名称相同的例程的两个单元时,如果你调用该例程时,在uses子句
中排在后面的单元中的例程将会被调用。为了解决这种“在uses子句上的模糊”冲突,
要在调用该例程时写上相关的单元的前缀,例如:
        sysUtile.FindClose(SR);

        windows.FindClose(Handle);
3.4 变量
3.4.1 变量的命名和格式
    变量的命名应以使用它们的目的相符
    循环控制变量应采用一个单独的字符作为名字,比如 I,J,或K,也可以采用更加
有意义的名字,比如 UserIndex。
    逻辑变量的名字应能充分表达准确的真或假的意思。
3.4.2 局部变量
    一个过程中的局部变量应遵循所有其它变量的使用和命名约定。临时变量的取名应
合理。
    如果必须的话,在一进入例程就应初始化局部变量。局部的AnsiString变量会自动
初始化为一个空的字符串。
    局部接口和派分接口类型变量将会自动初始化为nil,并且局部变数和ole变数类型
变量会自动初始化为Unassigned
3.4.3 全局变量的使用
    使用全局变量是不推荐的。但是,在某些时候还是必须使用,而且它们也只应在必
须使用的时候才使用。在这种时候,你应努力只在一段上下文范围内使用全局变量。例
如,一个全局变量只应在一个单元的implemntation部分内是全局的。如果打算在多个单
元类使用全局数据,你应将它们移到一个公共的单元中然后被其它所有单元使用。
    全局变量可以在var子句中直接初始化为一个值。记住,所有的全局数据会自动初始
化为0,因此不要将全局变量初始化为一个“空”值比如 0、nil、’’、Unassigned、等
等。这样做的一个理由是因为零-初始化的全局数据在exe文件中不会占据任何空间。零
-初始化数据被存储在一个虚拟的数据段,它在应用程序启动后被分配在一段内存中。
非零-初始化的全局数据在硬盘的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类型,因为它的存在只是为了向前兼容早期的Pascal代码。在通常
情况下用Double来实现浮点指针的需要。并且,Double对处理器和总线而言是做了最优
化处理的,它也是IEEE中定义的标准数据格式。只有当需要的范围超出Double所定义的
范围时才使用Extended。Extended是intel定义的类型且在Java中不支持。只有当浮点指
针变量的实际字节大小有其意义时才使用Single。(比如当使用另一种语言的DLLs时)

3.5.1.2 枚举类型
    枚举类型的名字需符合使用该类型的目的。该类型的名字需以字符T为前缀,以表明
这是一个类型。枚举类型中的标识符列表必须包含两个或三个字符的前缀来对应于该枚
举类型的名字 - 例如:
        TsongType = (stRock, stClassical, stCountry, stAlternative, stHeavyM
etal, stRB);
    一个枚举类型的实例的名字应与不要前缀的枚举类型(SongType)相同,除非有更
好的原因来赋予该变量更特殊的名字,比如:FavoriteSongType1,FavoriteSongType2
等等。
3.5.1.3 变数和ole变数类型
    通常不建议使用变数和Ole变数类型。但在只有运行时刻才能知道数据类型的程序中
必须使用该类型,这种情形多出现在COM和数据库开发中。Ole变数使用在以COM为基础的
编程中例如自动化和ActiveX控制,而变数使用在非COM的编程中,这是因为变数可以十
分有效地存储本地Delphi字符串(同一个字符串变量一样),但Ole变数会将所有的字符
串转换为Ole字符串(WideChar 字符串)并且并不实例运算 - 它们永远拷贝。
3.5.2 结构类型
3.5.2.1 数组类型
    数组类型的名字需符合它们使用的目的。该类型的名字必须加以前缀T。如果须声明
该数组类型的指针,那么该指针需加以前缀P而且应立即声明在该数组声明的前面。例如

        type
          PCycleArray = ^TCycleArray;
          TCycleArray = array[1…100] 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语句中最常发生的行为应放在then子句中,而其它发生可能性较小
的行为应放在else子句中。
    尽量避免使用嵌套的if语句,在这种情形下应用多个if语句来判断各种可能。
    不要使用if嵌套超过五级深度。应使代码编写得更加清晰、明了。
    不要在if语句中使用不必要的圆括号。
    如果在if语句中有多个条件需测试,这些条件应按计算强度由少到多的顺序从左到
右排列。这样做能使编译器在编译代码时获得布尔估算逻辑的捷径,从而使你的代码获
得最佳的优化。举例来说,如果条件1快过条件2,而条件2快过条件3,那么在if语句中
的排列应是:
         if 条件1 and 条件2 and 条件3 then
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循环前面出现而不要被其
它不相关的语句隔开。
    任何结束后的处理应在循环之后立即进行。
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 语句遵循本文档所说明的命名约定和缩格的格式规则。
3.7 结构异常处理
3.7.1 一般话题
    异常的处理大量地使用在错误纠正和资源保护方面。这就是说一旦资源被分配,一
个try…finally必需加以使用来保证该资源被正确的释放。这种异常的保护也是指在一
个单元的initializition/finalization或一个对象的constructor/destructor中进行资
源的分配和释放。
3.7.2 try…finally的使用
    任何情形下,每一次的分配都应跟随一个try…finally。举例来说,下面的代码会

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值