软件开发编码规范(适用于delphi)
制定编码规范的目的是为了使一组程序员生成同样风格的代码,使一个团队形成并保持一定的风格。这样的好处是每个程序员的代码都易于为他人所理解,从而会在很大程度上提高代码的可维护性,也因此会降低维护费用。对于任何团队来说,这均是一个十分理想的境界。对于个人,选择或自我生成一种编码规范,并坚持这个规范,同样会产生良好的效果。
每种程序设计语言都有属于自己的编码规范,编码规范可以说是经验的总结。编码规范的使用是为了简化程序员的工作,“简化”的含义不是减少代码量(相反,很多时候遵从规范会带来更多的代码),而是减少程序员在维护代码时的劳动量。程序员应将大部分精力用来处理关系,而避免在过于细节的问题上浪费心机。如果他一眼就能够明白程序的思路和结构,那么对维护方案就会很快形成。另外,使用规范在很大程度上是为了减少程序员的记忆负担。
控件命名规范(请严格按照表一、表二进行命名)
命名原则:以data开头的控件一律以da作为缩写;
以date开头的控件一律以dt作为缩写
复合单词一律原有单词的缩写进行连接 例:CheckBoxList缩写为chklst
表 一
控件类型 前缀 示例
Panel pnl pnlGroup
Check box chk chkUserInfo
drop-down list box ddl ddlEnglish
button btn btnExit
Control ctr ctrCurrent
Data grid dag dagTitles
Data list dal dalPublisher
Data repeater dar darLocation
Date picker dtp dtpPublished
Directory list box dir dirSource
Drive list box drv drvTarget
File list box fil filSource
Form frm frmEntry
Frame fra fraLanguage
Graph gra graRevenue
Image img imgIcon
ImageList imglst imglstAllIcons
Label lbl lblHelpMessage
List box lst lstPolicyCodes
Menu mnu mnuFileOpen
RichTextBox rtf rtfReport
StatusBar sta staDateTime
Text box txt txtLastName
Timer tmr tmrAlarm
Toolbar tlb tlbActions
TreeView tre treOrganization
Calender cld
Table tbl
CheckBoxList chklst
AdRotator art
RequiredFieldValidator rfv
CompareValidator cvd
RangeValidator rvd
RegularExpressionValidator rev
ValidatorSummary vds
CrystalReportViewer rptvew
LinkButton lnkbtn
CheckBoxList chklst
RadioButton rdobtn
RadioButtonList rdobtnlst
数据库各对象的命名
命名原则:data开头的缩写成da,后面的单词取第一个字母
如果单字母命名与其他控件有重,那么取两个字母。如DataReader,DataRow
表 二
类名 缩写 类名 缩写 类名 缩写
Connection Con Command cmd
DataSet das
DataTable dat
dataView dav Parameter par
常见按钮的命名
btnOk [确定(&Y)]
btnCancel [取消(&C)]
btnApply [应用(&A)]
btnReturn [返回(&R)]
btnPrint [打印(&P)]
btnGen [生成(&G)]
btnQuery [查询(&Q)]
btnSort [排序(&S)]
btnAdd [新增(&A)]
btnInsert [插入(&I)]
btnDel [删除(&D)]
btnNext [下一条(&N)]
btnPrior [前一条(&P)]
常量和变量的命名与使用规则
◆变量和方法参数如果只有一个单词那么小写,超过一个单词,第2个单词开始所有单词首字母大写,其他字母小写.例: string fullMessage = "Hello " + name; ...
只要合适,在变量名的末尾追加计算限定符(Avg、Sum、Min、Max、Index)
◆在程序的开始阶段要对所有的变量赋予明确的数值。在主程序、过程或函数中要明确程序的初始化部分和程序的功能部分。
◆布尔变量名应该包含 Is,这意味着 Yes/No 或 True/False 值,如 IsfileFound
◆常量的名字应该都大写,并且指出完整含义,例如:MAX_UPLOAD_FILE_SIZE=1024。
◆数组的命名,在数组名字后面加_arr.
◆全局变量名必须G_开始,例如:G_param. 在程序设计中,应该尽可能的避免使用全局变量。
◆使用enum来指示离散的数值常量;使用结构来指示离散的字符常量
语句规范
◆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;
这样写的原则是要保证程序足够紧凑。语句分层的好处是使我们面对一个清晰的程序段,但是过分的、不尽合理的分层会使程序过于松散,这同样是需要避免的。
◆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;
◆case语句
case语句中每种情况的常量应当按照字母或数字的顺序排列。
每种情况的处理与语句不要行数太多,因为这样会使整个case语句过长。应该尽量使用过程或函数以减少case语句的复杂度。
case语句的else子句只用于处理默认情况或进行错误检测。
◆循环语句
循环语句共有三种:for语句、while语句和repeat语句。如果循环次数确定,那么就使用for语句;如果在第一次循环之前要实现执行一次以获得初始比较数值,那么就使用repeat语句;其他情况基本上都可以使用while语句。实际上这三条语句可以覆盖所有的循环需要,而且可以互相替代。
在Delphi中要注意,for语句中的循环变量不可以在循环体中被赋值。
建议不要使用exit和break来退出循环。
◆with语句
with语句是一类非常容易出错的语句,使用with语句可以有效避免重复的输入工作。但是这样会使程序难以检查。所以,不要随便使用with语句,而且绝对不要使用带有两个或多于两个对象或记录的with语句。顺便提一下,尽量不要随便使用with语句的原因不是因为易于出错,而是因为难以排错。
过程和函数命名规范
◆过程和函数的名称应当由一个或多个完整的单词组成。名称的首字母应当大写,其后每个单词的首字母也应当大写,其它字母则小写。如果名称过长,可以考虑使用单词的缩写,但是要使用常用的缩写,比如:Tmp、Str。对于使用英文简写的单词或词组要全部使用大写字母,比如:ID、UTS。下面是几个正确的写法:GetUserID、InputPassword、FindUserListFile、ImportUserNameFromStr。
◆过程或函数的名称应当能够简单的表示该过程或函数的行为。使用动词和名词为过程和函数命名,动词表示行为,而名词表示行为的对象或目的。根据惯例,设置输入参数值的过程名要以Set为前缀,读取数值的函数名要以Get为前缀。下面是几个正确的命名:SaveToFile、ReadFromFile、SetUserID、GetUsersNumber。
空格使用规范
◆在“=”、“<>”、“>=”、“<=”左右要留有一个空格;在“:=”和“:”右边要留有一个空格,而左边不留。例如:if a = b then a:= b;a: integer;
◆保留字和关键字与左边的符号间要留有一个空格,与右边的符号间不留。例如:procedure ShowMessage; overload;
括号使用规范
◆在过程和函数的定义和调用中,括号与外部的单词和符号之间不留空格;与内部的单词之间也不留空格。
◆在if语句的条件判断中,与and、or等保留字之间要使用空格。例如:function Exchange(a: integer; b: integer); if (a = b) and ((a = c) or (a = d)) then … end;
边距使用规范
◆Delphi编辑器在右边大约第81个字符处留有一条暗线,实际上在Delphi的默认界面下,当分辨率在800*600时,最大化窗口将显示到该暗线左边4个字母处。因此,不要将源代码写到暗线之外,也就是说每行包括前面和中间的空格不要多于80个字符。如果语句过长,那么换行完成,换行后要缩进两个字符。这样也易于打印,在Delphi中超过暗线的部分不会被打印。如果使用Word等文字处理软件打印Delphi程序,超出的部分会调到下一行的首部,这样打印出的程序将难以阅读。所以,尽量在编写代码的时候做好一切调整,不要把这种工作留到打印的时候进行。
◆换行时要注意保持程序的可读性,尽量保持完整的部分。作为例子,如果函数过长,那么再换行时要将某个完整的参数说明换行,而不要只将数据类型声明换行。
注释使用规范
Delphi支持两种注释:块注释({})和单行注释(//)。注释的作用是为了解释程序的设计思路,帮助程序员尽快明白昨天甚至两年前写的程序的思路。这实际上是为了解决记忆问题,大脑不该被过分作为存储器使用,在程序设计中永远不要过分依赖大脑,而要尽可能借助文字。所以说,注释在程序设计语言中是十分重要的方面,尽管很多人(尤其是初学者,也包括相当数量的程序员)对此毫不介意,他们很少写注释。注释的另外一个应用是在程序调试阶段,比如说有两个语句,事先并不知道哪一个更好,于是需要测试:将一条语句前放置//(也就是说将这条语句改为注释),运行另一条语句,然后再做相反的工作,我们就可以轻松做出选择。如果是一组语句,那就用块注释,但一定注意要将“{”和“}”放在显眼的位置,比如说放在单独的上下两行。下面是一些使用原则:
◆对于大的功能模块用#region 和#endregion指令包住代码。
◆注释(采用XML格式)
◆所有的方法和类前都必须加XML注释(用///注释)
◆注释和代码最大长度不能超过源代码编辑器的宽度
◆多数情况下,在自定义变量、类型的前面放置注释是有必要的。
◆多数情况下,在单元文件顶部放置注释是必要的。在此,注释中要包含:文件名、创建日期、修改日期、作者、修改作者以及必要的描述。
◆注释要有意义,不要使用没用的注释。比如
while i < 8 do
begin
…
i:= i + 1; // i加1
end;
◆并不是说简单的语句(类似于:i : = i + 1)就不需要注释。因为简单的语句往往会起到十分重要的作用,所以,如果这条语句会使人产生疑问或者让人难以理解,那么就要将此语句的作用标记下来。
◆不要试图在注释中创建组合图案,除非你认为这十分必要。因为在保持图案完整美观的情况下修改注释是非常困难的。
◆要区分临时注释和永久注释,你可以用你的方法在注释中放置特殊符号来区分。这样的好处是易于查找。
◆对语句的更改要映射到相应的注释中。
◆注释与代码间要留有明显的间隔,要一眼就能够分清楚哪是语句哪是注释。可以将注释放在代码行的前一行、后一行或留有至少两个空格紧跟在代码的后面,但是在代码与注释在同一行时不要使代码跟在注释的后面,另外,不要将注释放在代码中间。
其它规范
◆类名所有单词第一个字母大写,其他字母小写。例:public class HelloWorld …
方法所有单词第一个字母大写,其他字母小写。例: procedure HelloWorld ...
◆保留字和关键字要全部使用小写。例:if (a = b) and ((a = c) or (a = d)) then … end;
◆基本数据类型要使用小写,扩展类的类型要的前两个字母要大写(类类型的首字母是“T”)。例:a:integer;<基本数据类型>
MyStrings = TStrings.Create;<扩展类的类型>
◆表单(form)要和单元(unit)名匹配
例:对于单元HelloWorld, 相应的表单名应为 helloworldfrm
◆缩进用 TAB 不用 SPACES(一个TAB相当于两个空格)
◆接口interface总是以 I 前缀开始,后接Pascal命名例:IDisposable