类型Delphi程序员代码编写标准指南.

delphi程序员  时间:2021-02-11  阅读:()

Delphi程序员代码编写标准指南一、序言

本文档详述了在Delphi开发者指南下进行编程的代码编写标准。在通常情况下,本文档遵循“取消”式格式的指引方针,该方针由Borland国际通过一些例外来使用。在Delphi开发者指南中包含本文档的目的在于阐述一种方法,通过该方法,开发小组可以在他们所编写的代码中保持一贯的风格。 这样做的目的是使在开发小组中的每一个程序员都可以明白其他程序员的代码。这有助于提高代码编写的可读性和使用的一贯性。

本文档并不意味着包含了所有存在于代码中的标准。但是,它的内容已足够帮你起个好头。 你可以自由的增加修改这些标准来满足你的需要。 我们不赞成你偏离这些由Borland开发人员所使用的标准太远。 我们推荐这么做是因为一旦有新的程序员加入到你的开发小组中,而他们最喜欢和最熟悉的是Borland的标准。象大多数代码标准文档,本文档也会根据需要进行改动。 因此,你可以到www.xapware.co m/ddg中找到最新的更新版本。 本文档不包括用户接口标准。本文档是独立的但也是同样重要的。 已经有足够的第三方书籍和Micro so ft文档包括了另外一些指导方针,而我们决定并不复制这些信息,但我们会指引你到Micro so ftDevelopers Network和一些资源,在那儿可以找到你所需的信息。

二、通用源代码格式规则

2.1缩格

