首页 > 编程 > Delphi > 正文

Delphi编码规范

2019-11-18 18:34:31
字体:
来源:转载
供稿:网友
Delphi编码规范
作者:Tulipsys 更新日期:2003年12月16日
目录
1.  一般的惯例(命名 - 缩进和空格 - 边距 - 大小写 - 注释)
2.  语句(begin…end语句-if语句-case语句-for语句-while语句-repeat语句-with语句-异常处理语句)
3.  过程和函数(命名与格式-形参-变量-类型-自定义类型)
4.  面向对象相关(类的命名与格式-字段-方法-属性-方法的实现)
 
制定编码规范的目的是为了使一组程序员生成同样风格的代码,使一个团队形成并保持一定的风格。如果这个目标能够实现,那么整个项目的文件看上去就像是一个程序员写的。好性很好玩,但这样的好处是每个程序员的代码都易于为他人所理解,从而会在很大程度上提高代码的可维护性,也因此会降低维护费用。对于任何团队来说,这均是一个十分理想的境界。对于个人,选择或自我生成一种编码规范,并坚持这个规范,同样会产生良好的效果。顺便提一下这是一个十分诱人的目标,不过并不太难实现。
每种程序设计语言都有属于自己的编码规范,编码规范可以说是经验的总结,当然也要借鉴其他的程序设计语言的规范。所以,向别人学习是十分重要的。其次,编码规范的使用是为了简化程序员的工作,“简化”的含义不是减少代码量(相反,很多时候遵从规范会带来更多的代码),而是减少程序员在维护代码时的劳动量。程序设计是一种非常复杂的工作,处理各种各样的关系是令人生畏的,而且各种关系之间还有着千丝万缕的联系。程序员应将大部分精力用来处理关系,而避免在过于细节的问题上浪费心机。如果他一眼就能够明白程序的思路和结构,那么对维护方案就会很快形成。而且,编码规范应该是一个非常人性化的规范,你可以参考,也可以修改,但是要保证易于使用。但是在一个小组中要保证大家使用同样的规范。程序设计是非常灵活的工作,只有灵活的思考,灵活的应用,才可能得到好的结果。另外,使用规范在很大程度上是为了减少程序员的记忆负担。人的思维能力是极其优秀的,而记忆则十分可怜,我们整天面对电脑,她要帮我们做得很重要的事情应该是记忆。所以尽可能发挥程序员的思维优势是我们的目标之一。
最后,程序设计工具对编码规范有很大的影响,这个影响来源于开发商的程序设计风格。同样基于C++,在Microsoft Visual C++和Borland C++ Builder中我们不会使用完全相同的编码规范。Microsoft和Borland有着各自不同的而且十分鲜明的风格。作为用户,我们可以在此基础上有所改变,但是这是有限度的。其实,在做出对供应商和开发工具的选择时,我们同时确定了我们未来的风格。
 
1. 一般的惯例
1.1   命名
命名的基本原则是名称要能够明确表示数据的功能。
Object Pascal支持长文件名。名称应该使用动词、名词或二者的组合。绝对不可以使用Delphi中定义的保留字和关键字,而且尽量不要使用其他语言中定义的保留字和关键字。尽量使用完整的词语而避免使用缩写、前缀和后缀、下划线或其它符号,不推荐使用匈牙利命名法。
命名规范是为了确保名称的可读性。以匈牙利命名法为代表的命名规范制定了许多前缀和后缀以表示数据的类型、作用域或其它各种属性。在Delphi中,你当然可用这种方法,但是这不是推荐的方法。有个原因是这类命名规范带来个太多额外的记忆任务,另外一个原因是由Delphi自身的特点决定的。Delphi的强制类型检查会自动监测所有的变量使用状况,所以只需要我们稍加留心(注意单词的大小写)而不必费劲的添加五花八门的前缀。另外,对数据的考虑要基于含义而不是类型或作用域,注意力应该放在放在程序结构、逻辑关系和设计思路上。所以在Delphi中只需要使用完整的词语组合来命名,不要考虑其它,当然应该尽可能的保持简洁。
在一些语句(比如for循环)中我们要用到若干个整形数作为计数变量。在此可以简单的使用i、j、k这三个字母作为变量名称。这是在Fortran语言中形成并被保留下来的习惯,事实证明这非常好用并且易于理解。当然,我们使用更有意义的名称会产生更好的效果,比如:MyCounter。一般来说i、j、k三个字母已完全够用了,否则应该划分出更多的过程或函数。
下面是几个例子:
1.  SongsList  //表明这是一个歌曲的列表,song使用复数表明歌曲不止一首
2.  SetCarColor  //表明这是一个设置汽车颜色的函数,若定义了一个TCar类,那么在类中就使用SetColor作为设置汽车颜色的函数成员。
另外要注意对布尔变量的命名。布尔变量的名称要能够明确的表示出True和False的含义。比如说记录某文件是否存在的变量,使用IsFileExisted,就比使用FileExisted好。
最后,永远不要将一个全局变量命名为:Temp或Tmp,但是在过程或函数中如此命名还是允许的。其实对于这条规则存在一点争议,在有的编码规范中更为严格,如此命名是绝对禁止的,即使是在过程或函数中。但是,很多时候这样命名的确很方便,尤其对于过程或函数。如果作为全局变量,很可能会出现类型不匹配的赋值语句,虽然此时编译器会给你很大的帮助,但是难以避免细小错误的发生。总之,遵守此规则会产生较好的效果,但是在必要的情况下没有什么是要严格遵守的。
 
