编者按: 良好 的 命名规范可以为团队合作开发推波助澜,无论在项目开发,还是产品维护上都起到了至关重要的作用。应该说命名规范是一种约定,也是程序员之间良好沟通的桥 梁。另外古人相信只要知道一个人真正的名字就会获得凌驾于那个人之上的不可思议的力量。只要给事物想到正确的名字,它就可以带来比代码更强的力量。如果所 有的命名都与其自然相适合,则关系清晰,含义可以推导得出,一般人的推想也能在意料之中。
在本期的月刊中,我们将围绕着“命名规则”这个主题展开讨论。收集各种B/S语言下常见命名规范,希望对各位开发能有所帮助。

面向对象编程中,对于类,对象,方法,变量等方面的命名是非常有技巧的。比如,大小写的区分,使用不同字母开头等等。但究其本,追其源,在为一个资源其名 称的时候,应该本着描述性以及唯一性这两大特征来命名,才能保证资源之间不冲突,并且每一个都便于记忆。

Java包的名字都是由小写单词组成。但是由于Java面向对象编程的特性,每一名Java程序员都可以编写属于自己的Java包,为了保障每个 Java包命名的唯一性,在最新的Java编程规范中,要求程序员在自己定义的包的名称之前加上唯一的前缀。由于互联网上的域名称是不会重复的,所以程序 员一般采用自己在互联网上的域名称作为自己程序包的唯一前缀。
例如: net.frontfree.javagroup 类的名字必须由大写字母开头而单词中的其他字母均为小写;如果类名称由多个单词组成,则每个单词的首字母均应为大写例如TestPage;如果类名称中包 含单词缩写,则这个所写词的每个字母均应大写,如:XMLExample,还有一点命名技巧就是由于类是设计用来代表对象的,所以在命名类时应尽量选择名 Circle

方法的命名 方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头。
例如: sendMessge

常量的命名

常量的名字应该都使用大写字母,并且指出该常量完整含义。如果一个常量名称由多个单词组成,则应该用下划线来分割这些单词。
例如: MAX_VALUE

参数的命名

参数的命名规范和方法的命名规范相同,而且为了避免阅读程序时造成迷惑,请在尽量保证参数名称为一个单词的情况下使参数的命名尽可能明确。

Javadoc注释

Java除了可以采用我们常见的注释方式之外,Java语言规范还定义了一种特殊的注释,也就是我们所说的Javadoc注释,它是用来记录我们代码 中的API的。Javadoc注释是一种多行注释,以/**开头,而以*/结束,注释可以包含一些HTML标记符和专门的关键词。使用Javadoc注释 的好处是编写的注释可以被自动转为在线文档,省去了单独编写程序文档的麻烦。
* This is an example of
* Javadoc
* @author darchon
* @version 0.1, 10/11/2002
在每个程序的最开始部分,一般都用Javadoc注释对程序的总体描述以及版权信息,之后在主程序中可以为每个类、接口、方法、字段添加Javadoc 注释,每个注释的开头部分先用一句话概括该类、接口、方法、字段所完成的功能,这句话应单独占据一行以突出其概括作用,在这句话后面可以跟随更加详细的描 述段落。在描述性段落之后还可以跟随一些以Javadoc注释标签开头的特殊段落,例如上面例子中的@auther和@version,这些段落将在生成 文档中以特定方式显示。
虽然为一个设计低劣的程序添加注释不会使其变成好的程序,但是如果按照编程规范编写程序并且为程序添加良好的注释却可以帮助你编写出设计完美,运行效 率高且易于理解的程序,尤其是在多人合作完成同一项目时编程规范就变得更加重要。俗话说“磨刀不误砍柴工”,花费一点时间去适应一下Java编程规范是有

注意:这只是一个原则。第三方公司可以选择其它的名字。
避免用公司名称或其它著名品牌的名称作为名称空间的前缀,这样会造成两个公布的名称空间有同一个名称的可能性。
例如: 将微软提供的Office自动类命名为Microsoft.Office

使用Pascal大写方式,用逗号分隔逻辑成分。
例如: Microsoft.Office.PowerPoint

