Delphi代码规范

本规范的目的:给自己的代码一个统一而标准的外观,增强可读性,可理解性,可维护性
本规范的原则:名称反映含义,形式反映结构
1、单元风格
2、各区风格
3、语句风格
4、命名规则

参考:Borland官方Object Pascal风格指南
Delphi5程序员指南编码标准
1、单元风格
{*******************************************************}
{                                                       }
{                     项目名称                          }
{                                                       }
{            版权所有 (C) 2000,2001 公司名称            }
{                                                       }
{*******************************************************}

unit UnitName;
{*******************************************************
项目:
模块:
描述:
版本:
日期:
作者:
更新:
TODO:
*******************************************************}

interface

uses
—-,—-,—-,—-,—-,—-,—-,—-,—-,—-,—-,
—-,—-, —-,—-,—-,—-;

const
——————–;
——————–;
——————–;

type
——————–;
——————–;
——————–;
——————–;
——————–;
——————–;

var
——————–;
——————–;
——————–;

implementation

uses
—-,—-,—-,—-;

{$R *.RES}
{$R *.DFM}

——————————–;
——————————–;
——————————–;
——————————–;
——————————–;
——————————–;
——————————–;
——————————–;
——————————–;
——————————–;
——————————–;
——————————–;

end.

返回

2、各区风格
0、注释与空白
用{ } 不用 //
主题注释,函数过程目的说明,语句注释
空行 :版权块,类之间,方法之间–(两行) 方法内部块(一行)
空格 :用以增强清晰度
缩进 :两个空格

1、常量区
基本:

Const
—–    = —-;
—–    = —-;
—–    = —-;
—–    = —-;

扩展
前缀: 少则C_—;多则可以每个主题有一个前缀
Const

{ 主题1 }
C_—    = —-; { 含义 }
C_—    = —-; { 含义 }
C_—    = —-; { 含义 }
C_—    = —-; { 含义 }
{ 主题2 }
—–    = —-;
—–    = —-;
—–    = —-;
—–    = —-;

资源字符串,放在变量区后面

resourcestring

const
S_—    = ‘—-‘;
S_—    = ‘—-‘;
S_—    = ‘—-‘;

例子:

CM_BASE                 = $B000;
CM_ACTIVATE             = CM_BASE + 0;
CM_DEACTIVATE           = CM_BASE + 1;
CM_GOTFOCUS             = CM_BASE + 2;
CM_LOSTFOCUS            = CM_BASE + 3;
NumPaletteEntries = 20;
BoxPoints : array[0..5, 0..2] of GLfloat =
( (-1, 0, 0),
( 0, 1, 0),
( 1, 0, 0),
( 0, -1, 0),
( 0, 0, 1),
( 0, 0, -1) );

{ Variant type codes (wtypes.h) }

varEmpty       = $0000; { vt_empty   }
varNull        = $0001; { vt_null        }
varSmallint    = $0002; { vt_i2          }
GIFVersions : array[gv87a..gv89a] of TGIFVersionRec = (’87a’, ’89a’);

2、类型区
数据类型–>不提供服务的数据类型
T—- = ———
对象类型–>有状态并提供服务的实体
T—- = class(—-)
private
——–
——–
protected
——–
——–
public
——–
——–
published
——–
——–
end;

按字母排序

Private
1、所有数据放在Private 区,以F打头
2、所有事件属性对应的方法指针放在Private 区,以F打头
3、属性的Get与Set方法放在Private 区–>不准备被继承
4、响应消息的方法放在Private 区
protected
1、被子类调用的但不能被外界调用的方法与属性
2、供子类重载的方法 virsual;      virsual; abstract
public
1、构建析构方法
2、供外界调用的方法
3、供外界调用的属性
published
1、出现在Object Inspector里供设计时用的属性
2、出现在Object Inspector里供设计时用的事件响应

例子:

TGIFVersion = (gvUnknown, gv87a, gv89a);
TGIFVersionRec = array[0..2] of char;
PInterfaceTable = ^TInterfaceTable;
TInterfaceTable = packed record
EntryCount: Integer;
Entries: array[0..9999] of TInterfaceEntry;

{ forword declairation }
TGIFImage = class;
TGIFSubImage = class;
{—————————
TGIFItem
—————————}
TGIFItem = class(TPersistent)
private
FGIFImage: TGIFImage;
………….
end;

3、变量区
定义全局变量
注意不要有缺省的类对象变量,在调用者中声明!
var
———–: ——-;
———–: ——-;
例子:
GIFDelayExp: integer = 10;          { Delay multiplier in mS.}
GIFDelayExp: integer = 12;

4、实现区
{———————————————————
主题
———————————————————-}

{ 方法的目的 }
procedure —————————-
begin
——–;
——–;
end;

{ 方法的目的 }
function —————————–
begin
——–;
——–;
end;

5、过程与函数
命名
格式

返回

3、语句风格
1、简单语句
——-;
2、复合语句
begin
—–;
—–;
end;

3、赋值语句
— := ——-;
— := (– + –)* (– / –);

4、局部变量
var
—: —;
—: —;
对于逻辑上并列的变量组:
var
—,
—,
—: —;

5、数组声明
— = array [*..*] of —;

6、if 语句
if (——–) then
————-;

if (——–) then
begin
————-;
————-;
————-;
end;

if (——–) then
————-;
else
————-;

if (——–) then
begin
————-;
————-;
————-;
end else
————-;

if (——–) then
begin
————-;
————-;
————-;
end else
begin
————-;
————-;
————-;
end;

if (——–) then
————-
else if (——–) then
————-;

7、for 循环

for I := ——– to ——– do
————-;

for I := ——– to ——– do
begin
————-;
————-;
————-;
end;

for I := ——– to ——– do
if (——–) then
begin
————-;
————-;
————-;
end;

for I := ——– to ——– do
with ——– then
begin
————-;
————-;
————-;
end;

8、while 循环

while —— do
begin
————-;
————-;
————-;
end;

9、repeat 循环
repeat
————-;
————-;
————-;
until ——;

10、case 语句

case ——– of
——– :   ————-;
——– :   ————-;
——– :   ————-;
else    ————-;
end;

case ——– of
——– :
—————————————————————–;
——– :
—————————————————————–;
——– :
—————————————————————–;
else
—————————————————————–;
end;

case ——– of
——– : begin
————————–;
————————–;
————————–;
end;
——– : begin
————————–;
————————–;
————————–;
end;
——– : begin
————————–;
————————–;
————————–;
end
else begin
————-;
————-;
————-;
end;

end;

11、with 语句
with ——– do
————-;

with ——– do
begin
————-;
————-;
————-;
end;

12、try 语句
try
————-;
————-;
————-;
finally
————-;
————-;
————-;
end;

try
try
————-;
————-;
————-;
except
————-;
————-;
end;
finally
————-;
————-;
————-;
end;

13、其它
运算:运算符前后要有空格
w1[n] := ((i + 1) * v0[n] + j * v1[n] + (k – 1) * v2[n]) / depth;

— = —
— >= —
— <= —
— > —
— < —
— <> —
— := –;   赋值
–: —-;   类型

同一类型且含义逻辑上不并列的变量 20个字符长的变量名
private
——-                 : ——-;
——-                 : ——-;
——-                 : ——-;
——-                 : ——-;
——-                 : ——-;
var
——-                 : ——-;
——-                 : ——-;
——-                 : ——-;
——-                 : ——-;
——-                 : ——-;
function ———————(–: —-; –: —-; –: —-): —-;

同一类型且含义逻辑上并列的变量 如 Error0,Error1,Error2 ; R,G,B
private
——-              ,
——-              ,
——-              ,
——-              ,
——-              : ——-
var
——-              ,
——-              ,
——-              ,
——-              ,
——-              : ——-
function ———————(–, –, –: —-; var –, –, –: —-): —-;

