开发规范
命名规范
>1. 变量命名,首字母小写,其余首字母大写方式,如:userAddress, articleTitle 等等>2. 方法命名,同变量命名,如:sayHello(), printLog() 等等>3. 类命名, 所有单词首字符大写,如 User, UserPermission>4. 常量命名, 所有单词大写,以下化线分割, 如 APP_ID, APP_SECRET等等>5. 适用以上所有,命名应该尽量通俗易懂,如 getUserByUsername,getUserById 要好于getUserByCondition(),更多详情可以参考 [《代码整洁之道》](http://item.jd.com/10064006.html)
<A NAME="comment"></A>注释规范
>1. 方法注释,如根据用户名密码验证用户:
/** * 验证用户合法性(方法作用) * *@param {String} username 用户名 (参数注释) *@param {String} password 密码(参数注释) *@param {function} callback * - err * - User **/var authenticate = function(username, password, callback){ User.findOne({username:username,password:password}, callback);}
>2. 类注释
/** * 分页控件类 * *@param {Number} page 当前页 *@param {Number} perPage 每页记录数 *@param {Number} total 总页数 *@param {Array} items 记录条目(如查询第一页图书,items为第一页图书所有记录) **/function Paginate(page, perPage, total, items){ this.page = page; this.perPage = perPage; this.total = total; this.items = items;}
>3. 普通变量注释,一般通俗易懂变量无需注释,如username, password,或者通俗英语单词travelRoute,缩写单词需要注释,但是应该尽量避免使用缩写单词
//用户具有的moneyvar userOwnMoney = 1000;
>4. 类变量注释:
/** * 分页控件类 * *@param {Number} page 当前页 *@param {Number} perPage 每页记录数 *@param {Number} total 总页数 *@param {Array} items 记录条目(如查询第一页图书,items为第一页图书所有记录) **/function Paginate(page, perPage, total, items){ this.page = page; //下一页 this.nextPage = this.page + 1;}
方法定义以及,exports规范
>1. proxy, controller, middleware 中的方法采用var定义, 所有exports放在文件最后,方便代码复用,如验证用户是否登录中间件,以及验证是否登录并且用户账号类型是销售的中间件定义[代码地址](http://gitlab.tulingdao.com/top/tree/development/modules/auth/routes/middleware/index.js):
/** * 验证是否登陆 * * @param req * @param res * @param next */var requireLogin = function(req, res, next){ var user = req.session.user; if(!user){ if(req.xhr){ res.jsonp({errcode:-99, errmsg:'您还没有登录或者已经超时'}); }else{ req.session.error = '您还没有登录或者已经超时'; res.redirect('/auth/login?next='+req.originalUrl); } }else{ next(); }}/** * 验证是否登陆并且账号类型是旅行社 * * @param req * @param res * @param next */var requireLoginAndTravelOrgAccount = function(req, res, next){ var user = req.session.user; requireLogin(req, res, function(){ //此处复用了requireLogin中间件 if(User.isAccess(User.TRAVEL_ORG_ACCOUNT_TYPE, user.accountType)){ next(); }else{ req.session.error = '您不具备旅行社账号权限'; req.redirect('/'); } })}
测试规范(待完善)
>1. 所有方法需要书写单元测试>2. 测试使用mocha框架,详情见[http://visionmedia.github.io/mocha/#installation]>3. 测试路径与源代码采用相同路径,如 源代码下 controllers/user ,测试代码下是 test/controllers/user, 具体如下:
top -modules - auth - controllers - models - proxy - 其他模块 - test - auth - controllers - models - ... - test.js在test.js中require所有测试文件
>4. 测试举例如下:
/** * Created by hp-wanglihui on 2014/6/2. */'use strict';var User = require('../../models').User;var UserProxy = require('../../proxy').UserProxy;var assert = require('assert');//测试UserProxydescribe('UserProxy', function(){ //测试newAndSave方法 describe('#newAndSave',function(){ it('it should add success and callback(null, User instance)', function(){ var username = Date.now()+''; var email = username+'@test.com'; var password = '123456'; var user = new User({email:email, username:username, password:password}); UserProxy.newAndSave(user, function(err, user){ assert.equel(null, err); assert.equal(true, user instanceof User); }) }) })})