编码标准主要是为开发组提供一种编程时的准则,使项目开发人员在编程时有一致格式可遵循。这样,开发组中每个编程人员编写的代码能够被其他人理解,从而提高代码的可维护性,使得一套多人写的软件就像一人写的,使得代码更易理解。这要求大家使用一致的代码样式。
那么,之所以老生常谈介绍这些标准,是因为当新的开发人员加入项目开发组时,有的可能还不熟悉Delphi的编码标准。
在这里将分以下几类来介绍这些标准:
1 一般的源代码格式规则
2过程和函数
3 文件、窗体与数据模块命名
4 包、组件命名
一般的源代码格式规则
缩进
缩进就是每级间有两个空格。不要在源代码中放置制表符。这是因为,制表符的宽度随着不同的设置和代码管理实用程序(打印、文档及版本控制等)而不同。
边距
边距设置为80个字符。源代码一般不会因写一个单词而超过边距,但本规则比较灵活。只要可能,长度超过一行的语句应当用逗号或运算符换行。换行后,应缩进两个字符。
括号
在左括号与下一字符之间没有空格。同样,右括号与前一字符也没有空格。
下面的例子演示了正确与不正确的空格。
CallProcedure( Parameters ); // 错!
CallProcedure (Parameters); // 正确!
保留字和关键字
Object Pascal语言的保留字和关键字总是完全的小写。
begin...end
begin语句必须单独占一行。
例如,下面第一行是错误的,而第二行正确:
for i:=0 to 10 do begin
Statement
end// 错, begin 与for在同一行
for i:=0 to 10 do //正确! begin 在另外一行中
begin
Statement
end
本规则的一个特殊情况是,当begin为else语句的一部分时。
例如:
if Condition then
begin
Statement
end
else begin
Statement;
end
end语句总单独一行。当begin不为else语句的一部分时,相应的end语句与begin语句的缩进量相同。
语句
(1) if_then_else语句
最有可能执行的情况应放在then子句中,不太可能的情况放在else子句中。
为了避免出现许多i f语句,可以使用case语句代替。
如果多于5级,不要使用i f语句。请改用更清楚的方法。
不要在i f语句中使用多余的括号。在源代码中,括号只有在确实需要时才使用。
例如:
if (I=42) then // 错,括号是多余的
if (I=42) or (J=42) then // 正确,必须使用括号
如果在i f语句中有多个条件要测试,应按照计算的复杂程度从右向左排。这样,可以使代码充分利用编译器的短路估算逻辑。如果Condition1比Condition2快,Condition2比Condition3快,则if语句应这样构造:if Conditior1 and Condition2 and Condition3 then
(2) case_else语句
case语句中每种情况的常量应当按数字或字母的顺序排列。
每种情况的动作语句应当简短且通常不超过4 ~ 5行代码。如果动作太复杂,应将代码单独放在一个过程或函数中。case语句的else子句只用于默认情况或错误检测。
(3) while 语句
建议不要使用exit过程来退出while循环。如果需要的话,应当使用循环条件退出循环。所有对w h i l e循环进行初始化的代码应当位于w h i l e入口前,且不要被无关的语句隔开。任何业务的辅助工作都应在循环后立即进行。
(4) for语句
如果循环次数是确定的,应当用for语句代替while语句。
(5) repeat语句
repeat语句类似于while循环,且遵循同样的规则。
(6) with语句
with语句应小心使用。要避免过度使用with语句,尤其是在with语句中使用多个对象或记录。
例如:
with Record1,Record2 do
这些情况很容易迷惑编程人员,且导致调试困难。
结构化异常处理
异常处理主要用于纠正错误和保护资源。这意味着,凡是分配资源的地方,都必须使用try... finally来保证资源得到释放。不过,如果是在单元的初始/结束部分或者对象的构造器/析构器中来分配/释放资源则例外。
(1) try... finally的用法
在可能的情况下,每个资源分配应当与try... finally结构匹配。
例如:
//下面代码可能导致错误
SomeClass1: = TSomeClass.Create;
SomeClass2: = TSomeClass.Create;
try
{do some code}
finally
SomeClass.Free;
SomeClass.Free;
e n d ;
//上述资源分配的一个安全方案是:
SomeClass1: = TSomeClass Create;
try
SomeClass2: = TSomeClass Create;
try
{do some code}
finally
SomeClass2.Free;
end;
finally
SomeClass1.Free;
end;
(2) try...except的用法
如果你希望在发生异常时执行一些任务,可以使用try...except。通常,没有必要为了简单地显示一个错误信息而使用try...except,因为Application对象能够自动根据上下文做到这一点。如果要在子句中激活默认的异常处理,可以再次触发异常。
(3) try... except...else的用法
不鼓励使用带else子句的try...except,因为这将阻塞所有的异常,包括你没有准备处理的异常。