*编码规范
-
格式:全小写,单词之间用下划线连接
数据、模型相关的属性
涉及url中有关的所有地方
// bad {memberInfo:String}; // good {member_info:String};
-
格式:首字母大写,驼峰法
类名
必须使用new前缀的构造函数应该以大写字母开始
// bad var className={ findById:function(){ } } // good var ClassName={ findById:function(){ } }
-
格式:首字母小写,驼峰法
函数名
变量名
// bad var user_face; var find_byid:function(){ } // good var userFace; var findById:function(){ }
-
格式:首字母$
前端中的jquery/zepto选取的dom对象
// bad var member=jQuery('#member'); // good var $member=jQuery('#member');
-
格式:全小写,单词之间用减号"-"连接
css中的类名
// bad iconName // good icon-name
- 一律用tab缩进,一个tab 等于4个空格的宽度
-
先把不可能的因素优先全部排除掉,在往下执行
// bad function(int x) { if (x) { // ... } } // good function(int x) { if (!x) return; // ... }
-
数组循环使用原生的forEach,并且在循环前要原型判断是否是数组
if (!Acan.isArr(arr)) return; arr.forEach(function(v,k){ // ... });
-
对象循环使用for in 或者_.each(),并且在循环前要原型判断是否是对象
if (!Acan.isObj(obj)) return; for(var i in obj){ // ... }; _.each(obj,function(v,k)) // ... });
-
对于不确定的多级对象直接取值要用Acan.objGet (可以防止程序崩溃)
Acan.objGet(a,'b.0.c') 等于 a.b[0].c Acan.objGet(a,'b.0.c','') 第三个参数为默认值,当值取不到的时候返回设置的默认值
-
支持多种写法,回调统一取法 a.__cb();
function test () { var a=Acan.argObj(arguments,['url','filepath','name','maxWidth']); console.log(a);//{"maxWidth":{"a":"4"},"name":["3"],"filepath":2,"url":"1","__cb":function(){var ttt=123;}} //取参数值 a.url='1'; a.name=["3"]; } test('1',2,['3'],{a:'4'},function(){ var ttt=123; }); test('1',2,['3'],function(){ var ttt=123; }); test('1',2,function(){ var ttt=123; }); //支持多种写法,回调统一取法 a.__cb();
- {}和[]
- 使用{}替代new Object()。使用[]替代new Array()。
- 当成员名字为连续的整数时使用数组。当成员名字为任意的字符串或名字时使用对象。
-
前端
var rs={};//当前页的数据汇总 //定义总回调 var ccb=Acan.ccb(3,function(){ //在总回调中进行模版的渲染 var html=swig.render(Atpl.tplName,{locals:rs}); $('#appendDiv').append(html); // ... }); //缓存的方式取配置选项 Afn.apic('config/opt',{key : 'homestayInterests'},function(opt){ rs.homestayInterests=opt; ccb.cb(); },3600); //缓存的方式取模版文件 Afn.tpl('tplName','public/send.html',function(){ ccb.cb(); }); //从API获取数据 Acan.geolocation(function(lat, lng){ Afn.api('pic/list',{latlng:lat+','+lng},function(json){ if(Acan.isArr(Acan.objGet(json,'data'))) rs.data=json.data; ccb.cb(); }); });
-
nodejs:
var rs={};//当前页的数据汇总 //定义总回调 var ccb=Acan.ccb(3,function(){ // ... }); Acache.get('test',function(err,obj){ if(!err){ rs.test=obj; } ccb.cb(); }); Adb.model1.findById(_id,function(err,doc){ if(!err){ rs.model1=doc.doc_api(); } ccb.cb(); }) Adb.model2.find(function(err,docs){ if(err){ ccb.cb(); return; } if(!Acan.isArr(docs)){ ccb.cb(); return; } rs.data=Afn.docs_api(req,docs); rs.data.forEach(function(v,k){ var model=modelArr[v.tp]; if(!v.rid){ return; } ccb.at(); Adb.pic.get(req,{rid:v.rid},function(err,pics){ v.pics=pics; ccb.cb(); } if(!v.uid){ return; } ccb.at(); v.uid.populate({select: 'nickname'},function(err,docUid){ ccb.cb(); }); }); ccb.cb(); });