Delphi编程建议遵守的规范1---缩进、各种语句的用法

在编程时候,尤其是在一个大的团队里面,遵守统一的编程规范是极其重要的。为所有的开发人员制定一个源代码书写标准,以及程序和文件的命名标准,使他们在编程时有一致的格式,这样,每个编程人员编写的代码能够被其他人理解,减少程序维护和移交的成本。

这里先只介绍关于Delphi语言的编程规范,暂时跳过文件、项目命名……

1.1.关于缩进

缩进能够更清晰的展示源码的逻辑结构,采用两个空格字符,不能使用制表符(即Tab字符)。这是因为,制表符的宽度随着不同源码编缉工具及不同的设置,展示出来的效果不一样,如果空格和tab键混用的情况,很可能展现出来的是混乱的结构

1.2.begin...end语句

begin语句应该单独占一行,例如

错误的用法

for i:=0 to 10 do begin

     正确的用法

for i:=0 to 10 do
begin

    本规则有一个特例,当begin为else语句的一部分时,例如

if somestatement then
begin
    ...
end;
else someotherstatement begin
    ...
end;

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

1.3.大小写规则

虽然Delphi中不区分大小写,但是采用统一的大小写规则也是极其有益的,能让大家在看代码时不至于不知所措

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

var
    sMyString : string;    //保留字,全部小写
    hWindowsHandle : HWND;    //Win32 API类型,全部大写
    I : Integer;    //在System单元中引用的类型标识,特定类型名

1.4.浮点型

通常情况下,对于浮点数应当使用Double,不鼓励使用Real类型,因为它只是为了与老的Pascal代码兼容而保留的。Double可被处理器优化,是IEEE定义的标准的数据格式。当需要比Double提供的范围更大时,可以使用Extend。

1.5.Variant和OleVariant

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

1.6.局部变量

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

1.7. 全局变量

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

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

1.8.if语句

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

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

1.9.case语句

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

1.10.while语句

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

1.11.for语句

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

1.12.repeat语句。

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

1.13.with语句

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

with Record1, Record2 do
begin
    ....
end;

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

1.14.过程和函数

过程名或函数名应当以大写字母开头,且每个单词首字母大写,例如

procedure thisisapoorlyformattedroutinename;    //错误的写法,让人很难看明白
procedure ThisIsBetterProcedure;    //这种写法更为易读

    只要有可能,同一类型的形参应当归并到一起,这样可以减少代码长度,例如:

procedure Foo(Param1:Imteger;Param2:Imteger;
Param3:Imteger;Param4:string);  //不建议的用法
procedure Foo(Param1,Param2,Param3:Imteger;Param4:string); //建议的用法

   参数的顺序主要要考虑寄存器的调用规则,最常用的参数应该作为第一个参数,按照使用的频率以此从左到右,输入参数位于输出参数之前,范围大的参数应当在范围小的参数之前。也有例外,例如:在事件处理的过程中,TObject类型的Sender参数往往是第一个要传递的参数

1.15.常数参数

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

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

1.16.结构异常处理

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

1.17.try...finally的用法

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

SomeClass1 := TSomeClass.Create;
SomeClass2 := TSomeClass.Create; //此条语句出错时,SomeClass1无法释放
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;
try
  SomeClass1 := TSomeClass.Create;
  SomeClass2 := TSomeClass.Create;
  { do some code }
finally
  FreeAndNil(SomeClass1);
  FreeAndNil(SomeClass2);
end;

1.18.try...except的用法

如果你希望在发生异常时执行一些任务,可以使用try...except。通常,没有必要为了简单地显示一个错误信息而使用try...except,因为Application对象能够自动根据上下文做到这一点。如果要在子句中激活默认的异常处理,可以再次触发异常。

注意:一般情况下,原始的错误信息一般需要屏蔽掉不给用户看到,而是转换成我们自定义的更通俗易懂的描述给客户。但是原始的错误信息不能这样直接丢弃,否则,会给我们排查问题时带来较大的因难,所以一般需要记录下较详细的出错场景信息及原始出错信息,以备排查问题时使用。如果明确就是为了屏蔽某一类异常,可以不记录错误信息,但是这种情况慎用。例如:不当的用法:

sCount := ‘aaaa’;
try
   iCount := StrToInt(sCount);
except
   { 转换出错数据是什么?为什么出错? 都不知道,这样给排查问题带来很大困难 }
   ShowMessage(‘sCount转换类型失败!’);
end;

  正确的用法

sCount := ‘aaaa’;
try
   iCount := StrToInt(sCount);
except
  on e: Exception do
  begin
     WriteLog(‘sCount(当前值为:%s)转换类型失败!错误信息为:%s’,
 sCount, e.message);
    ShowMessage(‘sCount转换类型失败!’);
  end;
end;
时间: 2024-08-27 08:05:59

Delphi编程建议遵守的规范1---缩进、各种语句的用法的相关文章