T——- = class(——-)
private
F——-: ——-;
F——-: ——-;
F——-: ——-;
function ————–: ——-;
procedure ————–;
protected
function ————–: ——-;
procedure ————–;
function ————–: ——-; virtual; abstract;
public
constructor Create(——-: ——-); override;   {if need to do something after Create}
destructor Destroy; override;                     {if need to do something before Destroy}
function ————–: ——-;
procedure ————–;
property ——-: ——- read F——-;
published

end;

14、形式反映结构
例子:
TetIndex : array[0..3] of TInteger3v =
( (0, 1, 3),
(2, 1, 0),
(3, 2, 0),
(1, 2, 3) );
Cursors: array[0..4] of TIdentMapEntry = (
(Value: crDefault;      Name: ‘crDefault’),
(Value: crArrow;        Name: ‘crArrow’),
(Value: crCross;        Name: ‘crCross’),
(Value: crIBeam;        Name: ‘crIBeam’) );

if    (dwFlags and PFD_DRAW_TO_WINDOW) = 0)
or(    (dwFlags and PFD_SUPPORT_OPENGL) = 0)
or(   (dwFlags and PFD_DOUBLEBUFFER) = 0)
or (iPixelType <> PFD_TYPE_RGBA)
or (cColorBits < 16)
)
) then
raise Exception.Create(‘Inappropriate Pixel Format chosen.’);

glBegin(shadeType);
glNormal3fv(@n0);
glVertex3fv(@dodec[a, 0]);
glVertex3fv(@dodec[b, 0]);
glVertex3fv(@dodec

);
glVertex3fv(@dodec[d, 0]);
glVertex3fv(@dodec[e, 0]);
glEnd();

dodec[0, 0] := -alpha; dodec[0, 1] := 0;       dodec[0, 2] := beta;
dodec[1, 0] := alpha;   dodec[1, 1] := 0;       dodec[1, 2] := beta;
dodec[2, 0] := -1;      dodec[2, 1] := -1;      dodec[2, 2] := -1;

procedure glutWireTorus(
innerRadius : GLdouble; //———
outerRadius : GLdouble; //———
nsides      : GLint;     //———
rings       : GLint );   //———
case FRunDirection of
rdRightToLeft : begin
StY:=CnY;
StX:=Width – CurrentStep;
end;
rdLeftToRight : begin
StY:=CnY;
StX:=-CurrentStep;
end;
rdBottomToTop : begin
StX:=CnX;
StY:=Height – CurrentStep;
end;
rdTopToBottom : begin
StX:=CnX;
StY:=CurrentStep – RTHeight;
end;
else begin
StX:=CnX;
StY:=CnY;
end;
end;

case (DitherMode) of
dmNearest:
Ditherer := TDitherEngine.Create(Bitmap.Width, ColorLookup);
dmFloydSteinberg:
Ditherer := TFloydSteinbergDitherer.Create(Bitmap.Width, ColorLookup);
dmStucki:
Ditherer := TStuckiDitherer.Create(Bitmap.Width, ColorLookup);
dmSierra:
Ditherer := TSierraDitherer.Create(Bitmap.Width, ColorLookup);
dmJaJuNI:
Ditherer := TJaJuNIDitherer.Create(Bitmap.Width, ColorLookup);
dmSteveArche:
Ditherer := TSteveArcheDitherer.Create(Bitmap.Width, ColorLookup);
dmBurkes:
Ditherer := TBurkesDitherer.Create(Bitmap.Width, ColorLookup);
else
exit;
end;

返回

4、命名规则
1、文件名称:   u模块名称;见名知意
2、控件名称:   功能_控件缩写;见名知意
3、变量         :   尽量不用缩写,尽量用名词;见名知意
4、方法与过程:尽量不用缩写,尽量用动宾词组;见名知意
5、常见的惯例
类名以T打头 (Type之意)
类的私有数据域以F打头(Field之意)
对数据的存取操作分别以Set,Get打头
事件属性以On打头