1.2   缩进和空格
每级之间要缩进两个空格,这样会使程序层次分明,错落有致。千万不要使用制表符,因为制表符的宽度随不同的设置和应用程序的不同而难以保持一致,可不要指望你的程序只在Delphi中察看。另外要注意编辑器的使用,如果你只选择了Delphi,那么没有什么问题;如果你同时还使用了Word等文本处理器,请注意要使用适当的字体,以确保每个字母、符号的宽度相同。用Word等文本处理器打印时,同样要注意字体的选择。
空格的使用同样是为了保持程序的整洁,是程序员能够快速明白程序结构。下面是一些规范和相应的例子:
1. 每个单词之间要留有一个空格。例如:for TMyClass = class(TObject)
2. 在“=”、“<>”、“>=”、“<=”左右要留有一个空格;在“:=”和“:”右边要留有一个空格,而左边不留。例如:if a = b then a:= b;a: integer;
3. 保留字和关键字与左边的符号间要留有一个空格,与右边的符号间不留。例如:PRocedure ShowMessage; overload;
4. 括号的使用:在过程和函数的定义和调用中,括号与外部的单词和符号之间不留空格;与内部的单词之间不留空格。在if语句的条件判断中,与and、or等保留字之间要使用空格。例如:function Exchange(a: integer; b: integer); if (a = b) and ((a = c) or (a = d)) then … end;
 
1.3   边距
Delphi编辑器在右边大约第81个字符处留有一条暗线,实际上在Delphi的默认界面下,当分辨率在800*600时,最大化窗口将显示到该暗线左边4个字母处。因此,不要将源代码写到暗线之外,也就是说每行包括前面和中间的空格不要多于80个字符。如果语句过长,那么换行完成,换行后要缩进两个字符。这样也易于打印,在Delphi中超过暗线的部分不会被打印。如果使用Word等文字处理软件打印Delphi程序,超出的部分会调到下一行的首部,这样打印出的程序将难以阅读。所以,尽量在编写代码的时候做好一切调整,不要把这种工作留到打印的时候进行。
换行时要注意保持程序的可读性,尽量保持完整的部分。作为例子,如果函数过长,那么再换行时要将某个完整的参数说明换行,而不要只将数据类型声明换行。下面的前两种写法是正确的,后面的几种写法都是错误的:
function AdditonFiveInputNumber(a: integer; b: integer; c: integer; d: ineger;
e: integer): integer;                      //正确
 
function AdditonFiveInputNumber(
a: integer;
b: integer;
c: integer;
d: ineger;
e: integer): integer;                      //正确
 
function AdditonFiveInputNumber(a: integer; b: integer; c: integer; d:
ineger; e: integer): integer;              //错误
 
function AdditonFiveInputNumber(a: integer; b: integer; c: integer; d: ineger;
e: integer): integer;                           //错误
 
function AdditonFiveInputNumber(a: integer; b: integer; c: integer; d: ineger;
e: integer): integer;                       //错误
 
1.4   大小写
所有的自定义名称中的每个单词的首字母要使用大写,其它字母使用小写。Delphi保留字和关键字要全部使用小写。Delphi预定义函数的写法与自定义名称写法相同。Delphi中的基本数据类型要使用小写,扩展的类类型要的前两个字母要大写(类类型的首字母是“T”)。下面是一些例子:
1.  自定义名称:MyFavouriteSong, CarList;
2.  保留字:if (a = b) and ((a = c) or (a = d)) then … end;
3.  Delphi预定义函数:ShowMessage('Everything all right');
4.  Delphi扩展类类型:MyStrings = TStrings.Create;
 
1.5   注释
Delphi支持两种注释:块注释({})和单行注释(//)。注释的作用是为了解释程序的设计思路,帮助程序员尽快明白两年前甚至昨天写的程序的思路。这实际上是为了解决记忆问题,大脑不该被过分作为存储器使用,在程序设计中永远不要过分依赖大脑,而要尽可能借助文字。所以说,注释在程序设计语言中是十分重要的方面,尽管很多人(尤其是初学者,也包括相当数量的程序员)对此毫不介意,他们很少写注释。注释的另外一个应用是在程序调试阶段,比如说有两个语句,事先并不知道哪一个更好,于是需要测试:将一条语句前放置"//"(也就是说将这条语句改为注释),运行另一条语句,然后再做相反的工作,我们就可以轻松做出选择。如果是一组语句,那就用块注释,但一定注意要将"{"和"}"放在显眼的位置,比如说放在单独的上下两行。下面是一些使用原则:
1. 多数情况下,在自定义变量、类型的前面放置注释是有必要的。
2. 多数情况下,在单元文件顶部放置注释是必要的。在此,注释中要包含:文件名、创建日期、修改日期、作者、修改作者以及必要的描述。
3. 注释要有意义,不要使用没用的注释。比如:
while i < 8 do
begin
  …
  i:= i + 1;   //Add one to i
end;
注释“//Add one to i”在此是毫无意义的,当然并不是说简单的语句(类似于:i : = i + 1)就不需要注释。因为简单的语句往往会起到十分重要的作用,所以,如果这条语句会使人产生疑问或者让人难以理解,那么就要将此语句的作用标记下来。
4. 不要试图在注释中创建组合图案,除非你认为这十分必要。因为在保持图案完整美观的情况下修改注释是非常困难的。。
5. 要区分临时注释和永久注释,你可以用你的方法在注释中放置特殊符号来区分。这样的好处是易于查找。
6. 对语句的更改要映射到相应的注释中。
7. 注释与代码间要留有明显的间隔,要一眼就能够分清楚哪是语句哪是注释。可以将注释放在代码行的前一行、后一行或留有至少两个空格紧跟在代码的后面,但是在代码与注释在同一行时不要使代码跟在注释的后面,另外,不要将在注释放在代码中间。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选