<< Click to Display Table of Contents >> Access标准化命名-高手必经之路 |
Access对象标准化命名规则与良好的注释习惯
Access高级开发必学课程
摘自 2005年 王宇虹 熊靖 李宏亮 《专家门诊:Access开发答疑200问》 第十六章 Access开发规范
摘选 2006年 王宇虹 朱亦文 陈格 朱彦志 出版的《Access数据库系统开发从基础到实践》 部分内容
Access高级程序员是如何炼成的
一个程序员在经过一段时间的学习和训练之后,一般都可独立编写一些应用程序,而且程序也会越写越顺手,但这并不表明程序编得越多,经验就会越丰富,效率也会越高。有句古语:行百里者半九十,就是说无论做任何事,当达到一定的境界后,越往上,进展就会越来越慢,要想在原来的基础上再提高一个层次,需要付出比以前更多的努力。而且如果以前的基础打得不够扎实或是没有遵循一个严格的标准,很可能就会停滞不前,而且写得越多,心态越疲,得益越少,思维越见混乱,只能一直无休止地重复以前做过的工作,无法从代码中超脱出来以集中更多的精力来考虑客户的实际需求,为着编程而编程,实际上这些弊端都是由于没有注重编程基本功的训练导致的,我自己也是做了几年的程序员后才发现这个问题,特别是一些初学编程者,刚学会了一个编程语言,掌握了一种新的开发工具,“当手中拿着一把新锤子的时候,那看什么都是钉子”,所以动不动就想做个应用系统,把功能搞得非常复杂,代码写得老长老长,一口气可以写下几兆程序,而且让别人一时都看不懂自己的程序,就越觉得自己有实力,如果对方看得几遍,还是晕头转向,那对他来说感觉更是好极啦。其实,在现在的软件行业中,代码编写只占了整个开发周期中很少的一部分,而系统分析与功能设计以及系统运行后的维护却是占了整个软件系统中很大的比重,特别像一些非常庞大的系统,如MRP、ERP、CRM这样大型的管理软件,一般功能做到一定的程度后,都不再需要编写大量的代码,只是根据客户一些的具体需求对系统做适量的用户化修改,必要时才可能做二次开发,那在这种情况下,对程序员或实施人员来说,更多的是阅读代码,而不是编写代码,如果原来的程序员基本功扎实,按统一的标准和统一的风格编写,并且有详尽的注释及更改记录,那做二次开发的程序员将会事半功倍,甚至不必询问以前的程序员就可顺利地在已有的功能上添加新的功能和模块,因为大家遵循同一个标准,程序的风格和程序的代码就是他们的语言,这是他们沟通最好的媒介。
最后强调一句,在基本功上花的时间永远不会嫌多的,而且每花一次,你都会有更深的认识,无论你是现在处于程序员的哪一个阶段。
在命名中花时间永远都不过份。
.1 | 编程风格 |
对作家而言,文章可以看出他的一生,文如其人就是此说,而对于程序员来说,码如其人,代码的风格多多少少也折射出一个程序员的性格和处事的方式,好的代码让人如饮甘醇,久久回味,差的代码让人初见无味,久而生厌。
模仿一句名言:不值得读两遍的程序,连一遍也不值得读。
.1.1 | 基本要求 |
£¨1 | 程序很多时间不是给程序员看的,是给不懂程序的人看的。 |
在编程之前,得设想你的程序是给那些不懂程序的人看的,这样设身处地想一想,也许你就会更多地注意程序的文档和注释。事实上,程序很多时候的确是给他们看的。
£¨2 | 不要太相信自己的编程能力, 程序尽量写得简单易懂, 太长的程序尽量分成多个子程序或函数, 使程序结构清晰, 方便自已阅读也方便别人阅读, 一般来说,单个函数的程序行数不得超过50行。 |
£¨3 | 对核心程序尽量优化代码, 不同的语法可能适合不同的情况, 但同时需要考虑代码的易读性, 我的建议是要尽量两者兼顾. |
£¨4 | 尽量先使用ACCESS本身提供的内部函数, 实在不行, 才定义自己的子程序和公共函数。 |
£¨5 | 不要随意定义全局变量,尽量使用局部变量。 |
£¨6 | 使用括号以避免二义性。 |
.1.2 | 可读性要求 |
£¨1 | 正确性第一, 可读性第二,效率第三。首先要保证程序是准确的, 算出的结果是对的, 然后再考虑程序的可读性, 它关系到你以后维护程序的难度和维护的时间. 最后再在前二者的基础上再做代码上的优化. |
£¨2 | 不需要对所有代码都做注释, 过份的注释会加重系统的负担, 且间接增加阅读的困难, 特别是垃圾注释, 对显而易见的程序不必做过多的说明, 否则阅读者会感觉你在轻视他. 或觉得你写得太累赘, 浪费他的时间. 但对核心部分或关键算法以及程序的难点需要有详细的注释. 好的程序注释如同无处不在的挚友, 在你正需要帮助的时候才出现, 而不是整天唠唠叨叨或婆婆妈妈的保姆, 让你心烦. 另外需注意注释不是一次性的工作, 它需要经常更新, 保证代码与注释完全一致, 不一致的注释会将读者引入歧途. |
£¨3 | 每个模块或类模块,都应有模块头说明,说明详细规格见规范。 |
£¨4 | 每个函数,都有函数头说明,说明规格见规范。 |
£¨5 | 主要变量(结构、联合、类或对象)定义或引用时,注释能反映其含义。 |
£¨6 | 常量定义(DEFINE)有相应说明。 |
£¨7 | 处理过程的每个阶段都有相关注释说明。 |
£¨8 |
£¨9 | 利用缩进来显示程序的逻辑结构,缩进量一致并以Tab键为单位,定义Tab为 6个 字节。 |
£¨10 | 循环、分支层次不要超过五层。 |
£¨11 | 注释可以与语句在同一行,也可以在上行。 |
£¨12 | 空行和空白字符也是一种特殊注释。 |
£¨13 | 一目了然的语句不加注释。 |
£¨14 | 注释的作用范围可以为:定义、引用、条件分支以及一段代码。 |
£¨15 | 注释行数(不包括程序头和函数头说明部份)应占总行数的 1/5 到 1/3 。 |
.1.3 | 结构化要求 |
£¨1 | 禁止出现两条等价的支路。 |
£¨2 | 禁止GOTO语句。 |
£¨3 | 用 IF 语句来强调只执行两组语句中的一组。禁止 ELSE GOTO 和 ELSE RETURN。 |
£¨4 | 用 CASE 实现多路分支。 |
£¨5 | 避免从循环引出多个出口。 |
£¨6 | 函数只有一个出口。 |
£¨7 | 不使用条件赋值语句。 |
£¨8 | 避免不必要的分支。 |
£¨9 | 不要轻易用条件分支去替换逻辑表达式。 |
.1.4 | 正确性与容错性要求 |
£¨1 | 程序首先是正确,其次是优美 |
£¨2 | 无法证明你的程序没有错误,因此在编写完一段程序后,应先回头检查。 |
£¨3 | 改一个错误时可能产生新的错误,因此在修改前首先考虑对其它程序的影响。 |
£¨4 | 所有变量在调用前必须被初始化。 |
£¨5 | 对所有的用户输入,必须进行合法性检查。 |
£¨6 | 不要比较浮点数的相等,如: 10.0 * 0.1 == 1.0 , 不可靠 |
£¨7 | 程序与环境或状态发生关系时,必须主动去处理发生的意外事件,如文件能否逻辑锁定、打印机是否联机等。 |
£¨8 | 单元测试也是编程的一部份,提交联调测试的程序必须通过单元测试。 |
.1.5 | 可重用性要求 |
£¨1 | 重复使用的完成相对独立功能的算法或代码应抽象为公共控件或类。 |
£¨2 | 公共控件或类应考虑OO思想,减少外界联系,考虑独立性或封装性。 |
£¨3 | 5.3 公共控件或类应建立使用模板。 |
.1.6 | 其它要求 |
£¨1 | 采用各层次缩进的风格,每层缩进一个TAB长度,这样使程序更加清晰和易于阅读,特别在嵌套很多的代码中,这种风格更易于阅读及更易于跟踪维护。 |
£¨2 | 变量必须先定义再使用,不能隐性定义变量,避免带来一些不必要的隐性错误。 |
£¨3 | 使用模块、类模块和COM来使程序封装得更好,并使程序更易于重用和更易于移植。 |
£¨4 | 尽量使用标准库函数和公共函数。 |
£¨5 | 不要随意定义全局变量,尽量使用局部变量,以免占用过多的内存资源。 |
£¨6 | 在容易引起二义性的表达式中,请使用括号以避免歧义。 |
£¨7 | 函数只有一个出口。 |
£¨8 | 避免不必要的分支,禁止出现两条等价的支路。 |
£¨9 |
.2 | 命名规则 |
.2.1 | 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程序员中, 注意到命名规则并遵循某种命名约定, 这给程序交流造成了很大的困难, 同时, 由于程序员自己没有一套标准的命名规则, 在编写过程中随意命名, 随着时间的推移, 自已都难以阅读和修改以前的程序源码。
.2.2 | 好的命名规则让你受益终生 |
为什么在程序编写中需要遵循一个好的命名规则呢。
首先,统一的命名标准能够让你的代码始终保持一致的风格,便于你自己看懂,也便于与别的开发人员交流和沟通,实际上,这些标准也是一种语言,这是你们沟通最好的媒介,有了它,你甚至不需更多的解释,对方就能看懂你的程序。
£¨1 | 编程老手可能会长期用隐含错误的方式编程(习惯成自然),发现毛病后都不愿相信那是真的! |
£¨2 | 编程高手可以在某一领域写出极有水平的代码,但未必能从全局把握软件质量的方方面面。 |
£¨3 | 在团体开发中, 一个好的命名规则能够最大限度的实现程序共享, 加快开发进度。让协作者、后继者和自己在现在或将来很久以后,在最短的时间内看清你的程序结构,理解你的设计思路。从而大大提高代码的可读性、可重用性、可移植性。 |
£¨4 | 通过命名注入更多的信息在源代码中,可以使你的程序易读和易于维护,减少一些隐性错误,同时大大缩短你写程序注释和程序文档的时间,因为你的命名实际上已经是一种程序注释。 |
£¨5 | 提高与ACCESS对象协作的能力, 包括对象的排序, 自已函数库的编写, 以及查找与替换的能力,例如你更容易把报表和窗体对象、表和查询对象分开并按照一定的规则排序。 |
£¨6 | 有利于程序编写工具的开发, 可以编写自己的加载项并遵守好的命名规则来加快程序代码的编写、排版以及自动纠错。如全局查找与替换工具、代码分析与优化工具、报表自动生成工具等等。 |
£¨7 | 更易于发现代码的错误并更易于修正错误,当系统的要求实现的功越来越复杂或当代码量到达一定的规模, 不管程序员是否愿意, 出现错误几乎都是不可避免的,但如果大家都遵循一定的编程标准,则可以最大限度地降低错误出现的机率, 而且在出现错误的情况下也能迅速地发现和排除。 |
£¨8 | 长期遵循一个好的命名规则能让你长期稳定地编写高质量、高效率和更大型的程序。 |
.2.3 | 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). |
.2.4 | "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.5 | ACCESS引擎 ("jet") 支持二进制的数据类型,但它并没有对用户开放这种功能,但是你可以通过汇入或链接到外部表来实现这种数据类型,而且,一些系统表也使用这种数据类型命名。 |
.2.6 | 在ACCESS内部,自动编号数据类型是当作是一种长整型来对待,只是增加了一个auto-increment的特殊属性,而自动编号字段经常会作为外键被其它表引用,所以Greg使用了与长整型同样的标记符,但如果你想区分长整型与自动编号类型,则可以在对象名称最后加上Cnt限定符 |
.2.7 | 标签控件对象 |
当你创建一个新的绑定控件时,窗体或报表会自动分配字段的名称给这个控件名称,控件与字段使用相同的名称会导致命名的混乱,特别你在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. 它指示系统- 水平被形式用或编码的控制但是不对使用者显示. 如此的控制通常不对~感到看得见的跑计时但是他们可能储存暂时的价值,否则叁数传给形式.
.3 | 命名代码或宏中的对象 |
使用标准的描述性强的变量、常量、和函数名可大大增强代码的共享、维护、和联接的能力
.3.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)有同样的名称,这样就会在编程中提供统一的对象
.3.2 | 常量和自定义数据类型 |
使用大写名字作为常量,这是WINDOWS编程的一种习惯,
.3.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 |
为企业及个人定制各种管理系统
• | 销售、采购、仓库管理系统 |
• | 人事、考勤、工资管理系统 |
• | 生产、质检、财务管理系统 |
• | 票据、物流、POS管理系统 |
• | 房产、中介、学校管理系统 |
• | HRM、CRM、ERP企业管理系统 |
以十多年的管理和开发经验提供
• | 专业的管理咨询 |
• | 企业流程优化 |
• | 管理软件实施 |
为企业及个人提供专业培训
• | 真实案例与应用场景,十多年的Access开发经验精华浓缩,真正企业级的应用,众多企业开发高手在线 |
• | 微软论坛首家Access合作伙伴网站,20万会员论坛支持,20多位微软最有价值专家,最大Access QQ群 |