版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Delphi程序源代码编写标准指南,宁波四维科技有限公司,企业标准,序 言,制定Delphi程序代码编写标准的目的: 使代码保持一贯的风格 提高代码的可维护性 加强程序员之间的交流 规范公司的产品代码,源代码规则,If(HourString24) Then Begin Time:=StrToTime(TimeString); Decodetime(Time,Hour,Min,Sec,Msec); End Else Begin Hour:=24; Min:=0; End;,Begin应写在独立的一行,源代码规则,sql:=select * from +tablename+ where datet
2、=+Formatdatetime(yyyy-mm-dd,datet-1)+;,语句太长了,sql:=select * from +tablename+ where ,怎么办?,拆分成多行:,注 释,函数或过程注释的位置: 函数的实现代码部分 单元文件头部分,关键变量、函数、过程及主要语句必须有注释:,/应写注释,function count(n:Integer):Integer;,关键变量的注释包括用途、可能取值及各种值的意义,如:isGather:Boolean/是否采集:True采集 False不采集,格式 : 函数(过程)名称 : 功能 : 参数说明书 : 调用方法 : 调用其他函数(过
3、程):写上本函数(过程)调用了的其他数(过程) 被调用 :写上调用本函数迅程)的函数(过程) 编制人 : 日 期 : 修改日期 :年/月/日 修改人员 . 实现流程及主要语句应加上注释,使其能表达语句所实现的具体功能,注释格式,括 号,不要在一个语句中使用不必要的括号 对于一些复杂的表达式,为增加程序的可读性,可增加一些括号。,为增加程序的可读性,可加括号,例如: S:=Format( %2d:%d0, i div 2, (i mod 2)*3);,保留字和关键字,Object Pascal保留字和关键字永远是全部小写 例如:date,float,double等等这些系统的保留字,都应该小写.
4、,例程的命名,首字母大写 中间应错落分明,便于阅读。,错误:procedure thisisapoorlyformattedroutinename;,正确:procedure ThisIsMuchMoreReadableRoutineName;,例程的名称应该同它的内容相符: 导致行为的例程应以动词开头: procedure FormatHardDrive; 设置 输入参数的例程应以单词 Set为前缀:: Procedure SetUserName; 接收值的例程应以单词 get为前缀: procedrue GetUserName:string,形参的定义,相同类型的形参应全并在一个词句中:,
5、procedure Foo(Param1,Param2,Param3:Integer;Param4:string),形参的命名,符合它们所代表的意义 以字符A为前缀 根据传送到例程中的标志符的名称命名形参。例如: procedrue SomePro(AuserName :string;AuserAge :integer);,参数的排序,1、常用参数放在最前面 2、其它参数依次从左到右排列。 3、输入参数列表放在输出参数列表的左边。 4、通用的参数放在特殊参数的左边,例如: Procedrue SomeProc(Aplanet,Acontinent,Acountry,Astate,Acity)
6、5、排序可能有些例外,比如事件的处理。类型Tobject 的Sender参数经常放在第一位。,1、在例程中不被改变的记录类型、数组类型、ShortString或接口类型: procedure comb(const Str:ShortString);,要做上常量标记的参数,Str是ShortString类型,应做上常量标记,2、非变参数,原因 :同时调用两个名称相同的例程的两个单元时,在uses子句中排在后面的单元中的例程将会被调用 解决方法:调用 该例程时写上相关的单元作前缀,例如:,名称的冲突,sysUtilt.FindClose(SR);,或 windows.FindClose(Handl
7、e);,变量的命名和格式,1、与使用目的相符。 2、循环控制变量的命名 a:单独的字符,比如I,J或K b:其它有意义的名字,比如UserIndex. 3、逻辑变量的名字能准确表达真或假的意思。,局部变量的定义,1、遵循其它变量的使用和命名约定 2、取名应合理 3、进入例程式后应初始化局部变量 注意:局部的AnsiString,自动初始化,空的字符串,局部接口,派分接口,自动初始化,nil,局部变数,ole变数类型,Unassigned,自动初始化,变量(无效),全局变量的使用,1、不推荐使用全局变量。 2、全局变量的使用应在一段上下文范围内:,Implementation,全局变量(有效),
8、其它单元,其它单元,其它单元,定义全局变量,3、多个单元类中使用全局数据,应将它们放到一个公共的单元中,供其它单元调用。,全局变量的使用,1、全局变量可以在var子句中直接初始化为一个值. 2、不必人为地初始化全局变量,定义全局数据,自动初始化为,0,零-初始化全局变量,虚拟数据段,Exe 文件中 占用空间,非零,人为初始化,大写的约定,1、Win32 API 类型 2、遵循Windows.pas或其它API单元中的详细类型名称的约定。 3、首字母大写 WindowHandle:HWND;/Win32 API 类型 I:Integer;/在System单元中引进的类型标识符,If(向前兼容早期
9、的Pascal代码) then 浮点指针类型=Real Else if(没有超出Double所定义的范围) then 浮点指针类型=Double Else 浮点指针类型=Extended,浮点指针类型,枚举类型的命名,1、名字符合使用目的 2、名字以字符T为前缀,以表明这是一个类型 3、枚举类型中的标识符包含两个或三个字符的前缀来对应于该 枚举类型的名字 例如: TsongType=(stRock,stClassical,stCountry,stAlternative,stHeavyMetal,stRB); 4、实例的名字应与不要前缀的枚举类型(SongType)相同,除非有更好的原因来赋予该
10、变量更特殊的名字,比如:FavoriteSongType1,FavoriteSongType2等等。,不建议使用 在运行时刻才能知道数据类型的程序中使用,变数(variant)和ole变数类型的使用,数组类型,1、名字应符合使用目的 2、类型名字必须加以前缀T 3、指针类型应加前缀P而且应在该数组声明的前面立即声明。例如: Type PCycleArray=TCycleArray; TCycleArray=array1.100 of integer; 4、 实际应用中,数组变量实例的名称应是其类型的名字去掉前缀T。,1、名字应符合使用目的 2、类型名字必须加前缀T 3、指针类型应加前缀P而且应
11、在该数组声明的前面立即声明。例如: type Pemployee=Temployee; Temployee=record; EmployeeName:string; EmployeeRate:Double; end;,记录类型,If() then 最常发生的事 Else 发生可能性较小的行为;,If 语句,If then . Else if then . Else if then Else if then,嵌套太多,怎么办,If then . If then . If then ,If 语句,有多个条件需测试,计算强度由少到多的顺序从左到右排列,怎么办?,有何好处,1、使编译器获得布尔估算逻辑
12、的捷径,2、代码最优化,例如:,If 条件1 and 条件2 and 条件3 then,Case语句,1、各个 独立的单元应以数字或字母顺序排列。 2、每一个case单元的动作行为应保持简单 3、若动作过于复杂,应采用独立的过程或函数。 4、Case语句中的else子句只有当需要缺省行为或处理错误时才使用。 5、Case语句格式应遵循其它结构的缩格和命名约定。,While 语句,1、不建议用Exit跳出循环,尽量用循环条件来跳出循环 2、初始化代码放在While语句开始处 While(条件) do begin 初始化代码; end; 3、结束后的处理,循环之后立即进行。,For 语句 and
13、Repeat 语句,在已知循环次数的情况下For 语句可以取代while语句使用。 Repeat 语句的使用同whie语句一样,遵循同样的通用方针。,With 语句,1、With 语句带有大量的警告,应节省使用。 2、With语句中使用多个对象、记录等要小心: with Record1,Record2 do . 3、格式 With 语句遵循本文档所说明的命名约定和缩格的格式规则。,若有问题,难以发现所在,结构异常处理,1、错误纠正和资源保护方面大量地使用异常的处理 2、可以用tryfinally来保证该资源被正确的释放。 3、在单元的initializition/finalization或对象
14、的structor/destructor中进行资源的分配和释放。,Tryfinally的使用,SomeClass1:=TsomeClass.Create; SomeClass2:=TsomeClass.Create; try do some code finally SomeClass1.Free; SomeClass2.Free; end;,会造成错误的代码,SomeClass1:=TSomeClass.Create; try SomeClass2:=TsomeClass.Create; try do some do finally SomeClass2.Free; end; Finally
15、 Someclass1.Free; End;,更安全的代码,1、在异常被触发时你想执行一些任务 2、不要只是简单地显示一个错误信息而使用tryexcept语句,Application对象会自动执行 3、在except子句中执行完一些任务之后调用缺省的异常处理,可用raise来重新触发异常到下一个句柄 4、不建议使用tryexcept中的else子句,Tryexcept的使用,类类型的命名和格式,1、名称应与使用目的相符。 2、类型名字应加前缀T: type Tcustomer=class(Tobject); 3、类型的实例通常是没有前缀T的类型的名字: var Customer:Tcustom
16、er; 注意:参阅“构件类型的命名标准”来获得更多有关构件命名的信息。,域,1、除了以F为前缀的域名外,其它的域名遵循与变量标识相同的约定。 2、 所有的域都必需是私有的。想在类的范围之外存取域得通过属性来实现。,域的方法,1、方法的命名应遵循有关过程和函数的约定叙述。 2、如果使用一个静态的方法,那么该方法不能被该类的后代类所继承。 3、使用虚拟的方法可以使该类的方法 被后代的类所继承。 4、只有该方法有多个继承(直接的或间接的)时才使用动态的方法。,方法(可继承),类类型,后代,后代,100个后代,动态产生,内存,使用,使用抽象的方法,抽象的方法只适用于不会被创建的类,属性存取方法,1、存
17、取类的方法都只能出现在类的private或protected部分。 2、属性存取方法的命名应遵循过程和函数的约定规则. 3、读取存取方法(方法读取器) 以单词Get为前缀. 4、写入存取方法(方法写入器) 以单词Set为前缀. 5、方法写入器参数的名字 应为Value,并且它的类型应是它所操作的属性的类型.例如: TSomeClass=class(Tobject) private FsomeField:Integer; protected function GetSomeField:Integer; Procedrue SetSomeField(Value:Integer); public p
18、roperty SomeField:Integer read GetSomeField write SetSomeField; end;,1、私有域的存取器属性的名字 应是它们所操作的域名除去解释符 2、属性名应是名词. 3、属性表示数据, 方法表示行为. 4、一般情况下属性的名称应为单数.但数组类型的名称是复数. 5、尽量少为表示私有域的属性而使用写入存取方法,属性,工程文件,1、文件名应取个描述性的名字.例如, 有关系统信息的程序的名字:SysInfo.dpr. 2、工程子文件 工程文件保存在一个单独的目录之中. 工程中包含的文件应按照相应的规则进行命名 每个子功能的相关文件应保存到对应的
19、工程文件子目录之中 子目录的命名为各子功能对应窗体(或其他)名称去掉相应的前缀.如frmAbout窗体就保存到About子目录之中.,窗体文件,窗体文件夹的命名应与使用目的相符,并加以前缀frm. 例如,一个“关于”的窗体的文件frmAbout.dpr. 主窗体的文件frmMain.dpr.,数据模板文件,1、数据模板的 命名应能表示模板的使用目的 2、它的名称应加前缀DM. 例如,自定义数据模板的文件名应为DMCustomers.dfm.,模板使用目的,前缀,1、模板的 命名应能表示模板的使用目的 2、它的名称应加前缀RDM. 例如,自定义远端数据模板的文件名应为 RDMCustomers.
20、dfm.,远端数据模板文件,模板使用目的,前缀,Unit文件,1、Unit文件应取一个可描述的名字.例如: 包含应用主窗体的单元叫:frmMain.pas 2、Interface部分的uses子句只能包含Interface中代码需要的单元 3、Implementation部分的uses子句只能包含Implementation中代码需要的名字 4、If(其它单元需要) then 在Interface部分定义存取类型、变量、过程/函数 Else 在Implementation部分定义存取类型、变量、过程/函数 5、Initialization部分不要放入耗时过长的代码。,Initializatio
21、n部分 (很多代码),第一个界面 出现缓慢,第一个界面怎么还没出来?,单元 命名,1、窗体单元文件名与窗体文件名相同。 例如,“关于”窗体的单元名为frmAbout.pas 主窗体的单元名为 frmMain.pas 2、数据模板的单元文件名与数据模板文件名相同。 3、一般目的单元的取名 a、与该单元的使用目的相同 b、不能与工程中使用的所有包中的单元名字相同 c、不赞成使用一般或通用的单元名字 4、构件单元 a、名字应同它们的内容相符 b、放在独立的目录,使它与同定义的构件有所区分 c、存放它的目录要与工程文件在不同的目录,文件头,在所有源文件、工程文件、单元等等中使用信息化文件头。一个文件头
22、应包含以下信息 版 权:宁波四维科技有限公司 版权所有 编制日期:年/月/日 设计人员: 编码人员: 修改日期: 年/月/日 (修改人1) 年/月/日 (修改人n) 使用说明:说明使用本文件的方法以及本文件中所有函数用关键字变量的调用方法及相关关系 ,窗体类型命名标准,1、取名应能表达窗体的使用目的 2、类型定义应加前缀Tfrm 例如:一个“关于”的窗体类型名字: TfrmAbout=class(Tform); 主窗体的定义: TfrmMain=class(Tform); 一个用户接入窗体的名字: TfrmCustomerEntry=class(Tform);,创建窗体实例,1、窗体实例应是没
23、有带前缀T的相应类的名字 例如: 类型名称 实例名称 TfrmAbout frmAbout TfrmMain frmMain TfrmCustomerEntry frmCustomerEntry 2、只有主窗体是可以自动创建的 3、其它的窗体必须从工程选项对话框中的自动创建列表中移走,1、所有的窗体单元都应包含一个窗体实例化函数,用来创建、设置、模式地显示窗体和释放窗体 2、函数的返回值是窗体的模式结果 3、参数的传递遵循指定的“参数传递”标准 4、窗体的变量从单元中移走,并在窗体实例函数中进行本地式的定义。 5、窗体必须从工程/选项对话框中的自动创建表中剔除,模式窗体实例化函数,下面单元展示
24、了在GetUserData窗体中的一个函数 unit UserData Interface uses windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs, StdCtrls; type TUserDataForm=class(TForm) edtUserName:TEdit; edtUserID:Tedit; private Private declarations public Public declarations Function GetUserData(var aUserName:String;var aU
25、serID:Integer):word; Implementation $R *.DFM,模式窗体实例化函数实例,Function GetUserData(var aUserName:String;var aUserID:Integer):word; Var Userdataform : tuserdataform; Begin Userdataform := tuserdataform.create(application); Try Userdataform.caption := getting user data ; Result: := userdataform.showmodal;
26、If (result = mrok) then Begin Ausername := userdataform.edtusername.text; Auserid :=strtoint(userdataform.edtuserid.text); End; Finally Userdataform.free; End; End; End.,创建窗体,设置窗体,返回窗体模式结果,释放窗体,1、模板的取名应与 模板的使用目的相符 2、类型的定义应加前缀T,再加上表示数据模板的前缀DM 例如:自定义的数据模板:TDMCustomer=class(TDataModule) 命令式的数据模板:TDMOrd
27、ers=class(TDataModule) 3、实例的名称应是不带前缀T的类型的名称。 例如: 类型名称 实例名称 TDMCustomer DMCustomer TDMOrder DMOrders,数据模板,包,1、运行包和设计包的比较 a、运行时包中包含其它构件包所要求的单元或构件,包括属性/构件编辑器和其它只为设计的代码 b、设计包通常是通过调用运行时包来运作,设计包中包含注册单元; 2、文件命名标准,请看下面的例子:,a、字符“SWT” 是个前缀,用来标识公司。,b、字符“VV”表示为该包想要对应Delphi某个版本的包的版本号。,“ SWTlibvv.pkg” 设计时刻包 “ SWT
28、istdvv.pkg”运行时刻包,SWT,SWT,c、注意,设计时包前缀后加“lib”,运行时包加“std” d、如果既是设计时刻包又是运行时刻包,该文件的命名是同上面一样的, 例如, 为delphi4开发者指南做的包的名称应为: Ddglib40.pkg设计时刻包 Ddgstd40.pkg运行时刻包,用户自定义构件,标准构件中构件的命名除了按照“类类型”部分定义外,还要加上标识公司的前缀“swt”: TswtClock=class(TComponet),三个前缀字符应小写,构件单元,1、构件单元只包含一个主要的构件 2、主要构件是指出现在构件栏中的构件 3、辅助构件/对象应放入到同一个单元中
29、,使用注册单元,1、构件的注册过程应从构件 本身的单元中剔除,放到一个独立的单元中。 2、这个单元可以用来注册任何构件、属性编辑器、构件编辑器、专家器等。 3、构件的注册 只应在设计时刻包中进行。 4、注册单元应包含在设计时刻包中而不应放在运行时刻包中。 5、推荐使用的注册单元的名称是: SWTReg.pas上面的3个前缀字符“SWT”用来标识公司。,构件实例命名约定,1、所有的构件都应取个描述性的名称。 2、由Delphi创建的缺省名的构件不会被遗弃。 3、设计构件类型应设计一个小写的前缀。,为什么用前缀,不用后缀呢?,搜寻时,在对象检查器和代码探索器中搜寻构件的名字比搜寻构件的类型更容易实
30、现,构件的前缀,以下构件的前缀可以用来设计Delphi 5中的标准构件 Standard页 前缀构件 mmTMainMenu pm TPopupMenu lblTLabel edtTedit memTmemo btnTButton cbTCheckBox rbTRadioBox lbTListBox cbTComboBox scbTScrollBar gbTGroupBox rgTRadioGroup pnlTPanel clTActionList,Additional页,前缀构件 bbtnTBitBtn sbTSpeedButton meTMaskEdit sgTStringGtid dgT
31、DrawGrid imgTImage shpTShape bvlTBevel sbxTScrollBox clbTCheckListBox splTSplitter stxTStaticText chtTChart,Win32页,前缀构件 tbcTTabControl pgcTPageControl ilTImageList reTRichEdit thrTTrackBar prbTProgressBar udTUpDoun hkTHotKey aniTAnimate dtpTDateTimePicker mcTMonthCalender tvTTreeView lvTListView hdr
32、THeaderControl stbTStatusBar tlbTToolBar clbTCoolBar,System页,前缀构件 tmTTimer pbTMediaPlayer olecTOleContainer ddccTDDEClientConv ddciTDDEClientItem ddscTDDEServerConv ddsiTDDEServerItem,前缀构件 cskTClientSocket sskTServerSocker wbdTWebDispatcher ppTPageProducer tpTQueryTAbleProducer dstpTDataSetTAbleProd
33、ucer dsppTDataSetPageProducer wbTWebBrowser,Internet页,Data Access页,前缀构件 dsTDataSource tblTTable qryTQuery spTStoredProc dbTDataBase ssnTSession bmTBatchMove usqlTUpdateSQL ntTNestedTable,Data Access页,前缀构件 dbgTDBGrid dbnTDBNavigator dbtTDBText dbeTDBEdit dbmTDBMemo dbiTDBImage dblbTDBListBox dbcbTDBC
34、heckBox dbrgTDBRadioGroup dbllTDBLookupListBox dblcTDBLookupComboBox dbreTDBRichEdit dbchTDBChart,Decision Cube页,前缀构件 dcbTDecisionCube dcqTDecisionPuery dcsTDecisionSource dcpTDecisionPivot dcgTDecisionGrid dcgrTDecisionGraph,Qreport页,前缀构件 qrTQuickRep qrsdTQRSubDetail qrbTQRBand qrsbTQRStringBand qr
35、cbTQRChildBand qrgTQRGroup qrlTQRLabel qrdtTQRDBText qreTQRExpr qrsTQRSysData qremTQRExprMemo qrmTQRMemo qrrtTQRDBRichTEXT qrshTQRShape qriTQRImage qrdiTQRDBMImage qrcrTQRCompositeReport qrpTQRPreview qrtfTQRTextFilter qrcsvfTQRCSVFilter qrhtmlfTQRHTMLFitter qrchTQRChart,ADO 页,前缀构件 adocTADOConnection adocomTADOCommand adodsTADODataSet adotTADOTable adoqTADOQuery adospTADOStoredProc rdscTRDSConnection,InterBase页,前缀构件 tbtTiBTable tbtTiBQuery tbspTiBAtoredproc tbdbTiBDataBase tbtrTiBTransaction tbusTiBUpdataSQL tbdsTiBDataSet tbsqlTiBSQL tbdbiTiBDataBaseInfo tbsmTiBSQLMonitor
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 营销推广方案执行手册
- 创新科技诚信服务承诺函4篇
- 虚拟现实在教育培训中的应用研究
- 销售线索管理与转化标准化流程模板
- 企业内审流程标准化操作规范
- 山东省临沂蒙阴县联考2026届初三联合模拟考试语文试题含解析
- 2026年广西北部湾经济区市级名校初三第六次摸底考试语文试题含解析
- 江苏省南京市十三中市级名校2025-2026学年初三质量检测试题(二)语文试题含解析
- 个人失窃事情报警与处理预案
- 工程安全高效完成承诺书(4篇)
- 2026年吉安职业技术学院单招综合素质考试题库含答案详解
- 2026年安徽林业职业技术学院单招综合素质考试题库含答案解析
- 薄抹灰施工方案
- 2026年餐饮服务标准操作流程培训
- 2026年南京交通职业技术学院单招职业技能考试题库及答案详解(基础+提升)
- 卫生院防雷安全生产制度
- 绍兴2025年浙江绍兴市政务服务办公室招聘政务服务专员6人笔试历年参考题库附带答案详解
- 中华人民共和国药品管理法实施条例培训宣贯
- 2024新版2026春北师大版八年级数学下册全册教案教学设计
- 【生物】2025-2026学年人教版生物七年级下册核心知识点
- 基层信访工作培训课件
评论
0/150
提交评论