开发规范
- 命名规范
- 注释规范
- 方法定义以及,exports规范
- 测试规范(待完善)
- GIT管理规范
命名规范
>1. 变量命名,首字母小写,其余首字母大写方式,如:userAddress, articleTitle 等等
>2. 方法命名,同变量命名,如:sayHello(), printLog() 等等
>3. 类命名, 所有单词首字符大写,如 User, UserPermission
>4. 常量命名, 所有单词大写,以下化线分割, 如 APP_ID, APP_SECRET等等
>5. 适用以上所有,命名应该尽量通俗易懂,如 getUserByUsername,getUserById 要好于getUserByCondition(),更多详情可以参考 [《代码整洁之道》](http://item.jd.com/10064006.html)
注释规范
>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,缩写单词需要注释,但是应该尽量避免使用缩写单词
//用户具有的money
var 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');
//测试UserProxy
describe('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);
})
})
})
})