您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > Delphi编程规范
Delphi编程代码规范1.一般的源代码格式规则21.1缩进21.2空格21.3边距21.4颜色及文字属性21.5begin···end22.OBJECTPASCAL32.1括号32.2保留字和关键字32.3过程和函数(例程)32.4变量42.5常量(const)52.6资源串(resourcestring)52.7类型52.8构造类型62.9语句62.10结构化异常处理82.11类83.文件103.1项目文件103.2Form文件103.3数据模块文件103.4远程数据模块文件103.5单元文件103.6文件头113.7函数或过程头格式如下114.Form与数据模块124.1Form124.2数据模块135.包145.1运行期包与设计期包145.2文件命名标准146.元件146.1自定义的元件146.2元件实例的命名规则156.3元件性质标识名156.4元件的前缀151.一般的源代码格式规则1.1缩进缩进就是每级间有两个空格。不要在源代码中保存制表符。这是因为,制表符的宽度随着不同的用户设置和代码管理实用程序(打印、文档及版本控制等)而不同。通过使用Tools|EditorOptions菜单,在EditorProperties对话框的General页上,不要选中UsetabCharacter和OptimalFill复选框,这样,制表符就不会被保存。1.2空格遇到如下情况,需要添加空格:1)逗号的后面;2)冒号的后面;3)等号的前后;4)赋值号的前后5)运算符(+、-、*、/)的前后。1.3边距边距设置为80个字符。源代码一般不会因写一个单词而超过边距,但本规则比较灵活。只要可能,长度超过一行的语句应当用逗号或运算符换行。换行后,应缩进两个字符。1.4颜色及文字属性通过使用Tools|EditorOptions菜单,在EditorProperties对话框的Color页上,设置相应元素的颜色及文字属性。其中:注释(Comment):斜体深绿色保留字(Reservedword):粗体天蓝色字符串(String):普通洋红色数值(Number):普通红色其他元素取DelphiIDE缺省设置。1.5begin···endbegin语句必须单独占一行,例如,下面第一行是错误的,而第二行正确:fori:=0tol0dobegin//错,begin与for在同一行fori:=0to10do//对,begin在另外一行中beginend;本规则的一个特殊情况是,当begin为else语句的一部分时,例如:ifsomestatement=thenbegin...endelsebeginSomeOtherStatement;end;end语句总是单独一行。当begin不为else语句的一部分时,相应的end语句与begin语句的缩进量相同。2.OBJECTPASCAL2.1括号在左括号与下一个字符之间没有空格。同样,右括号与前一字符间也没有空格。下面的例于演示了正确与不正确的空格。CallProc(AParameter);//错!CallProc(AParameter);//正确!不要在语句中包含多余的括号。在源代码中,括号只有在确实需要时才使用。下面的例子演示了正确与不正确用法:if(i=42)then//错,括号是多余的if(i=42)or(j=42)then//正确,必须使用括号2.2保留字和关键字ObjectPascal语言的保留字和关键字总是全部小写。2.3过程和函数(例程)2.3.1命名与格式■例程名应当以大写字母开始,且大小写交错以增加可读性。下面是一个不正确的写法:procedurethisisapoorlyformattedroutinename;改成这样写就对了:procedureThisIsMuchMoreReadableRoutineName;■例程名应当有意义。进行一个动作的例程最好在名称前加上表示动作的动词为前缀。例如:procedureFormatHardDrive;■设置输入参数值的例程名应当以Set为其前缀,例如:procedureSetUserName;■获取数值的例程名应当以Get为其前缀,例如:functionGetUserName:string;2.3.2形参■格式只要可能,同一类型的形参应当归并在一起:procedureFoo(Param1,Param2,Param3:Integer;Param4:string);■命名所有形参的名称都应当表达出它的用途。如果合适的话,形参的名称最好以字母A为前缀,例如:procedureSomeProc(AuserName:string;AuserAge:integer);当参数名与类的特性或字段同名时,前缀A就有必要了。■参数顺序形参的顺序主要要考虑寄存器调用规则。最常用的参数应当作为第一个参数,按使用频率依次从左到右排。输入参数位于输出参数之前。范围大的参数应当放在范围小的参数之前。例如:SomeProc(AP1anet,AContinent,ACountry,AState,ACity);有些则例外。例如,在事件处理句柄中,TObject类型的Sender参数往往是第一个要传递的参数。■常量参数要使记录、数组、短字符串或接口类型的参数不能被例程修改,就应当把形参标以const。这样,编译器将以最有效的方式生成代码,保证传递的参数不可变。如果其他类型的参数希望不被例程所修改,也可以标上const。尽管这对效率没有影响,但这给例程的调用者带来了更多的信息。■命名冲突当两个单元中含有相同名称的例程时,如果调用该例程,实际被调用的是uses子句中最后出现的那个单元中的例程。为避免这种情况,可在方法名前加想要的单元名,例如:SysUtils.FindClose(SR);或Windows.FindClose(Handle)2.4变量2.4.1变量的命名与格式变量的名称应当能够表达出它的用途。循环控制变量常常为单个字母,诸如I、J或K。也可以使用更有意义的名称,例如UserIndex。布尔变量名必须能清楚表示出True和False值的意义。2.4.2局部变量局部变量用于例程内部,遵循其他变量的命名规则。局部变量加前缀l_(循环控制变量除外),如l_UserName。如果需要的话,应当在例程的入口处立即初始化变量。局部的AnsiString类型的变量自动被初始化为空字符串,局部的接口和调度接口类型的变量自动被初始化为nil,局部的Variant和OleVariant类型的变量自动被初始化为Unassigned。2.4.3全局变量一般不鼓励使用全局变量。不过,有时候需要用到。即使如此,也应当把全局变量限制在需要的环境中。例如,一个全局变量可能只在单元的Implementation部分是全局的。全局数据如果将由许多单元使用,就应移动到一个公用单元里被所有对象使用。全局数据可在声明时直接初始化为一个值。注意,所有全局变量自动进行零初始化,因此,不要将全局变量初始化为诸如0、nil、’’或Unassigned等空值。零初始化的全局变量在.EXE文件中不占空间。零初始化的数据保存在虚拟的数据段中,而虚拟数据段只在应用程序启动时才分配内存。非零初始化的全局数据则在.EXE文件中占空间。2.5常量(const)常量的命名应当能够表达出它的用途。如果有类别,该类别的所有常量加前缀,前缀为类别缩写的小写字母;例如:对于文件打开方式(FileOpenModes),定义常量:fmOpenRead=$0000;fmOpenWrite=$0001;如果无类别,常量的前缀为con。例如:conProductName=‘GBG2000’;2.6资源串(resourcestring)如果在模块中有提示信息类的字符串,把该字符串定义为资源串。资源串的命名应当能够表达出它的用途。如果有类别,该类别的所有资源串加前缀,前缀为类别缩写的小写字母,同常量定义。如果无类别,资源串的前缀为rs。例如:rsFileOpenError=‘文件打开失败!’;2.7类型2.7.1大小写规则类型标识符是保留字,应当全部小写。Win32API类型常常全部大写,并且遵循诸如Windows.pas或其他API单元中关于特定类型名的规则。对于其他变量名,第一个字母应大写,其他字母则大小写交错。下面是一些例子:varMytring:string;//保留字WindowsHandle:HWND;//Win32API类型i:Integer;//在System单元中介绍的类型标识2.7.2浮点型不鼓励使用Real类型,因为它只是为了与老的Pascal代码兼容而保留的。通常情况下对于浮点数应当使用Double。Double可被处理器优化,是IEEE定义的标准的数据格式。当需要比Double提供的范围更大时,可以使用Extend。Extend是Intel专用的类型,Java不支持。当浮点变量的物理字节数很重要时(可能使用其他语言编写的DLL),则应当使用Single。2.7.3枚举型枚举类型名必须代表枚举的用途。名称前要加T字符作为前缀,表示这是个数据类型。枚举类型的标识符列表的前缀应包含2~3个小写字符,来彼此关联。例如:TSongType=(stRock,stClassical,stCountry,stAlternative,stHeavyMeta1,stRB);枚举类型的变量实例的名称与类型相同,但没有前缀T,除非为了给变量一个更加特殊的名称,诸如FavoriteSongType1、FavoriteSongType2等。2.7.4Variant和OleVariant一般不建议使用Variant和OleVariant。但是,当数据类型只有在运行期才知道时(常常是在COM和数据库应用程序中),这两个类型对编程就有必要。当进行诸如Automation、ActiveX控件的COM编程时,应当使用0leVariant;而对于非COM编程,则应当使用Variant。这是因为,Variant能够有效地保存Delphi的原生字符串,而OleVariant则将所有字符串转换为OLE字符串(即WideChar字符串),且没有引用计数功能。2.8构造类型2.8.1数组类型数组类型名应表达出该数组的用途。类型名必须加字母T为前缀。如果要声明一个指向数组类型的指针,则必须加字母P为前缀,且声明在类型声明之前。例如:typePCycleArray=^TCycleArray;TCycleArray=array[1..100]ofinteger;实际上,数组类型的变量实例与类型名称相同,但没有T前缀。2.8.2记录类型记录类型名应表达出记录的用途。类型名必须加字母T为前缀。如果要声明一个指向记录类型的指计,则必须加字母P为前缀,且其声明在类型声明之前。例如:typePEmployee=^TEmployee;TEmployee=recordEmployeeName:string;EmployeeRate:Double;end;2.9语句2.9.1if语句在if/then/else语句中,最有可能执行的情况应放在then子句中,不太可能的情况放在else子句中。为了避免出现许多if语句,可以使用case语句代替。如果多于5级,不要使用if语句。请改用更清楚的方法。不要在if语句中使用多余的括号。如果在if语句中有多个条件要测试,应按照计算的复杂程度从右向左排。这样,可以使代码充分利用编译器的短路估算逻辑。例如,如果Conditionl比Condition2快,Condition2比Condition3快,则if语句应这样构造:ifCondition1andCondition2andCondition3then如果无else子句且执行语句只有一句,该执行语句写在then后,例如:ifConditionthendosomething;2.9.2case语句■概述case语句中每种情况常量应当按数字或字母的顺序排列。每种情况的动作语句应当简短且通常不超过4~5行代码。如
本文标题:Delphi编程规范
链接地址:https://www.777doc.com/doc-3260306 .html