如果你的品牌使用的是非传统大写方式,那么一定要遵循你的品牌所确定使用的大写方式,即使这种方式背离了通常的名称空间大写规则。
例如: NeXT.WebObjects
ee.cummings

类和类成分的命名

类的命名原则是用名词或名词短语命名类,使用Pascal大写。减少类名中缩写的使用量。不要使用任何类前缀(比如C),不要使用带下划线的字符。
例如:
public class FileStream {}
public class Button {}
public class String {}

变量的命名

名称中各单词首字母均为大写。
例如:
FindLastRecord
RedrawMyForm
在内部范围中避免使用与外部范围中的名称相同的名称。若访问错误变量,则会产生错误结果。若变量与同一名称的关键字冲突,则必须在关键字前加适当的类型库以作标识。
例如: 若有一个名为 date 的变量,只能通过调用 System.Date 来使用内部 Date 函数。

函数和方法的命名

函数和方法的命名应该以动词开始,使用Pascal大写。不要使用带下划线的字符。
例如:
InitNameArray
CloseDialog

接口命名原则

使用名词或名词短语,或者描述行为的形容词来命名接口,使用Pascal大写。 减少接口名中缩写的使用量,在接口名前加前缀I,以表示这个类型是一个接口。
例如: IComponent(描述性名词)
ICustomAttributeProvider(名词短语)
IPersistable(形容词)

参数的命名 使用描述性参数名。参数名应该具有足够的描述性,这样在大多数情况下参数名和它的种类可以用来确定它的意思。根据参数的意思来命名参数,而不是根据参数 的种类来命名。我们希望开发工具可以用很方便的方式提供关于参数种类的信息,这样参数名可以得到更好的使用,可以对语义而不是对种类进行描述。但是偶尔使 用根据类型命名的参数名也是完全可以的。不要使用保留参数。如果在下一个版本中需要更多的数据,可以增加进来。
例如: Type GetType (string typeName)
string Format (string format, object [ ] args)

属性的命名

用名词或名词短语命名属性,属性与类型要一样。 用与一个类型的名称相同的名字来命名属性时,就使这个属性的类型成为那个类型。虽然听起来有些奇怪,但这是正确的。
例如: public enum Color {...}
public class Control {
public Color Color {get {...} set {...}}

事件的命名

用EventHandloer 后缀命名事件处理程序,使用名为sender和e的两个参数,Sender参数代表提出事件的对象。Sender参数永远是一个类型对象,即使它可能使用 了更为特定的类型,与事件相关的状态被封装在一个名为e的事件类范例中。要使用这个类型的正确的、特定的事件类。
例如: public delegate void MouseEventHandler(object sender, MouseEvent e);
命名事件名时,需要有之前和之后的时态概念,因此要使用现在时态和过去时态(不要使用BeforeXxx""AfterXxx的方式)。例如,可以被取消的结束事件就有Closing事件和Closed事件。

长项和常用项的命名

可使用缩写使名称长度适中,通常,多于 32 个字符的变量名在低分辨率的监视器上难以阅读。同时,请确保缩写在整个应用程序中保持一致。
例如: 可以使用“HTML”代替“HyperText Markup Language”。

代码书写格式规范

  • 文件之中不得存在无规则的空行,比如说连续十个空行。一般来讲函数与函数之间的空行为2-3行
  • 在函数体内部,在逻辑上独立的两个函数块可适当空行,一般为1-2行。
  • 每行长度尽量避免超过屏幕宽度,应不超过80个字符。
  • 尽量用公共过程或子程序去代替重复的功能代码段。
  • 使用括号清晰地表达算术表达式和逻辑表达式的运算顺序。如将 x=a*b/c*d 写成 x=(a*b/c)*d可避免阅读者误解为x=(a*b)/(c*d)。
  • 避免采用过于复杂的条件测试。
  • 避免过多的循环嵌套和条件嵌套。
  • 一个函数不要超过200行。一个文件应避免超过2000行。
  • 避免使用goto语句。
  • 避免采用多赋值语句,如x = y = z;。
  • 代码注释规范

    .cs文件的注释
    所有 .cs文件开头都要加上注释,写明文件创建时间、作者、用途概述等

