<< Click to Display Table of Contents >> Access命名规则 |
Access 命名规则: |
好的命名规则让你受益终生
为什么在程序编写中需要遵循一个好的命名规则呢。
首先,统一的命名标准能够让你的代码始终保持一致的风格,便于你自己看懂,也便于与别的开发人员交流和沟通,实际上,这些标准也是一种语言,这是你们沟通最好的媒介,有了它,你甚至不需更多的解释,对方就能看懂你的程序。
1. | 编程老手可能会长期用隐含错误的方式编程(习惯成自然),发现毛病后都不愿相信那是真的! |
2. | 编程高手可以在某一领域写出极有水平的代码,但未必能从全局把握软件质量的方方面面。 |
3. | 在团体开发中, 一个好的命名规则能够最大限度的实现程序共享, 加快开发进度。让协作者、后继者和自己在现在或将来很久以后,在最短的时间内看清你的程序结构,理解你的设计思路。从而大大提高代码的可读性、可重用性、可移植性。 |
4. | 通过命名注入更多的信息在源代码中,可以使你的程序易读和易于维护,减少一些隐性错误,同时大大缩短你写程序注释和程序文档的时间,因为你的命名实际上已经是一种程序注释。 |
5. | 提高与ACCESS对象协作的能力, 包括对象的排序, 自已函数库的编写, 以及查找与替换的能力,例如你更容易把报表和窗体对象、表和查询对象分开并按照一定的规则排序。 |
6. | 有利于程序编写工具的开发, 可以编写自己的加载项并遵守好的命名规则来加快程序代码的编写、排版以及自动纠错。如全局查找与替换工具、代码分析与优化工具、报表自动生成工具等等。 |
7. | 更易于发现代码的错误并更易于修正错误,当系统的要求实现的功越来越复杂或当代码量到达一定的规模, 不管程序员是否愿意, 出现错误几乎都是不可避免的,但如果大家都遵循一定的编程标准,则可以最大限度地降低错误出现的机率, 而且在出现错误的情况下也能迅速地发现和排除。 |
8. | 长期遵循一个好的命名规则能让你长期稳定地编写高质量、高效率和更大型的程序。 |
LNC for Microsoft Access 命名规则简介: |
LNC即Leszynski Naming Convention, 原来在《The Leszinski/Reddick Guidelines for Access 1.x, 2.x》这本白皮书中由Stan Leszynski 和 Greg Reddick 推荐使用的命名规则, LNC 开始于 Access 1.0这个版本, 后来随着ACCESS版本的升级,这个命名规则就被迅速传播开来, 在当今ACCESS和VB开发者和开发团体中, 它已经成为事实中的命名标准, 在国外已经广泛被使用,并被微软推荐使用, 它规范了从ACCESS数据库设计、窗体与报表的设计以及程序的编写一整套完整且易用的命名标准, 我看过国内许多VB和ACCESS源程序, 但很少人, 特别在ACCESS程序员中, 注意到命名规则并遵循某种命名约定, 这给程序交流造成了很大的困难, 同时, 由于程序员自己没有一套标准的命名规则, 在编写过程中随意命名, 随着时间的推移, 自已都难以阅读和修改以前的程序源码。
LNC for Microsoft Access 详解: |
LNC命名规则分为两个级别,级别1是比较容易理解的,但级别2对对象进行了更严格的划分,级别1更多地适合初级程序员,而级别2则更适合于一些有经验的开发者,或在一些非常复杂或多层结构的系统开发中使用,你应该根据你自己的经验和习惯来选择更适合你的命名规则级别。请注意,不是命名规则的所有部分都分为两个级别,而只是在某些部分有所不同
LNC命名规则是基于匈牙利命名法,为什么叫匈牙利命名法呢,主要是取自于作者的国籍,它的作者 Charles Simonyi ,也曾经使用过ACCESS的早期版本。匈牙利命名法是在他的博士论文中提到的。匈牙利命名法的一些基本原理在Visual Basic的说明手册和一些开发文档中都会被提及到,微软内部也是使用匈牙利命名法,在世界上,已经有非常多的程序员在使用这个命名法,LNC命名规则实际上是将匈牙利命名法应用到ACCESS上, 并特别针对ACCESS一些特征进行了一些完善。
LNC命名规则提倡所有的对象的名称均由下面四个部分组成:
一个或多个前缀、一个标记符、基本名字、限定词
[prefixes]tag[Basename][Qualifier] 注:[]里的内容表示为可选内容。
标记符是必须的内容,但一般情况下,你都需要一个基本名字来准确描述你的变量的实际功能,以用来区分同类型的不同意义的变量。如果你仅仅使用一个标记符来标记一个变量,那么就比较难以分辨不同的变量,但有一种情况除外,那就是你传一个对象参数给另一个函数时,可以不需要指定基本名字,例如你需要传递一个窗体对象给一个初始化窗体颜色的函数,那么这个作为参数传递的窗体对象实际上是作为一种通用的窗体对象,所以你不必为它指定一个具体的名字,而直接使用标记符即可。
下面举出几个简单的例子:
名称 |
前缀 |
标记符 |
基本名字 |
限定符 |
备注 |
tblCustomer |
|
tbl |
Customer |
|
客户表 |
aintPartNum |
a |
int |
PartNum |
|
零件号数组 |
strCustNamePrev |
|
str |
CustName |
Prev |
原来的客户名 |
前缀和标记符总是小写的,这样当我们的眼光扫过对象名称时,目光就会停留在以大写字母开头的基本名字上面,这样提高了名称的可读性,基本名字和限定符都是以大写字母开头的。
基本名字简洁地描述了这个对象的意义,而非描述它的类别,例如在查询qryPartNum这个名称中,PartNum就是基本名字,它是 “Part Number”的缩写,对象的标记符应该是简单且易记忆的,而前缀是放在对象名和标记符之前,用来提供更多或额外的信息,例如数字对象intPartNum前加个a, 代表这个零件号数组,即aintPartNum,更进一步,如果我们需要一个变量来指定aintPartNum这个数组的索引,那需要在这个数组的前面再加一个前缀I,那这个变量的名称应该是iaintPartNum。当然,你会发现,如果严格按照上述的规范来命名你所有的对象,需要你付出更多的努力并增加你现有的工作量,但如果一年后让你重新来修改下面这两种风格的代码,你会觉得哪种更易于修改和更易于重用呢。
第一种风格:
Z = Y(X)
第二种风格:
intPart = aintPartNum(iaintPartNum)
对象限定符是在基本名字后面再加一个符号以更具体阐明这个对象,我们还是以前面的iaintPartNum为例,如果你想为这个数组保存两个索引号,一个是第一个索引号,一个是最后一个索引号,在iaintPartNum加上限定符就变成了iaintPartNumFirst和iaintPartNumLast
命名数据库对象: |
数据库对象(表、查询、窗体、报表、宏、模块)是在ACCESS应用程序中经常被引用的对象,它们会出现在宏、VBA代码和属性中,所以如何对它们正确命名是非常重要的。
微软所带的Northwind数据库例程以及微ACCESS手册中允许对象名中存在空格,但我们不建议这种命名风格,在许多数据库引擎和编程语言中,包括ACCESS BASIC,空格是一种分隔符,它不是对象名称的一个逻辑部分,而且,在许多数据库平台中包括微软的SQL SERVER数据库和WORD文字处理程序,带有空格的名称是不能工作的。相反,使用一种大小写混合的方式来指定名称,例如:tblAccountsPayable,如果一定要使用空格,那就用下划线“_”来取代它。
对LNC命名规则中,所有数据容器对象都有一个标记符,在对象名称前面加上标记符对非编程人员来说可以不会增加太多可读性,但对于编程新手来说,当他们需要在报表精灵的数据源列表框或一个窗体的控件源选择一个表或查询时,添加标记符会带来很大帮助,因为ACCESS会把表和查询不加分别地放在一个长列表里。
下面是级别1的数据库容器对象的标记符:
对象 |
标记符 |
例子 |
Table |
tbl |
TblCustomer |
Query |
qry |
qryOverAchiever |
Form |
frm |
FrmCustomer |
Report |
rpt |
rptInsuranceValue |
Macro |
mcr |
mcrUpdateInventory |
Module |
bas |
BasBilling |
在级别1, 数据库容器对象唯一需要的一个限定符就是 Sub, 它是放在那些子窗体或子报表的窗体名的后面. 例如窗体 frmProductSupplier 拥有一个相关的子窗体frmProductSupplierSub. 这样,一旦排序时,对象和它的子对象就会顺序排在一起。
下面是级别2的数据库容器对象的标记符:
对象 |
标记符 |
例子 |
Table |
tbl |
tblCustomer |
Table (lookup) |
tlkp |
tlkpShipper |
Query (select) |
qry (or qsel) |
qryOverAchiever |
Query (append) |
qapp |
qappNewProduct |
Query (crosstab) |
qxtb |
qxtbRegionSales |
Query (data definition) |
qddl |
qddlAddWorkColumn |
Query (delete) |
qdel |
qdelOldAccount |
Query (form filter) |
qflt |
qfltSalesToday |
Query (lookup) |
qlkp |
qlkpStatus |
Query (make table) |
qmak |
qmakShipTo |
Query (pass-through) |
qspt |
qsptArchiveQuantity |
Query (union) |
quni |
quniOrderDetail |
Query (update) |
qupd |
qupdDiscount |
Form |
frm |
frmCustomer |
Form (dialog) |
fdlg |
fdlgLogin |
Form (menu) |
fmnu |
fmnuUtility |
Form (message) |
fmsg |
fmsgWait |
Form (subform) |
fsub |
fsubOrder |
Report |
rpt |
rptInsuranceValue |
Report (subreport) |
rsub |
rsubOrder |
Macro |
mcr |
mcrUpdateInventory |
Macro (for form) |
m[formname] |
mfrmCustomer |
Macro (menu) |
mmnu |
mmnuEntryFormFile |
Macro (for report) |
m[rptname] |
mrptInsuranceValue |
Module |
bas |
basBilling |
如果使用级别2 的命名规则,则在数据库容器里排序时,有着类似功能的对象会排在一起,当你的应用越来越大时,在你的数据库系统中可能会包含100个窗体或者更多,而其中30个窗体是用来显示消息用的,如果有一天,你需要将这个消息窗体里面的文本框的文字由黑色全部改成红色,你必须逐一打开每个窗体确定它是否消息窗体然后再修改文本框的颜色,但如果你把它们的名称设为包含同样的标记符fmsg, 那么排序时它们会排在一起,那你修改的时候就不必一个一个去筛选了,大大节约了你修改时间。
请小心仔细地选择表的名称,因为改变ACCESS对象的名称并不会自动应用到整个数据库,所以当在ACCESS对象创建时给它正确命名是非常重要的。例如,在以后的开发过程中如果需要改变表的名称,你可需要改变所有引用到到这个表名的表、查询、窗体、报表、宏和模块中引用到到这个表名,虽然,有一些辅助工具可以帮你减轻一些工作量,但最好还是在一开始就给它正确地命名。
你可能希望引用了一个表的每个数据对象都有一个与表名一样的基本名字,而使用相应的标记符来区分它们,例如,你的表名是tblCustomer,它的主窗体名应该是frmCustomer,它的主报表名应该是rptCustomer,而引发相关这些事件的宏名应该是mfrmCustomer和mrptCustomer,我们也建议表的名称不宜用复数形式,例如使用tblCustomers,因为一个表通常都是包含多条记录的,这暗示它本身就是复数的。
数据库对象前缀
? | 我们使用四种数据库对象前缀: |
? | "zz"表示那些你已经废弃的但是可能想要在数据库中将来作为参考或保存使用的对象 (举例来说,zzfrmPhoneList). "zz"将导致对象名称排在数据库容器的底部,这样,它就会放在一个不显眼的地方,但它仍然是有效的。 |
? | "zt"表示一些临时的对象 (举例来说,ztqryTest). |
..1 | "zs"表示系统对象 (举例来说,zstblObjects). 系统对象是那些不被最终用户使用的那些有关系统开发和维护方面的对象,例如错误日志,开发注解,文档,关联信息等等. (注意 "zs" 是前缀.这样系统对象就会尽量排在数据库容器的底部). |
"_" 来表示那些正在开发中的对象 (举例来说,_mcrNewEmployee). 一个对象名字前面加上下划线可使它排在数据库容器的顶端,提醒你它需要注意. 当这个对象已经全部完成后 ,除去下划线,它将会正常地排序.
字段标志符
在字段上使用标志符一直是一个争议的话题,甚至在这个文章的作家之间也存在不同的见解. Greg主张字段标志符也应该统一使用与其它ACCESS数据对象及VBA中使用的一样的命名规则 ,而Stan则更喜欢使用一种与平台和数据类型无关的命名方式,即字段名称不需要加字与字段类型相关的标志符,这样有助于数据库移植和相互连通。
考虑到两者的立场,连同你自己的需求,你们可以选择在命名时是否加入下表这些标志符:
数据类型 |
标志符 |
例子 |
Binary |
Bin |
binInternal |
Byte |
Byt |
bytFloorNum |
Counter |
Lng |
lngPKCnt |
Currency |
Cur |
curSalary |
Date/Time |
Dtm |
dtmHireDate |
Double |
dbl |
dblMass |
Integer |
int (C programmers may prefer "w") |
intUnit |
Long |
lng (C programmers may prefer "dw") |
lngPopulation |
Memo |
mem |
memComments |
Ole |
ole |
oleEmpPhoto |
Single |
sng (Some users find "sgl" more mnemonic ) |
sngScore |
Text |
str (Used as opposed to "txt" because a textbox control uses "txt". C programmers may prefer "sz") |
strFirstName |
Yes/No |
ysn (C programmers may prefer "f") |
ysnDiscounted |
? | 注意: |
..2 | ACCESS引擎 ("jet") 支持二进制的数据类型,但它并没有对用户开放这种功能,但是你可以通过汇入或链接到外部表来实现这种数据类型,而且,一些系统表也使用这种数据类型命名。 |
..3 | 在ACCESS内部,自动编号数据类型是当作是一种长整型来对待,只是增加了一个auto-increment的特殊属性,而自动编号字段经常会作为外键被其它表引用,所以Greg使用了与长整型同样的标记符,但如果你想区分长整型与自动编号类型,则可以在对象名称最后加上Cnt限定符 |
..4 | 标签控件对象 |
当你创建一个新的绑定控件时,窗体或报表会自动分配字段的名称给这个控件名称,控件与字段使用相同的名称会导致命名的混乱,特别你在VBA代码中同时引用到字段和控件,有时会导致一些错误,为避免这种情况,需要在控件名称前面加上标记符,例如一个文本框控件,它的控件来源是Customer,那么我们给它取的名称就是txtCustomer.
在级别1 中,使用者只是想区分活动控件和标签,对不太关心控件的类型,这样,控件的标记符就如下所示:
Object |
Tag |
Example |
Label |
lbl |
lblLastName |
Other types |
ctl |
ctlLastName |
级别1描述了了控件之间一个很小的差异性的,不过,它在函数、宏或程序文档还是非常有用的,例如,通过它可以区别哪些控件是属于标签,那些是其它控件,其中前者是不可修改的,而后者则可从用户输入或代码中接受值
级别2指明了窗体或报表中控件的类型,这样VBA代码或宏更容易区分这些控件的属性和事件
对象 |
标记符 |
例子 |
Chart (graph) |
cht |
chtSales |
Check box |
chk |
chkReadOnly |
Combo box |
cbo |
cboIndustry |
Command button |
cmd |
cmdCancel |
Frame (object) |
fra |
fraPhoto |
Label |
lbl |
lblHelpMessage |
Line |
lin |
linVertical |
List box |
lst |
lstPolicyCode |
Option button |
opt |
optFrench |
Option group |
grp |
grpLanguage |
Page break |
brk |
brkPage1 |
Rectangle (Visual Basic uses the term "shape") |
shp |
shpNamePanel |
Subform/report |
sub |
subContact |
Text box |
txt |
txtLoginName |
Toggle button |
tgl |
tglForm |
对控件来说,唯五的前缀就是 “zs”,它只出现在级别2中,它表明这是一个系统控件,只被窗体或代码使用,而不对用户开放,例如有些控件在运行时是不可见的,但它可能用来存储一些临时值或传递参数给窗体
唯一的前缀为控制, "zs",出现在水平 2. 它指示系统- 水平被形式用或编码的控制但是不对使用者显示. 如此的控制通常不对~感到看得见的跑计时但是他们可能储存暂时的价值,否则叁数传给形式.
命名代码或宏中的对象: |
使用标准的描述性强的变量、常量、和函数名可大大增强代码的共享、维护、和联接的能力
1. | 变量的标记符 |
每个变量都应有一个如下表所示的标记符
变量类型 |
标记符 |
例子 |
Container |
con |
Dim conTables as Container |
Control |
ctl |
Dim ctlVapor As Control |
Currency |
cur |
Dim curSalary As Currency |
Database |
db |
Dim dbCurrent As Database |
Document |
doc |
Dim docRelationships as Document |
Double |
dbl |
Dim dblPi As Double |
Dynaset |
dyn |
Dim dynTransact As Dynaset |
Flag (Y/N, T/F) |
f |
Dim fAbort As Integer |
Field |
fld |
Dim fldLastName as Field |
Form |
frm |
Dim frmGetUser As Form |
Group |
gru |
Dim gruManagers as Group |
Index |
idx |
Dim idxOrderId as Index |
Integer |
int |
Dim intRetValue As Integer |
Long |
lng |
Dim lngParam As Long |
Object |
obj |
Dim objGraph As Object |
Parameter |
prm |
Dim prmBeginDate as Parameter |
Property |
prp |
Dim prpUserDefined as Property |
QueryDef |
qdf (or qrd) |
Dim qdfPrice As QueryDef |
Recordset |
rec (or rst) |
Dim recPeople as Recordset |
Relation |
rel |
Dim relOrderItems as Relation |
Report |
rpt |
Dim rptYTDSales As Report |
Single |
sng |
Dim sngLoadFactor As Single |
Snapshot |
snp |
Dim snpParts As Snapshot |
String |
str |
Dim strUserName As String |
Table |
tbl |
Dim tblVendor As Table |
TableDef |
tdf (or tbd) |
Dim tdfBooking as TableDef |
Type (user-defined) |
typ |
Dim typPartRecord As mtPART_RECORD |
User |
usr |
Dim usrJoe as User |
Variant |
var |
Dim varInput As Variant |
Workspace |
wrk (or wsp) |
Dim wrkPrimary as Workspace |
Yes/No18 |
ysn |
Dim ysnPaid As Integer |
在我们的命名方式中,不使用$ 和 %这些数据类型前缀,因为在ACCESS和Visual basic的文档中是不推荐使用这些前缀的
象窗体和报表这样的数据库对象变量的标记符是与数据库对象的标记符是一样的,这样命名有助于编程,因为通常你分配给一个变量的名称(如tblVendor)与它所引用的对象(tblVendor)有同样的名称,这样就会在编程中提供统一的对象
2. | 常量和自定义数据类型 |
使用大写名字作为常量,这是WINDOWS编程的一种习惯,
3. | 范围前缀 |
命名级别2中引入了变量和常量的范围前缀的概念,范围放在其它所有前缀的前面
➢ | 局部定义的变量没有前缀 |
➢ | 局部定义的静态变量前缀为 "s", 例如 "sintAccumulate". |
➢ | 在模块声明节里(或窗体代码)定义的变量使用m作为前缀,例如 "mcurRunningSum". |
➢ | 使用 Global 定义的全局变量使用前缀 "g", 例如 "glngGrandTotal". |
➢ | 作为函数或子程序参数传递的变量 (函数名称后面的圆括号里) 使用前缀 "p", 例如 "pstrLastName". 另外, 当在一个函数定义部分形参和值参都存在时,我们有时也使用 "r" 而不是 "p" 来指明是形参, 用 "v" 来指明是值参,。 |
➢ | 对象名称后面的限定符进一步区分那些意义很接近的对象. 你可能已经针对各类应用设计了自己的一系列限定符,不过,下表中有些通用的限定符 |
变量属性 |
限定符 |
例子 |
Current element of set |
Cur |
iaintCur |
First element of set |
First |
iaintStockFirst |
Last element of set |
Last |
iaintStockLast |
Next element of set |
Next |
strCustomerNext |
Previous element of set |
Prev |
strCustomerPrev |
Lower limit of range |
Min |
iastrNameMin |
Upper limit of range |
Max |
iastrNameMax |
Source |
Src |
lngBufferSrc |
Destination |
Dest |
lngBufferDest |