缩格是指在每一级有两个空格。 不要在源代码中保留tab字符,这是因为tab字符会随着不同用户的不同设置和不同的资源管理工具(打印、文档、版本控制等而代表不同的宽度。

你可以通过关闭Enviro nme nt选项对话框中Ed ito r页上的“U se tab c haract er”和“Optima l fill”检查框(通过To o ls|Enviro nme nt来禁止保存tab字符。

2.2页边空格

页边空格会被设置成80字符宽。 通常,源码不会超出这个边界,但这个方针会有一些弹性。 不管是否有可能,那些超出到另一行的语句会在一个逗号或其他操作符之后与前面的语句相连。当一个语句被打断相连时,它应比原来的那一行语句缩进两个字符。

2.3 Begin. . .End配对

Begin子句应写在独立的一行。例如,下面第一行是错误的写法而第二行是正确的。 forI :=0 to 10 do begin//错误,begin同for在同一行for I :=0 to 10 do//正确,begin出现在独立的一行begin

这个规则的例外是当begin子句的出现是作为一个else子句的一部分-参考例子:if so me statement thenbegin

. . .endelse beginso meOtherS tate me nt;end;end语句永远出现在独立的一行。

当begin语句不是一个else子句的一部分时,相应的end语句永远缩进到与begin部分相对应的位置。

三、 Object Pascal

3.1括号

永远不要在括号与括号之间的字符中间留下空格。 下面的例子示范了错误的与正确地使用括号中的空格:

C allPro c(Ap ara met er; //错误

C allPro c(Ap ara met er; //正确

永远不要在一个语句中使用不必要的括号。 括号只应在源代码中需要的地方使用。 以下的例子示范了错误和正确的使用:if(I=42 then//错误-多余的括号if(I=42 or(J=42 then//正确-需要括号

3.2保留字和关键字

Object Pascal保留字和关键字永远是全部小写。

3.3过程和函数(例程

3.3.1命名/格式化

例程的名字永远应该以大写的字母开头并且中间错落分明以便于可读性。 下面是一个不正确格式的过程名称:procedure this isapoorlyformattedro utinename;

下面是一个合适的大小写例程名称的例子:procedure ThisIsMuchMoreReadab leRoutineName;

例程的名称应该同它的内容相符。一个会导致某个行为的例程应以动词开头。例如:p rocedure FormatHardDrive;

一个用于设置输入参数的例程应以单词set作为前缀,例如:procedure SetUserName;

一个用来接收某个值的例程应以单词get作为前缀,例如:procedure GetUserName :string;

3.3.2形式参数

3.3.2.1格式化

如果有的话,相同类型的形参应合并在一个语句中:procedure F oo(P aram1,P ar am2,P aram3 : Inte ge r;P aram4: string;

3.3.2.2命名

所有形参的名字应是十分符合它们所代表的意义,特别是应该以传送到例程中的标志符的名称为基础。一个好的参数名称应以字符A为前缀-例如:procedure SomeP roc(AuserName :string;AuserAge : integer;

“A”前缀按约定表示该参数的名称是与类类型中的一个属性或域的名称相对应的。

3.3.2.3参数的排序

下面的形参的顺序重点说明了注册者调用约定调用的好处。

-最常用的参数应放在第一位,其它的参数应按从左到右的顺序排列。

-输入参数列表应放在输出参数列表的左边。

-将通用的参数放在特殊参数的左边,例如:procedure S o meP roc(Ap lane t,ACo ntinent,Aco untry,Astate,Ac ity

-排序有可能有些例外,比如事件的处理。类型为TObject的Sender参数经常放在第一位。 3.3.2.4常量参数

当一个参数为记录型、数组类型、 ShortString、或接口类型并且在例程中不被改变时,这些参数应做上常量标记。这样做会让编译器更加有效率的产生有关这些不改变的参数的代码。

而例程中另外一些非变参数也可常量来传送。 尽管这样做没有产生任何效果和提高效率,这将会给调用例程的使用者提供更多的信息。

3.3.2.5名称的冲突

当使用拥有两个名称相同的例程的两个单元时,如果你调用该例程时,在uses子句中排在后面的单元中的例程将会被调用。为了解决这种“在uses子句上的模糊”冲突,要在调用该例程时写上相关的单元的前缀,例如:sysUtile.F indC lose(SR;

或windows.FindClose(Handle;

3.4变量

3.4.1变量的命名和格式

变量的命名应以使用它们的目的相符

循环控制变量应采用一个单独的字符作为名字,比如I ,J,或K,也可以采用更加有意义的名字,比如UserIndex。

逻辑变量的名字应能充分表达准确的真或假的意思。

3.4.2局部变量

一个过程中的局部变量应遵循所有其它变量的使用和命名约定。临时变量的取名应合理。

如果必须的话,在一进入例程就应初始化局部变量。 局部的AnsiString变量会自动初始化为一个空的字符串。

局部接口和派分接口类型变量将会自动初始化为nil ,并且局部变数和o le变数类型变量会自动初始化为Unassigned

3.4.3全局变量的使用

使用全局变量是不推荐的。但是,在某些时候还是必须使用,而且它们也只应在必须使用的时候才使用。 在这种时候,你应努力只在一段上下文范围内使用全局变量。 例如,一个全局变量只应在一个单元的imp le mntat io n部分内是全局的。如果打算在多个单元类使用全局数据,你应将它们移到一个公共的单元中然后被其它所有单元使用。

全局变量可以在var子句中直接初始化为一个值。 记住,所有的全局数据会自动初始化为0,因此不要将全局变量初始化为一个“空”值比如0、 nil 、 '' 、

Unassigned、等等。这样做的一个理由是因为零-初始化的全局数据在exe文件中不会占据任何空间。 零-初始化数据被存储在一个虚拟的数据段,它在应用程序启动后被分配在一段内存中。 非零-初始化的全局数据在硬盘的exe文件占用空间。

3.5类型

3.5.1大写约定

如果类型的名字是保留字,那么它应全部小写。 Win32 API类型通常全部大写,并且你必须遵循在Windows.p as或其他AP I单元中的详细类型名称的约定。对于其他变量名字,地一个字母应为大写,而其他字母应错落有致。下面是一些例子:var

MyS tring: s tring; //保留字

WindowHandle :HWND; //Win32 API类型

I :I nte ger; //在S yste m单元中引进的类型标识符

3.5.1.1浮点指针类型

不推荐使用Real类型,因为它的存在只是为了向前兼容早期的Pascal代码。在通常情况下用Double来实现浮点指针的需要。 并且,Double对处理器和总线而言是做了最优化处理的,它也是IEEE中定义的标准数据格式。只有当需要的范围超出Doub le所定义的范围时才使用Extended。 Extended是intel定义的类型且在Java中不支持。只有当浮点指针变量的实际字节大小有其意义时才使用S ingle 。(比如当使用另一种语言的DLLs时。

3.5.1.2枚举类型

枚举类型的名字需符合使用该类型的目的。该类型的名字需以字符T为前缀,以表明这是一个类型。 枚举类型中的标识符列表必须包含两个或三个字符的前缀来对应于该枚举类型的名字-例如:

Tso ngType=(stRock, stC lass ical, stCountry, stAlternative, stHe avyMetal, stRB;一个枚举类型的实例的名字应与不要前缀的枚举类型(SongType相同,除非有更好的原因来赋予该变量更特殊的名字,比如:FavoriteSongType 1,FavoriteSongType2等等。

3.5.1.3变数和ole变数类型

通常不建议使用变数和Ole变数类型。但在只有运行时刻才能知道数据类型的程序中必须使用该类型,这种情形多出现在COM和数据库开发中。 Ole变数使用在以C O M为基础的编程中例如自动化和Act ive X控制,而变数使用在非C O M的编程中,这是因为变数可以十分有效地存储本地Delphi字符串(同一个字符串变量一样,但Ole变数会将所有的字符串转换为Ole字符串(WideChar字符串并且并不实例运算-它们永远拷贝。

3.5.2结构类型

3.5.2.1数组类型

数组类型的名字需符合它们使用的目的。 该类型的名字必须加以前缀T。 如果须声明该数组类型的指针,那么该指针需加以前缀P而且应立即声明在该数组声明的前面。例如:type

PCycleArray=^TCycleArray;

TCyc leArray=array[1. . .100]o f inte ger;

在实际应用中,数组的变量实例的名称应是其类型的名字去掉前缀T。

3.5.2.2记录类型

记录类型的名字应符合使用它们的目的。其类型的声明应加以前缀T。 如果要声明该记录类型的指针,就应加以前缀P并且应紧靠在类型声明的前面声明。例如:type

PEmployee=^TEmployee;

TEmployee=record

Emp loyeeName : string;

Emp loyeeRate :Doub le;end;

3.6语句

3.6.1 if语句

在if/then/else语句中最常发生的行为应放在then子句中,而其它发生可能性较小的行为应放在else子句中。

尽量避免使用嵌套的if语句,在这种情形下应用多个if语句来判断各种可能。

不要使用if嵌套超过五级深度。 应使代码编写得更加清晰、 明了。

不要在if语句中使用不必要的圆括号。

如果在if语句中有多个条件需测试,这些条件应按计算强度由少到多的顺序从左到右排列。 这样做能使编译器在编译代码时获得布尔估算逻辑的捷径,从而使你的代码获得最佳的优化。 举例来说,如果条件1快过条件2,而条件2快过条件3,那么在if语句中的排列应是: if条件1 and条件2 and条件3 then

3.6.2 case语句

3.6.2.1一般性话题

在一个case语句中的各个独立的单元应以数字或字母顺序排列。

每一个case单元的动作行为应保持简单而不应该超过四到五行代码。如果所要执行的动作过于复杂应采用独立的过程或函数。

Case语句中的else子句只有当需要缺省行为或处理错误时才使用。

3.6.2.2格式

优林70/月,西南高防地区最低70/月

优林怎么样?优林好不好?优林 是一家国人VPS主机商,成立于2016年,主营国内外服务器产品。云服务器基于hyper-v和kvm虚拟架构,国内速度还不错。今天优林给我们带来促销的是国内西南地区高防云服务器!全部是独享带宽!续费同价!官方网站:https://www.idc857.com​地区CPU内存硬盘流量带宽防御价格购买地址德阳高防4核4g50G无限流量10M100G70元/月点击购买德阳高防...

HostYun(月18元),CN2直连香港大带宽VPS 50M带宽起

对于如今的云服务商的竞争着实很激烈,我们可以看到国内国外服务商的各种内卷,使得我们很多个人服务商压力还是比较大的。我们看到这几年的服务商变动还是比较大的,很多新服务商坚持不超过三个月,有的是多个品牌同步进行然后分别的跑路赚一波走人。对于我们用户来说,便宜的服务商固然可以试试,但是如果是不确定的,建议月付或者主力业务尽量的还是注意备份。HostYun 最近几个月还是比较活跃的,在前面也有多次介绍到商...

域名注册需要哪些条件(新手注册域名考虑的问题)

今天下午遇到一个网友聊到他昨天新注册的一个域名,今天在去使用的时候发现域名居然不见。开始怀疑他昨天是否付款扣费,以及是否有实名认证过,毕竟我们在国内域名注册平台注册域名是需要实名认证的,大概3-5天内如果不验证那是不可以使用的。但是如果注册完毕的域名找不到那也是奇怪。同时我也有怀疑他是不是忘记记错账户。毕竟我们有很多朋友在某个商家注册很多账户,有时候自己都忘记是用哪个账户的。但是我们去找账户也不办...

delphi程序员为你推荐
行业关键词为什么有些行业关键词竟价出价很低有些行业很高淘宝收费淘宝卖东西收多少手续费拂晓雅阁现在最流行的系统是那个???在线代理网站求有效的代理服务器地址?人人逛街人人逛街评论怎么不显示链接了?好像4月28日就不能显示了。是什么原因呢?商标注册查询官网如何在网上查询商标是否注册?域名库电脑上文件有多少域名?各什么意思?网站排名靠前如何优化网站 如何让网站排名靠前网页打不开的原因为什么我的网页打不开小米3大概要多少钱小米3 64G的买多少钱
网通服务器租用 ipage hostgator simcentric BWH 国外服务器网站 视频存储服务器 idc评测网 阿里云代金券 dd444 web服务器的架设 卡巴斯基试用版 东莞数据中心 流量计费 美国网站服务器 腾讯总部在哪 登陆空间 沈阳主机托管 免费的asp空间 cdn网站加速 更多