Delphi编程建议遵守的规范2---命名规范

1.1.形参命名建议 所有形参的名称都应当表达出它的用途.如果合适的话,形参的名称最好以字母a 为前缀,例如: procedure SomeProc(aUserName:string; aUserAge:integer);   当参数名与类的特性或字段同名时,前缀a 就有必要了 1.2.命名冲突 当两个单元中含有相同名称的过程时,如果调用该过程,实际被调用的是Uses 子句中较后出现的那个单元中的过程.为避免这种情况,可在方法名前加想要的单元名 SysUtils.FindClose(SR); 或

nodejs 编程建议(代码规范)

1. 不要使用 "try ... catch" ,因为nodejs都是异步操作,try catch无法捕捉回调里面的异常,除非你在回调里面也写try catch try...catch statement cannot catch the error in callback. Here is an example: fs = require('fs'); try { fs.stat('doesnt_exist.txt', function(err, stats) { if (err)

Delphi编程OOP思想【转】

原文:http://blog.sina.com.cn/s/blog_9c47a15201015rew.html 注:本文摘自http://blog.csdn.net/haiou327/article/details/5937171,转载请注明: 好东西大家分享 刚刚接触的Delphi的朋友,可能最感兴趣的就是它丰富.强大的VCL(可视化构件库).仅仅向窗体上扔几个构件,甚至不用动手写代码,就能很容易地做出一个有实用价值的程序,真是令人激动.但是,VCL只是Delphi的一小部分,Delphi的优

Delphi编程中资源文件的应用

Delphi编程中资源文件的应用/转自 http://chamlly.spaces.live.com/blog/cns!548f73d8734d3acb!236.entry一.引子: 现在的Windows应用程序几乎都使用图标.图片.光标.声音等,我们称它们为资源(Resource).最简单的使用资源的办法是把这些资源的源文件打入软件包,以方便程序需要的时候调用.资源是程序的一部分,程序要正常运行就离不了资源文件.但是它是不可执行代码. 为了更好地管理资源,Delphi中提供了一种.RES类型的

java 编程风格和命名规范 【转】

http://www.cnblogs.com/qq78292959/archive/2011/03/17/2076948.html Java编程风格与命名规范 定义规范的目的是为了使项目的代码样式统一,使程序有良好的可读性. 包的命名  (全部小写,由域名定义) Java包的名字都是由小写单词组成.但是由于Java面向对象编程的特性,每一名Java程序员都 可以编写属于自己的Java包,为了保障每个Java包命名的唯一性,在最新的Java编程规范中,要求程序员在自己定义的包的名称之前加上唯一的前

Delphi编程获取系统当前进程、窗口句柄、文件属性以(转)

Delphi编程获取系统当前进程.窗口句柄.文件属性以及程序运行状态. uses TLHelp32,PsAPI; (1)显示进程列表:procedure TForm1.Button2Click(Sender: TObject);var lppe: TProcessEntry32;found : boolean;Hand : THandle;P:DWORD;s:string;beginListBox1.Items.Clear ;Hand := CreateToolhelp32Snapshot(TH

Delphi知识点与技术概述【第一章Delphi编程】

Delphi的基本特性:语言,运行时库(RTL),核心类库 语言特性: Delphi 即是一门语言同时又是一个开发工具.它是经典Pascal语言的面向对象的扩展. 内容提要 *类与对象 Delphi中每个可视放置在窗体中的组件是类的类型对象,该类可在系统库中获得.类和对象之间的关系和变量和类型之间的关系相同. *封装:provate public "黑盒子",不需要知道里面有什么,只需要知道怎么样和黑盒子接口. 基本的3个访问标示符private.protected.public.它只

BMP位图文件格式详解及编程建议

BMP文件渊源流长,虽然对JPG.PNG等格式图像文件来说,确实有点土,但是毕竟BMP文件格式相对简单,容易理解,至于BMP众多的位图格式也不能责怪微软,主要是早期谁也没料到图片技术会发展的这么快,而且每次升级还要兼容,所以只能如此了(有点麻烦但并不复杂).天缘撰写本文以便留档和各位编程爱好者参考. BMP位图文件的结构主要由:BMP文件头.位图信息头.颜色表和图形数据四个部分组成,对于24位.32位则没有色彩表字段,低位图则存在色彩索引表. 一.BMP的文件头结构 BMP文件头数据结构包含有B

xmlns:xsi ——是指xml文件遵守xml规范,xsi全名:xml schema instance

http://blog.sina.com.cn/s/blog_4b6f8d150100nx3e.html http://blog.csdn.net/iaiti/article/details/42263891 http://blog.csdn.net/qian_348840260/article/details/5396061 xmlns ——是XML NameSpace的缩写,因为XML文件的标签名称都是自定义的,自己写的和其他人定义的标签很有可能会重复命名,而功能却不一样,所以需要加上一个n