转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
Delphi代码标准文档         ★★★★

Delphi代码标准文档

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1851 更新时间:2009/4/23 18:26:42

Delphi代码标准文档
Revision 1.0.0.5
编者:Riceball(riceball@cq118.com)

  本文主要基于“Delphi Development Guide”一书的代码标准部分而来,编者参考其它的Delphi代码标准规范,以及结合现目前Delphi社区中流行的程序书写惯例,作了一些修改和裁剪,你也可以根据自己的需要进行裁剪和修改。如果你有什么建议,或是希望编者加上你认为遗漏的东西,欢迎Email至:riceball@cq118.com

目录:

  1. 前言
  2. 源程序书写规范
    1. 通用源代码书写规范
    2. Object Pascal语句书写规范与用法
  3. 命名规范
    1. 过程(Procedure)与函数(Function)
    2. 变量(Variable)
    3. 类型(Type)
      1. 一般类型
      2. 构造类型
      3. 类类型(Class)
        1. 字段
        2. 方法
        3. 属性
      4. 元件类型
      5. 窗体与对话框类型
      6. 数据模块类型
    4. 文件
      1. 项目文件(.dpr)
      2. 窗体文件(.dfm)
      3. 数据模块文件
      4. 远程数据模块文件
      5. 单元文件(.pas)
        1. 普通单元
        2. 窗体单元
        3. 通用单元
        4. 元件单元
      6. 包文件(.dpk)
  4. 源程序文档注释规范
    1. 注释文档的一般规范
    2. 单元文件注释文档格式
    3. 函数(属性)的注释文档格式
  5. Delphi代码自动格式化工具
  6. 代码标准文档更新
  7. 附录:参考文献

 


1.前言

  本文档主要是为Delphi开发人员提供一个源代码书写标准,以及程序和文件的命名标准,使他们在编程时有一致格式可遵循。这样,每个编程人员编写的代码能够被其他人理解。

本文档还没能包括代码标准的每个细节,因此你可以在下面网址留意本文档的最新版本:
http://dev.cq118.com/web/ 

  本文档不包含用户界面标准。用户界面标准是独立于其他标准的,并且同样是重要的。

  如果你有什么建议,或是希望编者加上你认为遗漏的东西,欢迎Email至:riceball@cq118.com


2.源程序书写规范

2.1.通用源代码格式规则

1). 缩进

  缩进就是每级间有两个空格。不要在源代码中放置制表符。这是因为,制表符的宽度随着不同的设置和代码管理实用程序(打印、文档及版本控制等)而不同。

  通过使用Tools|Environment 菜单,在Environment Options 对话框的General页上,不要选中Use Tab Character 和Optional Fill 复选框,这样,制表符就不会被保存。

2). 边距

  边距设置为80个字符。源代码一般不会因写一个单词而超过边距,但本规则比较灵活。只要可能,长度超过一行的语句应当用逗号或运算符换行。换行后,应缩进两个字符。

3). begin...end 语句

begin 语句必须单独占一行。例如,下面第一行是错误的,而第二行正确:

for i:=0 to 10 do begin // 错, begin 与f o r 在同一行

for i:=0 to 10 do // 对, begin 在另外一行中
begin

本规则的一个特殊情况是,当beginelse 语句的一部分时,例如:

if some statement = then
begin

  . . .
end
else begin

  Some Other Statement;
end;

注意:end 语句总单独一行。当begin 不为else 语句的一部分时,相应的end 语句与begin 语句的缩进量相同。

4).注释

  我们通常使用“{...}”类型的块注释,以前的“(*...*)”类型的块注释用于临时注释掉暂不使用的代码,从Delphi 2开始支持“//”行注释,如果决定不在支持Delphi 2.0以下的版本,可以使用“//”注释。

2.2.Object Pascal语句格式语句书写规范与用法

1). 括号

  在左括号与下一字符之间没有空格。同样,右括号与前一字符也没有空格。下面的例子演示了正确与不正确的空格。

CallProc( Aparameter ); // 错!
CallProc(Aparameter); // 正确!

  不要在语句中包含多余的括号。在源代码中,括号只有在确实需要时才使用。下面的例子演示了正确与不正确用法:

if (I=42) then // 错,括号是多余的
if (I=42) or (J=42) then // 正确,必须使用括号

2). 保留字和关键字

  Object Pascal 语言的保留字和关键字总是完全的小写。下面是Delphi 5保留字列表:

and

array

as

asm

begin

case

class

const

constructor

destructor

dispinterface

div

do

downto

else

end

except

exports

file

finalization

finally

for

function

goto

if

implementation

in

inherited

initialization

inline

interface

is

label

library

mod

nil

not

object

of

or

out

packed

procedure

program

property

raise

record

repeat

resourcestring

set

shl

shr

string

then

threadvar

to

try

type

unit

until

uses

var

while

with

xor

private

protected

public

publishedautomated  

 

3). 过程和函数

(1). 格式

  过程名应当以大写字母开始,且大小写交错以增加可读性。下面是一个不正确的写法:

procedure thisisapoorlyformattedroutinename;

改成这样写就对了:

procedure ThisIsMuchMoreReadableRoutineName;

(2). 形参

(1) 格式

  只要可能,同一类型的形参应当归并在一起:

procedure Foo(Param1,Param2,Param3:Imteger;Param4:string);

(2) 参数顺序

  形参的顺序主要要考虑寄存器调用规则。最常用的参数应当作为第一个参数,按使用频率依次从左到右排。输入参数位于输出参数之前。范围大的参数应当放在范围小的参数之前。例如:

SomeProc(aPlanet, aContinent, aCountry, aState, aCity).

  有些则例外。例如,在事件处理过程中,TObject 类型的Sender 参数往往是第一个要传递的参数。