    //********************************************************

    //新增日期:2004.7.19

    //作者:XXX

    //內容说明: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    //********************************************************

    函数过程注释
    所有的函数体开头都要加上注释,所以注释使用 .NET注释规范。

    /// <summary>

    /// 构造函数

    /// </summary>

    /// <param name='is_xxx1'>示例参数1</param>

    /// <param name='is_xxx2'>示例参数2</param>

    public UpgradeThread(string is_xxx1, string is_xxx2)

    常量变量注释

    /// <summary>

    /// 当前线程指向的备份文件本地保存路径

    /// </summary>

    public string StorePath = '';

    代码修改注释

    //BEGIN 2004-7-19 Jayson 修正了XXX问题
    //END 2004-7-19 Jayson

    在为类(class )命名前首先要知道它是什么。如果通过类名的提供的线索,还是想不起这个类是什么的话,那么就说明设计存在问题。
    超过三个词组成的混合名是容易造成系统各个实体间的混淆,尝试使用(CRC Se- ssion card)看看该命名所对应的实体是否有着那么多的功用。
    对于派生类的命名应该避免带其父类名的诱惑,一个类的名字只与它自身有关,和它的父类叫什么无关。
    使用大写字母作为词的分隔,其他的字母均使用小写,名字的首字母使用大写 。不要使用下划线('_') 。
    例如: class NameOneTwo
    class Name

    类库的命名

    目前命名空间正在越来越广泛的被采用,以避免不同厂商和团体类库间的类名冲突。当尚未采用命名空间的时候,为了避免类名冲突,一般的做法是在类名前加上独特的前缀,两个字符就可以了,当然多用一些会更好。
    例如: John Johnson的数据结构类库可以用Jj做为前缀,如下:
    class JjLinkList

    方法的命名

    采用与类命名一致的规则,同样是使用英文单词诠释出方法的作用。
    例如:
    class NameOneTwo
    function DoIt() {};
    function HandleError() {};

    类属性的命名

    属性命名应该以字符‘m’为前缀。前缀‘m’后采用于类命名一致的规则。‘m’总是在名字的开头起修饰作用,就像以‘r’开头表示引用一样。
    前缀'm'防止类属性和方法名发生任何冲突。你的方法名和属性名经常会很类似,特别是存取元素。
    例如:
    class NameOneTwo
    function VarAbc() {};
    function ErrorNumber() {};
    var mVarAbc;
    var mErrorNumber;
    var mrName;

    方法中参数的命名

    第一个字符使用小写字母。在首字符后的所有字都按照类命名规则首字符大写。
    这样做可以随时知道哪个变量对应哪个变量。另外,这样做可以使用与类名相似的名称而不至于产生重名冲突。
    例如:
    class NameOneTwo
    function StartYourEngines(
    &$rSomeEngine,
    &$rAnotherEngine);

    变量的命名

    所有字母都使用小写。使用'_'作为每个词的分界
    通过这一途径,代码中变量的作用域是清晰的。所有的变量在代码中都看起来不同,容易辨认。
    例如:
    function HandleError($errorNumber)
    $error = OsErr();
    $time_of_error = OsErr->getTimeOfError;
    $error_processor = OsErr->getErrorProcessor;

    全局变量的命名

    全局变量应该带前缀‘g’。
    知道一个变量的作用域是非常重要的。
    例如:
    global $gLog;
    global &$grLog;

    函数的命名

    函数名字采用C GNU的惯例,所有的字母使用小写字母,使用'_'分割单词。
    这样可以更易于区分相关联的类名。
    例如:
    function some_bloody_function()

    NoahWeb 汲取了各种编程语言的精华,经过反复的总结,最终形成了一套独特且高效的命名规则。在命名的过程中,使用“资源名称+功能描述”的方式,保证了资源之间的唯一性,并且大大提高了资源的描述性和阅读性。

    页面或动作传值命名 规则

    关于文件的命名,看似无足重轻,但实际上如果没有良好的命名规则进行必要的约束,一味的乱起名称,最终导致的结果就是整个网站或是文件夹无法管理。所以,命名规则在这里同样非常重要。 需要特别注意的时候, 网站文件或文件夹命名请尽量避免使用中文字符命名。

