Dojo Javascript 编程规范(转)
前言
相当不错的 Javascript 编程风格规范,建议大家采用此规范编写 Javascript。原文链接: http://dojotoolkit.org/developer/StyleGuide 。
翻译(Translated by):i.feelinglucky{at}gmail.com from http://www.gracecode.com ,转载请注明出处、作者和翻译者,谢谢配合。
本文地址: http://code.google.com/p/grace/wiki/DojoStyle 。
序
Any violation to this guide is allowed if it enhances readability.
所有的代码都要变成可供他人容易阅读的。
快读参考
核心 API 请使用下面的风格:
| 结构 | 规则 | 注释 |
| 模块 | 小写 | 不要使用多重语义(Never multiple words) |
| 类 | 骆驼 | |
| 公有方法 | 混合 | 其他的外部调用也可以使用 lower_case(),这样的风格 |
| 公有变量 | 混合 | |
| 常量 | 骆驼 或 大写 |
下面的虽然不是必要的,但建议使用:
| 结构 | 规则 |
| 私有方法 | 混合,例子:_mixedCase |
| 私有变量 | 混合,例子:_mixedCase |
| 方法(method)参数 | 混合,例子:_mixedCase, mixedCase |
| 本地(local)变量 | 混合,例子:_mixedCase, mixedCase |
命名规范
- 变量名称 必须为 小写字母。
- 类的命名使用骆驼命名规则,例如:
Account,EventHandler
- 常量 必须 在对象(类)或者枚举变量的前部声明。枚举变量的命名必须要有实际的意义,并且其成员 必须 使用骆驼命名规则或使用大写:
varNodeTypes={ Element:1, DOCUMENT:2}
- 简写单词 不能使用 大写名称作为变量名:
getInnerHtml(), getXml(),XmlDocument
- 方法的命令 必须 为动词或者是动词短语:
obj.getSomeValue()
- 公有类的命名 必须 使用混合名称(mixedCase)命名。
- CSS 变量的命名 必须 使用其对应的相同的公共类变量。
- 私有类的变量属性成员 必须 使用混合名称(mixedCase)命名,并前面下下划线(_)。例如:
varMyClass=function(){ var _buffer; this.doSomething =function(){ };}
- 变量如果设置为私有,则前面 必须 添加下划线。
this._somePrivateVariable = statement;
- 通用的变量 必须 使用与其名字一致的类型名称:
setTopic(topic)// 变量 topic 为 Topic 类型的变量
- 所有的变量名 必须 使用英文名称。
- 变量如有较广的作用域(large scope),必须使用全局变量;此时可以设计成一个类的成员。相对的如作用域较小或为私有变量则使用简洁的单词命名。
- 如果变量有其隐含的返回值,则避免使用其相似的方法:
getHandler();// 避免使用 getEventHandler()
- 公有变量必须清楚的表达其自身的属性,避免字义含糊不清,例如:
MouseEventHandler,而非MseEvtHdlr。
请再次注意这条规定,这样做得的好处是非常明显的。它能明确的表达表达式所定义的含义。例如:
dojo.events.mouse.Handler// 而非 dojo.events.mouse.MouseEventHandler
- 类/构造函数 可以使用 扩展其基类的名称命名,这样可以正确、迅速的找到其基类的名称:
EventHandlerUIEventHandlerMouseEventHandler
基类可以在明确描述其属性的前提下,缩减其命名:
MouseEventHandleras opposed to MouseUIEventHandler.
特殊命名规范
- 术语 "get/set" 不要和一个字段相连,除非它被定义为私有变量。
- 前面加 "is" 的变量名 应该 为布尔值,同理可以为 "has", "can" 或者 "should"。
- 术语 "compute" 作为变量名应为已经计算完成的变量。
- 术语 "find" 作为变量名应为已经查找完成的变量。
- 术语 "initialize" 或者 "init" 作为变量名应为已经实例化(初始化)完成的类或者其他类型的变量。
- UI (用户界面)控制变量应在名称后加控制类型,例如: leftComboBox, TopScrollPane。
- 复数必须有其公共的名称约定(原文:Plural form MUST be used to name collections)。
- 带有 "num" 或者 "count" 开头的变量名约定为数字(对象)。
- 重复变量建议使用 "i", "j", "k" (依次类推)等名称的变量。
- 补充用语必须使用补充词,例如: get/set, add/remove, create/destroy, start/stop, insert/delete, begin/end, etc.
- 能缩写的名称尽量使用缩写。
- 避免产生歧义的布尔变量名称,例如:
isNotError, isNotFound 为非法
- 错误类建议在变量名称后加上 "Exception" 或者 "Error"。
- 方法如果返回一个类,则应该在名称上说明返回什么;如果是一个过程,则应该说明做了什么。
文件
- 缩进请使用 4 个空白符的制表位。
- 如果您的编辑器支持 文件标签_(file tags),请加添如下的一行使我们的代码更容易阅读:
// vim:ts=4:noet:tw=0:
译注:老外用 VIM 编辑器比较多,此条可以选择遵循。
- 代码折叠必须看起来是完成并且是合乎逻辑的:
var someExpression =Expression1 +Expression2 +Expression3;
var o = someObject.get( Expression1, Expression2, Expression3);
注:表达式的缩进与变量声明应为一致的。
注:函数的参数应采用明确的缩进,缩进规则与其他块保持一致。
变量
- 变量必须在声明初始化以后才能使用,即便是 NULL 类型。
- 变量不能产生歧义。
- 相关的变量集应该放在同一代码块中,非相关的变量集不应该放在同一代码块中。
- 变量应该尽量保持最小的生存周期。
- 循环/重复变量的规范:
- 只有循环控制块的话,则必须使用 FOR 循环。
- 循环变量应该在循环开始前就被初始化;如使用 FOR 循环,则使用 FOR 语句初始化循环变量。
- "do ... while" 语句是被允许的。
- "break" 和 "continue" 语句仍然允许使用(但请注意)。
- 条件表达式
- 应该尽量避免复杂的条件表达式,如有必要可以使用临时布尔变量。
- The nominal case SHOULD be put in the "if" part and the exception in the "else" part of an "if" statement.
- 应避免在条件表达式中加入块。
- 杂项
- 尽量避免幻数(Magic numbers),他们应该使用常量来代替。
- 浮点变量必须指明小数点后一位(即使是 0)。
- 浮点变量必须指明实部,即使它们为零(使用 0. 开头)。
布局
块
- 普通代码段 应该 看起来如下:
while(!isDone){ doSomething(); isDone = moreToDo();}
- IF 语句 应该 看起来像这样:
if(someCondition){ statements;}elseif(someOtherCondition){ statements;}else{ statements;}
- FOR 语句 应该 看起来像这样:
for(initialization; condition; update){ statements;}
- WHILE 语句 应该 看起来像这样:
while(!isDone){ doSomething(); isDone = moreToDo();}
- DO ... WHILE 语句 应该 看起来像这样:
do{ statements;}while(condition);
- SWITCH 语句 应该 看起来像这样:
switch(condition){case ABC: statements; // fallthroughcase DEF: statements; break;default: statements; break;}
- TRY ... CATCH 语句 应该 看起来像这样:
try{ statements;}catch(ex){ statements;}finally{ statements;}
- 单行的 IF - ELSE,WHILE 或者 FOR 语句也 必须 加入括号,不过他们可以这样写:
if(condition){ statement;}while(condition){ statement;}for(intialization; condition; update){ statement;}
空白
- 操作符 建议 使用空格隔开(包括三元操作符)。
- 下面的关键字 避免使用 空白隔开:
- break
- catch
- continue
- do
- else
- finally
- for
- function (如果为匿名函数,例如:var foo = function(){}; )
- if
- return
- switch
- this
- try
- void
- while
- with
- 下面的关键字必须使用空白隔开:
- case
- default
- delete
- function (如果为申明,例如:function foo(){}; )
- in
- instanceof
- new
- throw
- typeof
- var
- 逗号(,) 建议 使用空白隔开。
- 冒号(:) 建议 使用空白隔开。
- 点(.) 在后部 建议 使用空白隔开。
- 点(.) 避免 在前部使用空白。
- 函数调用和方法 避免 使用空白,例如: doSomething(someParameter); // 而非 doSomething (someParameter)
- 逻辑块 之间使用空行。
- 声明 建议 对齐使其更容易阅读。
注释
- 生涩的代码就 没有必要 添加注释了,首先您需要 重写 它们。
- 所有的注释请使用英文。
- 从已解决的方案到未开发的功能,注释 必须 与代码相关。
- 大量的变量申明后 必须 跟随一段注释。
- 注释需要说明的是代码段的用处,尤其是接下来的代码段。
- 注释 没有必要 每行都添加。
文档
下面提供了一些基本的函数或者对象的描述方法:
- 总结(summary): 简短的表述此函数或者对象实现的目的
- 描述(description): 对于此函数或者类的简短的描述
- 返回(return): 描述此函数返回什么(并不包括返回类型)
基本函数信息
function(){ // summary: Soon we will have enough treasure to rule all of New Jersey. // description: Or we could just get a new roomate. // Look, you go find him. He don't yell at you. // All I ever try to do is make him smile and sing around // him and dance around him and he just lays into me. // He told me to get in the freezer 'cause there was a carnival in there. // returns: Look, a Bananarama tape!}
对象函数信息
没有返回值描述
{ // summary: Dingle, engage the rainbow machine! // description: // Tell you what, I wish I was--oh my g--that beam, // coming up like that, the speed, you might wanna adjust that. // It really did a number on my back, there. I mean, and I don't // wanna say whiplash, just yet, cause that's a little too far, // but, you're insured, right?}
函数的声明
在有的情况下,对于函数的调用和声明是隐义(invisible)的。在这种情况下,我们没有办法在函数中加入说明等(供程序调用)。如果您遭遇了这种情况,您可以使用一个类来封装函数。
注:此此方法只能在函数没有初始化的参数情况下。如过不是,则它们会被忽略。
dojo.declare( "foo", null, { // summary: Phew, this sure is relaxing, Frylock. // description: // Thousands of years ago, before the dawn of // man as we knew him, there was Sir Santa of Claus: an // ape-like creature making crude and pointless toys out // of dino-bones, hurling them at chimp-like creatures with // crinkled hands regardless of how they behaved the // previous year. // returns: Unless Carl pays tribute to the Elfin Elders in space. });
参数
- 简单类型
简单的类型的参数可以直接在函数参数定义中注释说明。
function(/*String*/ foo,/*int*/ bar)...
- 可变类型参数
下面是几个修饰符供参考:
- ? 可选参数
- ... 说面参数范围不确定
- 数组
function(/*String?*/ foo,/*int...*/ bar,/*String[]*/ baz)...
- 全局参数描述
如果你想增加一个描述,你可以将它们移至初始化块。
基本信息格式为: *关键字* 描述字段 ( *key* Descriptive sentence)
参数和变量的格式为: *关键字* ~*类型*~ 描述字段 ( *key* ~*type*~ Descriptive sentence)
注: *关键字* 和 ~*类型*~ 可以使用任何字母和数字表述。
function(foo, bar){ // foo: String // used for being the first parameter // bar: int // used for being the second parameter}
变量
由于实例变量、原型变量和外部变量的声明是一致的,所以有很多的方法声明、修改变量。具体的如何定义和定位应在变量最先出现的位置指明变量的名称、类型、作用域等信息。
function foo(){ // myString: String // times: int // How many times to print myString // separator: String // What to print out in between myString* this.myString ="placeholder text"; this.times =5;}
foo.prototype.setString =function(myString){ this.myString = myString;}
foo.prototype.toString =function(){ for(int i =0; i <this.times; i++){ dojo.debug(this.myString); dojo.debug(foo.separator); }} foo.separator ="=====";
对象中的变量注释
应使用和对象值和方法一致的标注方式,比如在他们声明的时候:
{ // key: String // A simple value key:"value", // key2: String // Another simple value}
返回值
因为函数可以同时返回多个不同(类型)的值,所以应每个返回值之后加入返回类型的注释。注释在行内注释即可,如果所有的返回值为同一类型,则指明返回的类型;如为多个不同的返回值,则标注返回类型为"mixed"。
function(){ if(arguments.length){ return"You passed argument(s)";// String }else{ returnfalse;// Boolean }}
伪代码(有待讨论)
有时候您需要在函数或者类中添加对于此函数和类的功能性流程描述。如果您打算这样做,您可以使用 /*======== (= 字符最好出现 5 次或者更多),这样做的好处就是可以不用将这些东西加入代码(译注:原作者的意思可能为代码管理系统)。
这样看起来在 /*===== 和 =====*/ 会有非常长的一段注释,等待功能调整完毕以后就可以考虑是否删除。
/*===== module.pseudo.kwArgs = { // url: String // The location of the file url: "", // mimeType: String // text/html, text/xml, etc mimeType: "" } =====*/
function(/*module.pseudo.kwArgs*/ kwArgs){ dojo.debug(kwArgs.url); dojo.debug(kwArgs.mimeType);}
Dojo Javascript 编程规范(转)的更多相关文章
- JavaScript编程规范
最近看NodeJS中,有一部分写JS约定俗成的编程规范(附录B,详情参考附件),感觉在实际工作中能用到, 大致意思分享给大家,详情参考附件: 1.缩进:建议两空格 作为Node.js代码的缩进标记: ...
- 【JavaScript 开发规范】
Javascript 最佳实践http://sofish.de/1171http://sofish.de/1181 总是使用 ‘var’ √ 特性检测而非浏览器检测 √ 使用方括号记法 √ 使用&qu ...
- javascript模块化编程规范
一.javascript模块化编程规范: 二.关于commenjs规范和AMD规范: 根本不同:前者用于服务器端同步加载模块:后者是客户端异步加载模块. 同点:两者都有一个全局函数require(), ...
- Javascript模块化编程-规范[2]
实现Javascript模块化,固然很重要,但是怎样才能实现国际上都能认可的模块化呢?模块化编程规范随应运而生. 目前Javascript模块化规范主要有两种:CommonJS和AMD. Common ...
- 《编写可维护的JavaScript》——JavaScript编码规范(六)
变量.函数和运算符 在讨论过基本的JavaScript书写格式化之后,接下来关注如何使用函数.变量和运算符来减少复杂度和增强可读性就显得十分重要了. 变量声明 变量声明是通过var语句来完成的.var ...
- 《编写可维护的JavaScript》——JavaScript编码规范(五)
语句和表达式 在JavaScript中,诸如if和for之类的语句有两种写法,使用花括号的多行代码或者不使用花括号的单行代码.比如: //不好的写法,尽管这是合法的JavaScript代码 if (c ...
- 《编写可维护的JavaScript》——JavaScript编码规范(一)
缩进层级 代码如何缩进通常有两种主张: 使用制表符缩进 每一个缩进层级都用单独的制表符表示.这种方法的主要缺点是:系统对制表符的解释不一致.这些差异会导致不同的开发者对同一段代码有不同的看法的,这正是 ...
- 异步编程之Javascript Promises 规范介绍
什么是 Promises Promises是一种关于异步编程的规范,目的是将异步处理对象和处理规则进行规范化,为异步编程提供统一接口. 传统的回调函数 说到JavaScript的异步编程处理,通常我们 ...
- Javascript编程风格
Douglas Crockford是Javascript权威,Json格式就是他的发明. 去年11月他有一个演讲(Youtube),谈到了好的Javascript编程风格是什么.我非常推荐这个演讲,它 ...
随机推荐
- 记一次内存溢出的分析经历——使用thrift
背景: 有一个项目做一个系统,分客户端和服务端,客户端用c++写的,用来收集信息然后传给服务端(客户端的数量还是比较多的,正常的有几千个), 服务端用Java写的(带管理页面),属于RPC模式,中间的 ...
- UFLDL新版教程
http://ufldl.stanford.edu/tutorial/ 还带编程作业.
- git之commit改用第三方编辑器
git commit -m "***"方式提交注释,有限制,可通过调用第三方编辑器来编辑更好的注释 1 使用window自带的记事本 git config --global cor ...
- loj 6485 LJJ学二项式定理 —— 单位根反演
题目:https://loj.ac/problem/6485 先把 \( a_{i mod 4} \) 处理掉,其实就是 \( \sum\limits_{i=0}^{3} a_{i} \sum\lim ...
- python-snappy的安装小记
在弄个dota2的replay parser玩玩,在github上找到了几个,都是基于V社的demoinfo2(https://developer.valvesoftware.com/wiki/Dot ...
- [置顶]
自己写一个简单通用的Makefile
转自:http://blog.csdn.net/u011913612/article/details/52102241 一.makefile的作用 Makefile是用于自动编译和链接的,一个工程有很 ...
- sql server实用要点全解
本文介绍sql server的相关的查询语句和标准T-sql语法 写在前面 sqlsever使用注意点 可以运行 services.msc 打开服务窗口 自增列默认无法手动设置,使用 set iden ...
- LNMP 1.5 php-fpm配置文件
php-fpm配置文件: /usr/local/php/etc/php-fpm.conf :php-fpm服务的配置文件 /usr/local/php/etc/php.ini :ph ...
- DAY7-面向对象之继承与派生
一.初识继承 什么是继承 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称为基类或超类,新建的类称为派生类或子类. 子类会“”遗传”父类的属性,从而解决代 ...
- C#windows窗体应用程序如何自适应大小
用C#的windows窗体应用程序做界面十分轻松,但是系统默认是没有让控件跟随窗体的大小改变而已改变的.所以需要我们手动去设置让窗体控件随着窗体的大小改变而改变.所以我们只需要将控件选择 然后把Anc ...