l(SomeClass1); FreeAndNil(SomeClass2); end;(3). try...except的用法 如果你希望在发生异常时执行一些任务,可以使用try...except。通常,没有必要为了简单地显示一个错误信息而使用try...except,因为Application对象能够自动根据上下文做到这一点。如果要在子句中激活默认的异常处理,可以再次触发异常。 (4). try...except...else的用法 不鼓励使用带else子句的try...except,因为这将阻塞所有的异常,包括你没有准备处理的异常。 3.命名规范3.1.过程(Procedure)与函数(Function)1).命名 过程与函数名应当有意义。进行一个动作的过程最好在名称前加上表示动作的动词为前缀。例如: procedure FormatHardDrive;
设置输入参数值的过程名应当以Set 为其前缀,例如: procedure SetUserName;
获取数值的过程名应当以Get 为其前缀,例如: function GetUserName:string;
2).形参 所有形参的名称都应当表达出它的用途。如果合适的话,形参的名称最好以字母a 为前缀,例如: procedure SomeProc(aUserName:string; aUserAge:integer);
当参数名与类的特性或字段同名时,前缀a 就有必要了。 3).命名冲突 当两个单元中含有相同名称的过程时,如果调用该过程,实际被调用的是Uses 子句中较后出现的那个单元中的过程。为避免这种情况,可在方法名前加想要的单元名,例如: SysUtils.FindClose(SR); 或Windows.FindClose(Handle);
3.2.变量(Variable) 变量的名称应当能够表达出它的用途。循环控制变量常常为单个字母,诸如I 、J 或K 。也可以使用更有意义的名称,例如UserIndex。布尔变量名必须能清楚表示出True 和False 值的意义。 1). 局部变量 局部变量遵循其他变量的命名规则。 2). 全局变量 全局变量以大写字母“G”打头,并遵循其他变量的命名规则。 3.3.类型(Type)3.3.1.一般类型1). 枚举型 枚举类型名必须代表枚举的用途。名称前要加T字符作为前缀,表示这是个数据类型。枚举类型的标识符列表的前缀应包含2 - 3 个小写字符,来彼此关联。例如: TSongType=(stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB);
枚举类型的变量实例的名称与类型相同,但没有前缀T ,也可以给变量一个更加特殊名称,诸如:FavoriteSongTypel、FavoriteSongType2等等。 3.3.2.构造类型1). 数组类型 数组类型名应表达出该数组的用途。类型名必须加字母“T”为前缀。如果要声明一个指向数组类型的指针,则必须加字母P 为前缀,且声明在类型声明之前。例如: type PCycleArray = ^TCycleArray; TCycleArray=array[1..100] of integer;
实际上,数组类型的变量实例与类型名称相同,但没有“T”前缀。 2). 记录类型 记录类型名应表达出记录的用途。类型名必须加字母T为前缀。如果要声明一个指向记录类型的指计,则必须加字母P为前缀,且其声明在类型声明之前。例如: type PEmployee = ^TEmployee; TEmployee = record EmployeeName: string; EmployeeRate: Double; end;
3.3.3.类类型(Class)1). 命名与格式 类的名称应当表达出类的用途。一般的类名前要加字母“T”,如果是接口类那么类名前要加“I”,错误异常类的类名前要加“E”,而类引用类型(Class-reference type)则要在类名后加“Class”,抽象类一般是在类名前还要加“Custom”。例如: type TCustomCipher = class(TObject); TCipher = class(TCustomCipher); ICipher = interface; TCipherClass = class of TCustomer ECipherException = class(Exception);
类的实例名称通常与类名相同,只不过没有前缀“T”。 var Customer: TCustomer;
注意:关于元件的命名,请参阅“元件类型”。 2).字段(1) 命名与格式 字段的命名遵循与变量相同的规则,只不过要加前缀F ,表示这是字段。 (2) 可见性 所有字段必须为私有。如果要在类的作用域之外访问字段,可借助于类的属性来实现。 3).方法(1) 命名与格式 方法的命名遵循与过程和函数相同的规则。 (2) 静态方法 当你不希望一个方法被派生类覆盖时,应当使用静态方法。 (3) 虚拟方法(virtual)与动态方法(dynamic) 当你希望一个方法能被派生类覆盖,应当使用虚拟方法(virtual)。如果类的方法要被多个派生类直接或间接地使用,则应当用动态方法(dynamic)。例如,某一个类含有一个被频繁覆盖的方法,并有100个派生类,则应将方法定义为动态的,这样可以减少内存的开销。 (4) 抽象方法(abstract) 如果一个类要创建实例,则不要使用抽象方法。抽象方法只能在那些从不创建实例的基类中使用。 (5) 属性访问方法 所有属性访问方法应当定义在类的私有或保护部分。属性访问方法遵循与过程和函数相同的规则。用于读的方法应当加“Get”前缀,用于写的方法应当加“Set”前缀,并且有一个叫Value的参数,其类型与属性的类型相同。例如: TSomeClass = class(TObject) private FSomeField: Integer; protected function GetSomeField: Integer; procedure SetSomeField(Value: Integer); public property SomeField: Integer read GetSomeField write SetSomeField; end;
尽管不是必须,但还是建议你使用写访问方法来访问代表私有字段属性。 4).属性 属性作为私有字段的访问器,遵循与字段相同的命名规则,只不过没有F前缀。属性名应为名词,而不是动词。属性是数据,而方法是动作。数组属性名应当是复数,而一般的属性应当是单数。 3.3.4.元件类型1). 元件类型的命名标准 元件的命名与类的命名类似,只不过当它与其它元件名称冲突时,你可以加上3个字符的前缀,用以标识公司、个人或其他实体。例如,一个时钟元件可以这样声明: TddgClock = class(TComponent)
注意,作为前缀的3 个字符要小写。 2). 元件实例的命名规则 元件实例的名称应当能够描述其实际意义,这里命名规则使用了一个变更的匈牙利前缀命名规范。使用前缀而不使用后缀的原因是在搜寻时,在对象检查器和代码探索器中搜寻构件的名字比搜寻构件的类型更容易。在这个标准中,元件实例名包括两个部分:前缀和性质标识名。 (1). 元件的前缀 元件的前缀多是表现元件类型的字母缩写。参见下面表中的元件前缀: 元件类名元件前缀TActionList, TAction表示动作的列表项actTButton, TSpeedButton, TBitBtn等所有的按钮类btnTCheckBox, TDBCheckBox等所有的检查框chkTRadioButton单选按钮类rdoTToolBar工具条tbTMainMenu所有的主菜单类mmTMainMenuItem所有的菜单项类miTPopupMenu所有的弹出式菜单类pmTPopupMenuItem所有的弹出式菜单项类pmiTLabel, TStaticText等所有用来显示的标签类lblTPanel等所有的面板类pnlTPageControl等所有的页式控件类pgcTEdit, TMaskEdit等所有的单行编辑框类edtTMemo, TRichEdit等所有的多行编辑框类mmoTDrawGrid, TStringGrid等所有的网格类grdTAnimate等所有的动画类aniTImageList等所有的图片列表类ilTImage等图片类imgTChart图表类chtTComboBox, TDBComboBox等所有的下拉式列表框类cboTListBox, TDBList等所有的列表框类lstTTreeViewtvTListViewlvTHotKeyhkTSplitter等所有的分隔符类sptTOpenDialog等所有的对话框元件类dlgTTable等所有的数据表类tblTQuery等所有的SQL查询类元件qryTClientDataSet所有的客户数据集元件cdsTDataSourcedsTDatabasedbTSockConnection,TDCOMConnection等连接元件类conTQuickRep, TFastReport等所有的报表元件类rptTDDEClientConv,TDDEClientItem等所有的DDE元件类ddeTMonthCalendar等所有的日历类calTGroupBox等控件类grp 如上所示,元件类型前缀是从分析描述元件的类型性质而来的。通常情况下,下面的规则描述如何定义一个元件类型前缀: - 从元件类型名中移去T前缀。例如TButton变成Button。
- 除了第一个元音,删去所有元音字母。例如,Button变成bttn,Edit变成edt。
- 压缩双字母。例如,bttn变成btn。
- 如发生冲突,则在某一元件前缀中加入一个元音。例如在TBatton元件的前缀中加入元音变为batn,以区别TButton的前缀。
- 不过,上述规则首先得保证前缀名称必须符合习惯,做到见名知意,如:TDDEClientConv控件的前缀就是一个例外。
注意:元件的前缀是为了表示出元件的类型,是按钮,还是标签等等,因此没有必要为每一个特别元件类建立一个元件前缀,如: TMyButton的元件前缀仍为btn。 (2). 元件性质标识名 元件性质标识名是元件意图的描述。例如,一个用于关闭窗体的TButton元件实例可命名为btnClose。一个编辑姓名的元件实例可命名为edtName。 3.3.5.窗体与对话框类型1). 窗体类型的命名标准 窗体或对话框类型的名称应当表达出窗体的用途,如果是窗体要加“Tfrm”前缀,如果是对话框要加“Tdlg”,后跟描述性名。例如,About窗体类型名称为: TfrmAbout = class(TForm)
主窗体的类型名称为: TfrmMain = class(TForm)
客户登录窗体的类型名称为: TfrmCustomerEntry = class(TForm)
登陆对话框的类型名称为: TdlgLogin = class(TForm)
2). 窗体实例的命名标准 窗体实例的名称与相应的类型名称相同,但没有前缀T 。例如,前面提到的窗体类型与实例的名称为: 类型名实例名TfrmAboutfrmAboutTfrmMainfrmMainTfrmCustomerEntryfrmCustomerEntryTdlgLogindlgLogin3). 自动创建的窗体 除非特别原因,只有主窗体才自动生成。其他所有窗体必须从Project Options对话框的自动生成列表中删除。更进一步信息,请参阅后面几节。 4). 模式窗体实例化函数 所有窗体单元都应当含有实例化函数,用于创建、设置、模式显示和释放窗体。这个函数将返回由窗体返回的模式结果。传递给这个函数的参数遵循参数传递的规则。之所以要这样封装,是为了便于代码的重用和维护。 窗体的变量应当从单元中移走,改在窗体实例化函数中作为局部变量定义(注意,要求从Project Options对话框的自动生成列表中移走该窗体。请看前面的内容。 例如,下面的单元文件演示了GetUserData的实例化函数。 Unit UserDataFrm; Interface Uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; Type TfrmUserData = class(TForm) edtUserName: TEdit; edtUserID: TEdit; private { Private declarations } public { Public declarations } end; function GetUserData(var aUserName: String;var aUserID: Integer): Word; implementation {$R *.DFM} function GetUserData(var aUserName: String;var aUserID: Integer): Word; var frmUserData: TfrmUserData; begin frmUserData := TfrmUserData.Create(Application); frmUserData.Caption:=''''Getting User Data'''' ; Result : = frmUserData.ShowModal; if Result=mrOK then begin aUserName := frmUserData.edtUserName.Text; aUserID := StrToInt(frmUserData.edtUserID.Text); end; finally frmUserData.Free; end; end; End. 5).窗体框架与复合窗体 如果一个窗体结构过于复杂,就必须将其分化成为一个主窗体框架以及嵌入到主窗体框架的若干子窗体框架。如: TfrmMainFrame: TfrmInfoFrame,TfrmEditorFrame
使用窗体框架,主要是为了解决界面和代码复用问题,以及提高单元代码的内聚力(划分后,每一个窗体框架为一个独立单元),从而提高软件工程质量。你必须提炼出界面关联代码(可复用的)和应用关联代码(不能复用的)。 3.3.6.数据模块类型1). 数据模块的命名标准 数据模块类型名称应表达出它的用途,且要加前缀“Tdm”,后跟描述性名称。例如,Customer数据模块的类型名称为: TdmCustomer = class(TDataModule)
Orders 数据模块的类型名称为: TdmOrder = class(TDataModule)
2). 数据模块实例的命名标准 数据模块实例的名称应当与相应的类型名称相同,但没有前缀T 。例如,前面的数据模块类型、实例名称如下: 类型名称实例名TdmCustomerdmCustomerTdmOrderdmOrder3.4.文件 建议在所有源文件、项目文件和单元文件使用结构化的文件头信息。一个文件头至少应包含以下信息: { Copyright @ Year by Authors }
详细说明,请参阅:单元文件注释文档格式。 3.4.1.项目文件 项目文件的名称应当具有描述意义。例如,“The Delphi 5 Developer’s Guide Bug Manager ”的项目名称为DDGBugs.dpr,一个系统信息程序的名称为SysInfo.dpr。 3.4.2.窗体文件 窗体文件的名称应当表达出窗体的用途,且具有Frm后缀。例如,About窗体的文件名叫AboutFrm.dfm,主窗体的文件名叫MainFrm.dfm。 3.4.3.数据模块文件 数据模块文件的名称应当表达出数据模块的作用,且具有DM后缀。例如,Customers数据模块的文件名叫CustomersDM.dfm。 3.4.4.远程数据模上一页 [1] [2] [3] 下一页 |