    文件的命名 以最少的字母达到最容易理解的意义。
    索引文件统一使用index.html文件名(小写) index.html文件统一作为"桥页",不制作具体内容,仅仅作为跳转页和meta标签页。主内容页为main.html
    按菜单名的英语翻译取单一单词为名称。所有单英文单词文件名都必须为小写,所有组合英文单词文件名第二个起第一个字母大写; 所有文件名字母间连线都为下划线。
    例如: 关于我们 "aboutus
    信息反馈 "feedback
    产  品 "product

    图片的命名

    以图片英语字母为名。以最少的字母达到最容易理解的意义。
    对于较小的图片,我们使用如下格式的命名 :
    sm.kahn.gif
    其中,sm 代表“small”,kahn 代表图片的内容。较大图像的命名规则也一样,不过是以 bg 开头的:
    bg.kahn.gif
    用以区分不同图像的命名规则应当是全站通用的,这样可以尽量避免将不同的名称搅混。

    网站目录的命名

    目录建立的原则是以最少的层次提供最清晰简便的访问结构。
    服务器的ftp上传目录默认为html 根目录文件 根目录只允许存放index.html和main.html文件,以及其他必须的系统文件。
    每个语言版本存放于独立的目录。已有版本语言设置为: 简体中文 "gb 繁体中文 "big5 英 语 "en 日 语 "jp 每个主要功能(主菜单)建立一个相应的独立目录。 根目录下的images为存放公用图片目录,每个目录下私有图片存放于各自独立images目录.
    例如: "menu1"images
    "menu2"images
    另外,所有的js文件存放在根目录下统一目录"script 所有的CSS文件存放在根目录下的style目录 所有的CGI程序存放在根目录并列目录"cgi_bin目录。
    对于一些信息更新量比较大的站点或是栏目,还可以采用一种更为特殊的方式来进行文件架的命名,这样能使得日后的维护更加方便,这样的方式就是使用“单 一单词命名的目录”+“年年年年_月月_日日”的方式命名,最后的“日日”是根据更新量大小可选择的,如果每日更新量很大则可以加上“日日”。
    例如: "news"2005_08"
    "news"2005_09"

    "news"2005_10_12"

    在Dreamweaver中用户可以对一系列不同类型的对象进行命名,这些对象包括图片、层、表单、文件、数据库域等,这些对象将会被许多不同的工作引 擎进行分析处理,这些工具包括各种浏览器、JavaScript脚本解析器、网络服务器、应用程序服务器、查询语言等等。
    如果某个对象的名称无法被某个解析器识别,就有可能会导致故障的发生,更加麻烦的是用户可能很难发现问题的原因,例如某个具体的特效无法正确显示,或 者是在某个特殊阶段无法正确显示,有时故障可能只会在某种特殊情况或在使用某个浏览器时发生,而在其它情况下保持正常,用户将很难分析出故障是由于命名问 题而导致的。
    由于需要命名的对象的种类很多,对这些对象进行解析的引擎工具也很多,因此用户在给这些对象命名时应该遵循一个常规的标准,以确保普遍兼容性。命名的 基本原则就是:使用独一无二的、小写、不带空格的名称,名称应由字母和数字组成,并以字母开始,名称中可以包含"_"符号。

    请确保某对象的名称与其它对象不同,保证其独一无二的属性。
    例如: 你可以将某对象命名为"feedback_button_3" 有些服务器和脚本解析器对文件名的大小写也进行检查,而为了避免因大小写引起的不兼容问题,建议用户在命名时全部使用小写文件名。 不同的解析器对空格等符号的解析结果不同,例如某些解析器会把空格视为某个十六进制的数值,因此建议用户使用不带空格的单词做为文件对象的名称。 用户在命名中可以随意使用26个罗马字母以及10个阿拉伯数字,而不建议使用其它标点符号。

    以字母开始 有些解析器不喜欢以数字开头的文件名。
    例如: 在某些浏览器中的JavaScript脚本内部,如果使用"alpha23"这样的名称就不会出现问题,而如果使用"23alpha"这样的名称就可能会发生故障。