(3) 常量参数

  要使记录、数组、短字符串或接口类型的参数不能被过程修改,就应当把形参标以Const 。这样,编译器将以最有效的方式生成代码,保证传递的参数不可变。

  如果其他类型的参数希望不被过程所修改,也可以标上Const 。尽管这对效率没有影响,但这给过程的调用者带来了更多的信息。

4). 变量

(1). 局部变量

  局部变量用于过程内部,果需要的话,应当在过程的入口处立即初始化变量。局部的AnsiString 类型的变量自动被初始化为空字符串,局部的接口和dispinterface类型的变量自动被初始化为nil,局部的Variant和OleVariant类型的变量自动被初始化为Unassigned。

(2). 全局变量

  一般不鼓励使用全局变量。不过,有时候需要用到。即使如此,也应当把全局变量限制在需要的环境中。例如,一个全局变量可能只在单元的实现部分是全局的。

  全局数据如果将由许多单元使用,就应移动到一个公用单元里被所有对象使用。全局数据可在声明时直接初始化为一个值。注意,所有全局变量自动进行零初始化,因此,不要将全局变量初始化为诸如0 、nil、或Unassigned等空值。零初始化的全局变量在.EXE文件中不占空间。零初始化的数据保存在虚拟的数据段中,而虚拟数据段只在应用程序启动时才分配内存。非零初始化的全局数据则在.EXE文件中占空间。

5). 类型

(1). 大小写规则

  类型标识符是保留字,应当全部小写。Win32 API 类型常常全部大写,并且遵循诸如Windows.pas或其他API单元中关于特定类型名的规则。对于其他变量名,第一个字母应大写,其他字母则大小写交错。下面是一些例子:

var
  MyString: string; // 保留字
  WindowsHandle: HWND; // Win32 API 类型
  I: Integer; //在System单元中引入的类型标识

(2). 浮点型

  不鼓励使用Real类型,因为它只是为了与老的Pascal代码兼容而保留的。通常情况下,对于浮点数应当使用Double。Double可被处理器优化,是IEEE定义的标准的数据格式。当需要比Double提供的范围更大时,可以使用Extend。Extend是intel专用的类型,Java不支持。当浮点变量的物理字节数很重要时(可能使用其他语言编写DLL),则应当使用Single。

(3).Variant和OleVariant

  一般不建议使用Variant和OleVariant。但是,当数据类型只有在运行期才知道时(常常是在COM和数据库应用的程序中),这两个类型对编程就有必要。当进行诸如自动化ActiveX控件的COM编程时,应当使用OleVariant;而对于非COM编程,则应当使用Variant。这是因为,Variant能够有效地保存Delphi的原生字符串,而OleVariant则将所有字符串转换为OLE字符串(即WideChar字符串),且没有引用计数功能。

6). 语句

(1). If 语句

  在if/then/else语句中,最有可能执行的情况应放在then子句中,不太可能的情况放在else子句中。为了避免出现许多if语句,可以使用case语句代替。如果多于5级,不要使用if语句。请改用更清楚的方法。不要在if语句中使用多余的括号。

  如果在if语句中有多个条件要测试,应按照计算的复杂程度从右向左排。这样,可以使代码充分利用编译器的短路估算逻辑。例如,如果Condition1比Condition2快,Condition2比Condition3快,则if语句一般应这样构造:

if Condition1 and Condition2 and Condition3 then

  如果Condition3为False的机会很大,利用短路估算逻辑,我们也可以将Condition3放在最前面:

if Condition3 and Condition1 and Condition2 then

(2). case 语句

(1) 概述

  case语句中每种情况的常量应当按数字或字母的顺序排列。每种情况的动作语句应当简短且通常不超过4 - 5 行代码。如果动作太复杂,应将代码单独放在一个过程或函数中。Case语句的else子句只用于默认情况或错误检测。

(2) 格式

  case语句遵循一般的缩进和命名规则。

(3). while 语句

  建议不要使用Exit过程来退出while循环。如果需要的话,应当使用循环条件退出循环。所有对while循环进行初始化的代码应当位于while入口前,且不要被无关的语句隔开。任何业务的辅助工作都应在循环后立即进行。

(4). for 语句

  如果循环次数是确定的,应当用for语句代替while语句。

(5). repeat 语句

  repeat语句类似于while循环,且遵循同样的规则。

(6). with 语句

(1) 概述

  with语句应小心使用。要避免过度使用with语句,尤其是在with语句中使用多个对象或记录。例如:

with Record1,Record2 do

  这些情况很容易迷惑编程人员,且导致调试困难。

(2) 格式

  with语句也遵循本章关于命名和缩进的规则。

7). 结构化异常处理

(1). 概述

  异常处理主要用于纠正错误和保护资源。这意味着,凡是分配资源的地方,都必须使用try...finally来保证资源得到释放。不过,如果是在单元的初始/结束部分或者对象的构造器/析构器中来分配/释放资源则例外。

(2). try...finally的用法

  在可能的情况下,每个资源分配应当与try...finally结构匹配,例如,下面代码可能导致错误:

SomeClass1 := TSomeClass.Create;
SomeClass2 := TSomeClass.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;

  但有时如果有许多类都需要同时创建,上述方案就显得非常累赘。这时候,我建议使用下述的一个安全方案:

SomeClass1 := nil;
SomeClass2 := nil;
SomeClass1 := TSomeClass.Create;
SomeClass2 := TSomeClass.Create;
try
  { do some code }
finally
  FreeAndNi

[1] [2] [3]  下一页


[Delphi程序]delphi代码标准文档(  
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台