相关文章
热点文章
- Delphi数据库编程教程
- Delphi与Excel的亲密接..
- delphi7从入门到精通之..
- 利用Delphi编写Socket..
- Delphi数据库编程教程..
- Delphi数据库编程教程..
- Delphi数据库编程教程..
- Delphi数据库编程教程..
- Delphi数据库编程教程..
- 在DELPHI程序中使用AD..
- Delphi数据库编程教程..
- delphi7从入门到精通之..
- Delphi数据库编程教程..
- Delphi控件的使用经验
- Delphi数据库编程教程..
- 利用网站短信漏洞,做..
- delphi7从入门到精通之..
- Delphi报表控件----SR..
- 远程控制篇:通过IP地..
- 用Word做Delphi报表输..
Delphi编码规范
- 阅览次数:
- 文章来源: csdn
- 原文作者: Tulipsys
- 整理日期: 2004-08-24
- 发表评论
2. 语句
2.1 begin…end语句
begin和end语句要独占一行,begin要与上一层的第一个字母对齐,也就是说在换行之后不要留任何空格而直接写begin,end要与所对应的begin对齐。本规则可以用在任何地方。下面是正确的写法:
for i:= 1 to 10 do
begin
…
end;
但在if语句中有个特例,如下:
if Condition then
begin
…
end
else begin
…
end;
这样写的原则是要保证程序足够紧凑。语句分层的好处是使我们面对一个清晰的程序段,但是过分的、不尽合理的分层会使程序过于松散,这同样是需要避免的。
2.2 if语句
将最有可能执行的情况放在then语句中,不太可能的情况放在else子句中。这样对维护来说不会带来多少帮助,但会使程序效率更高。
多级if语句的可读性不强,所以应经尽能避免出现多级if语句。当多于5级时,就该考虑使用case语句代替if语句。
不要在if语句中使用不必要的括号。在源代码中,括号除了语法作用外在就是在必要时对条件分段,以增加程序的可读性。所以在if语句中,如果条件明了而且在语法上不需要括号,那么就不要使用括号;如果条件过于复杂,那么就使用几个括号。总之,一切为了清晰。
如果在if语句中有多个条件要测试,应按照计算的复杂度进行排列。比如有三个条件:Condition1、Condition2和Condition3。按照这个顺序,复杂度依次上升,与就是说Condition1比Condition2快,Condition2比Condition3快,则if语句就这么写:
if Condition1 and Condition2 and Condition3 then
begin
…
end;
2.3 case语句
case语句中每种情况的常量应当按照字母或数字的顺序排列。
每种情况的处理与语句不要行数太多,因为这样会使整个case语句过长。应该尽量使用过程或函数以减少case语句的复杂度。
case语句的else子句只用于处理默认情况或进行错误检测。
2.4 for语句
循环语句共有三种:for语句、while语句和repeat语句。如果循环次数确定,那么就使用for语句;如果在第一次循环之前要实现执行一次以获得初始比较数值,那么就使用repeat语句;其他情况基本上都可以使用while语句。实际上这三条语句可以覆盖所有的循环需要,而且可以互相替代。
在Delphi中要注意,for语句中的循环变量不可以在循环体中被赋值。这是与Turbo Pascal不同的地方。
另外,在循环语句,尤其是多个循环嵌套使用的代码中,要小心使用break和exit关键字。
2.5 while语句
建议不要使用exit来退出while循环。退出循环的最好方法是通过循环条件。如果在循环体中要考虑到意外处理,那么就要搞清楚处理的方式和对相关变量的影响。
2.6 repeat语句
repeat语句类似于while语句,且遵循同样的规则。
2.7 with语句
with语句是一类非常容易出错的语句,使用with语句可以有效避免重复的输入工作。但是这样会使程序难以检查。所以,不要随便使用with语句,而且绝对不要使用带有两个或多于两个对象或记录的with语句。顺便提一下,尽量不要随便使用with语句的原因不是因为易于出错,而是因为难以排错。考虑下面的例子:
with Label1, Label2 do
begin
…
Caption := “Delphi”;
…
end;
这样会出现什么问题呢?因为这条语句夹在众多语句之中,所以当程序出现问题时很难搞明白是怎么回事。
3. 过程和函数
3.1 命名与格式
(1) 过程和函数的名称应当由一个或多个完整的单词组成。名称的首字母应当大写,其后每个单词的首字母也应当大写,其它字母则小写。如果名称过长,可以考虑使用单词的缩写,但是要使用常用的缩写,比如:Tmp、Str。对于使用英文简写的单词或词组要全部使用大写字母,比如:ID、UTS。下面是几个正确的写法:GetUserID、InputPassword、FindUserListFile、ImportUserNameFromStr。
(2) 过程或函数的名称应当能够简单的表示该过程或函数的行为。使用动词和名词为过程和函数命名,动词表示行为,而名词表示行为的对象或目的。根据惯例,设置输入参数值的过程名要以Set为前缀,读取数值的函数名要以Get为前缀。下面是几个正确的命名:SaveToFile、ReadFromFile、SetUserID、GetUsersNumber。
3.2 形参
(1) 格式:形参的排列要按照日常惯用的顺序,比如:姓名、性别、年龄。而且在此基础上要尽可能地把同一类型的形参归并在一起。例如:
procedure SetUserInformation(Name, ID: string; Age: integer);
(2) 命名:所有的形参的命名要能够表达出该形参的用途。在合适的情况下,形参的名称最好以大写字母A为前缀。
(3) 读写规则:Delphi中有const和var形参,分别表示了对形参的读写控制。在形参列表中最好能够明确表示。
3.3 变量
(1) 使用规则:在程序的开始阶段要对所有的变量赋予明确的数值。普通类型变量要选择合适的数值;类的实例如果此时不需要创建,那么就赋值为NIL。所以,在主程序、过程或函数中要明确程序的初始化部分和程序的功能部分。
(2) 全局变量:在程序设计中,应该尽可能的避免使用全局变量。因为在程序的很多地方有可能修改全局变量的值,如果缺乏良好的管理机制,这将会使程序变得十分脆弱。而实际上很难在一个成百上千行的程序中对全局变量进行有效的监控。如果要使用全局变量,那么就尽可能在单元文件(.pas)的实现部分声明该变量。这样该变量就只在此文件中有效,而不会被其它文件访问。将全局变量放在单元文件的接口部分是很危险的。
(3) 局部变量:局部变量用于例程内部,遵循其它变量的命名规则。而且应该在例程的入口处立即初始化变量。
3.4 类型
大小写规则:因为类型标志符是保留字,所以应该全部小写。对于引用的其他公司、组织或个人的数据类型则尽可能地保留原样。
3.5 自定义类型
(1) 命名:对于自定义数据类型要以大写字母T为前缀,这样可以分清自定义数据类型和变量。名称的其它部分的命名遵守命名的一般惯例。
(2) 枚举类型:枚举类型的名称应该能够代表该枚举类型的用途。枚举类型的标志符列表的前缀应该包含两个或三个小写字母,以彼此关联,这些字母依次是组成枚举类型名称的单词的首字母。例如:
TAlign = (alNone, alTop, alBottom, alLeft, alRight, alClient, alCustom);
4. 面向对象相关
4.1 类的命名与格式
首先,类的名称应当能够清晰表达类的用途;其次,类的名称之前要以大写字母T开头,以表示这是一个自定义数据类型。在Delphi中,所有的类的祖先类都是TObject,在定义类中要明确表示出类的祖先类。也就是说,即使该类的祖先类是TObject,也要表明(在Delphi中如果不写明类的祖先类,那么就默认其祖先类为TObject)。
例如:
type
TCar = class(TObject)
private
…
protected
…
public
…
end
类的实例的名称可以与类名相同,如果只有一个实例时就使用没有前缀T的类名;如果有多个实例,那么就另外在前面添加其他合适的单词。
在一个单元文件中只可以定义一个类,而且单元文件的名称要与去掉前缀T的类名相同。如果在一个单元文件中定义了多个类,那么一个类就可以直接访问另一个类的私有字段或受保护字段,而不管该字段是否定义为只读。单元文件使用类的名称的目的是我们可以通过文件名直接察觉到类的大概,这样便于使用。
4.2 字段
字段的命名与变量的命名遵从同样的规则,但是要加上大写字母F为前缀,以表示这是一个字段。另外,字段名称应该为名词,而且要注意单词复数的使用(数组字段应当是复数,表示集合含义的字段也应该使用复数名称)。
所有的字段必须为私有,这样就可以通过属性来决定该字段在类的作用域之外的访问属性。这样组的目的是保证类的封装性。
字段名称的排列要参照字段的含义。参考名片管理系统,对一张名片我们首先关心的是姓名,然后是性别,然后是年龄,然后是各种联系方式,如果更细致一点就要考虑生日、家庭成员等。于是我们可以简单的定义类:
type
TBusinessCard = class(TObject)
private
FName: string;
FSex: string;
FAge: integer;
FEmail: string;
…
public
…
end;
4.3 方法
方法的命名与过程和函数的命名遵从同样的规则。对于读写某个字段的方法要使用Get或Set前缀加去掉前缀F的字段名作为名称,前缀Get表示读,Set表示写。如果希望某个字段具有只读属性,那么仅仅为其定义Get为前缀的方法并在属性中将其关联。
如果不希望一个方法被派生类覆盖,就使用静态方法;如果希望一个方法被派生类覆盖就使用虚拟方法;如果类的方法要被多个派生类直接或间接的使用,就使用动态方法;如果一个类需要创建实例,那么就不要使用抽象方法。
要注意方法的访问属性。类的外部接口通过方法实现,应当尽可能的使必要的方法作为接口,其它的方法要定义为私有方法。比如定义方法ExportNameList,其中有使用了一个子方法ExportName,如果不需要外部使用方法ExportName,那么就将其定义为私有方法,将ExportNameList定义为公有方法。
方法的参数尽量以字母A为前缀。如果某个方法使用参数:AName,那么此方法很可能要用到字段FName或属性Name,这样在实现代码中就不会将它们混淆。
在方法的定义中要将同样用途或为了实现同一目标的方法分为一组,在一组的第一个方法的前面和最后一个方法后面各留上一个空行即可。
4.4 属性
属性作为私有字段的访问器,应该使用相应字段的名称,但要去掉前缀F。
4.5 方法的实现
在方法的实现代码中要注意字段的访问方法。可以直接使用字段来访问,也可以使用属性。如果要对字段进行写操作,那么就直接使用字段;如果仅仅进行读操作,那么就使用属性。其实,在任何条件下都使用字段也很值得考虑。
如果要在程序发表后要修改某个方法,那么尽量不要改变现有的接口而通过修改实现代码,或者提供新的接口方法来实现。
首先要实现类的constructor和destructor方法,然后按照方法的定义顺序依次实现。
[1] [2]
下一篇:Photoshop调色,制作阿宝色彩的练习