    可包含"_"符号 为了使某个对象的文件名独一无二,用户可以通过使用"_"符号来更加详细地描述文件名。
    例如: 某对象的文件名可以是"jd_background_17"。
    除了上述原则标准之外,我们还需要注意一些其它情况,如文件名与系统的冲突。某些文件名可能满足上述标准,但可能还会导致故障的发生,原因是因为它们与系统产生了冲突。
    例如:当在使用JavaScript脚本函数时,不建议用户将某个变量命名为"for",因为"for"在本系统下是一个工作语言字串,使用其命名某个变量可能会导致解析器工作出错。许多程序都有一些保留名称,这些名称一般不建议用户使用。 例如:
    用户使用某个SQL程序保留的名称来命名某个数据库域,SQL对其进行分析时就可能会报错。
    此外,用户在将不同来源的代码编到一起时,应该注意文件名的冲突情况。
    例如: 用户把来自不同资源的两个JavaScript行为代码编至同一网页内,而这两个行为代码的变量名相同,这时就有可能出现问题。
    因此做为查询故障的一个技巧,在出现故障时,用户可以查询一下相同网页中是否存在相同文件名的变量名称。

    VBScript 的早期版本不允许创建用户自定义常数。如果要使用常数,则常数以变量的方式实现,且全部字母大写以和其他变量区分。常数名中的多个单词用下划线 (_) 分隔。
    例如: USER_LIST_MAX 、NEW_LINE

    这种标识常数的方法依旧可行,但您还可以选择其他方案,用 Const 语句创建真正的常数。这个约定使用大小写混合的格式,并以con”作为常数名的前缀。
    例如: conYourOwnConstant

    变量命名规则

    出于易读和一致性的目的,请在 VBScript 代码中使用以下变量命名约定:

    描述性变量名和过程名的命名规则

    变量名或过程名的主体应使用大小写混合格式,并且尽量完整地描述其目的。另外,过程名应以动词开始,例如 InitNameArray 或 CloseDialog。

    对于经常使用的或较长的名称,推荐使用标准缩写以使名称保持在适当的长度内。通常多于 32 个字符的变量名会变得难以阅读。使用缩写时,应确保在整个脚本中保持一致。例如,在一个脚本或脚本集中随意切换 Cnt 和 Count 将造成混乱。

    对象命名规则

    下表列出了 VBScript 中可能用到的对象命名约定(推荐):

    代码注释规则

    所有过程的开始部分都应有描述其功能的简要注释。这些注释并不描述细节信息(如何实现功能),这是因为细节有时要频繁更改。这样就可以避免不必要的注释维护工作以及错误的注释。细节信息由代码本身及必要的内部注释来描述。

    当传递给过程的参数的用途不明显,或过程对参数的取值范围有要求时,应加以说明。如果过程改变了函数和变量的返回值(特别是通过参数引用来改变),也应在过程的开始部分描述该返回值。

    过程开始部分的注释应包含以下区段标题。相关样例,请参阅后面的“格式化代码”部分。

  • 每个重要的变量声明都应有内部注释,描述变量的用途。
  • 应清楚地命名变量、控件和过程,仅在说明复杂细节时需要内部注释。
  • 应在脚本的开始部分包含描述该脚本的概述,列举对象、过程、运算法则、对话框和其他系统从属物。有时一段描述运算法则的假码是很有用的。
  • 格式化代码

    应尽可能多地保留屏幕空间,但仍允许用代码格式反映逻辑结构和嵌套。以下为几点提示:

  • 标准嵌套块应缩进 4 个空格。
  • 过程的概述注释应缩进 1 个空格。
  • 概述注释后的最高层语句应缩进 4 个空格,每一层嵌套块再缩进 4 个空格。例如:
  •  '*********************************************************
    ' 目的: 返回指定用户在 UserList 数组中第一次出现的位置。
    ' 输入: strUserList(): 所查找的用户列表。
    ' strTargetUser: 要查找的用户名。
    ' 返回: strTargetUser 在 strUserList 数组中第一次出现时的索引。
    ' 如果目标用户未找到,返回 -1。
    '*********************************************************
    Function intFindUser (strUserList(), strTargetUser)
    Dim i ' 循环计数器。
    Dim blnFound ' 发现目标的标记。
    intFindUser = -1
    i = 0 ' 初始化循环计数器。
    Do While i <= Ubound(strUserList) and Not blnFound
    If strUserList(i) = strTargetUser Then
    blnFound = True ' 标记设为 True。
    intFindUser = i ' 返回值设为循环计数器。
    End If
    i = i + 1 ' 循环计数器加 1。
    End Function
    Web开发人员可以通过创建CSS类及id名称并使用这些名称来对divs以及其他的格式页面元素进行标识。对开发人员来说,在命名重新定义XHTML 标记(tags)的CSS selectors时,必须保证其与预定义的标记准确匹配,但就类以及id选择器名称而言,则仁者见仁,智者见智。然而随心所欲的为这些类以及id命名则 并不是个好的习惯。

      当在设计Web页面以及需要对一个div进行标识的时候,最自然的想法就是使用可以描述元素所在页面位置的词汇来对其命名。
    例如:top-panel
    horizontal-nav
    left-side
    center-column
    right-col

      这些是CSS以及XHTML类和id的有效命名方式。这些词汇简单并且能够使人顾名思义,因此满足了标识页面元素以及相应的CSS样式的需要。

      但问题是这样的名称同页面内容的特定表达方式相关联。这些命名参考了某种特定页面布局中的页面元素位置,因此在这样的布局之外使用就会显得不合适甚至造成理解混乱。这些命名没有涉及文档内容的结构。因此,下面给出了对CSS类以及ID命名更好的方法。

    结构化命名

    这些是CSS以及XHTML类和id的有效命名方式。这些词汇简单并且能够使人顾名思义,因此满足了标识页面元素以及相应的CSS样式的需要。 这些是CSS以及XHTML类和id的有效命名方式。这些词汇简单并且能够使人顾名思义,因此满足了标识页面元素以及相应的CSS样式的需要。

    有标记的相关信息都是用来描述文档的结构而不是外观。这样的特点使得我们可以通过简单的改变CSS的方式来对不同外观格式下的内容(content)以 及标记(markup)进行重用。当你理解这种方式时,很容易就可以发现采用页面位置来为类以及id命名的方式在处理如音频(audio)等外观格式上显 得非常不合适。因此,应当根据在文档中的使用目的而非出现位置来对类以及id进行结构化命名。

      可以按照如下所示的结构化方式来对类以及id名称命名:
    例如:branding
    main-nav
    subnav
    main-content
    sidebar

      这些名字同直观命名方式一样非常易懂,但他们描述了页面元素的作用而非位置。这使得代码更加符合使用纯粹的结构化标记(structural markup)的初衷,即开发人员可以在不改变标记的情况下对各种各样媒体下的显示格式进行处理。

    即使你不打算在其他的媒体上对Web页面进行格式修改,使用结构化命名方式还可以帮助你在日后的站点升级或重新设计中更为轻松。例如,结构化命名避免了 当一个div同id right-column移动到页面左边后所带来的混乱。对div sidebar的采用这样的命名方式就显得更加适当,因为无论它出现在页面的哪一边,这个名字仍然对开发人员来说直观易懂。
    Andy Clarke分析了40份由推崇标准化Web设计理念的开发人员所设计的Web站点的源代码。尽管类以及id名称很不统一,但是还是发现了一些频繁出现的常用名称。这里给出了最常用类/id名称的示例列表:

      例如:header
    content
    sidebar
    footer

    所有数据库设计要写成文档,文档以模块化形式表达。大致格式如下:
    '-------------------------------------------
    '  表名:  tbUser_Info  
    '  建立人:UAM_Richard
    '  日期:  2004-12-17
    '  版本:  1.0
    '  描述:  保存用户资料
    '  具体内容:
    '  UserId  int,自动增量  用户代码
    '  UserName  char(12)  用户名字
    '  ......
    '--------------------------------------------

    sql语句规则

    所有sql关键词全部大写,比如SELECT,UPDATE,FROM,ORDER,BY等。