Skip to content

abans/guide

Repository files navigation

Style Guide

*编码规范

Table of Contents

  1. 命名规范
  2. 缩进
  3. Return Early
  4. 循环
  5. 多级对象取值
  6. 函数参数的灵活定义
  7. 额外的建议
  8. 嵌套回调并发处理

命名规范

  • 格式:全小写,单词之间用下划线连接

    • 数据、模型相关的属性
    • 涉及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

⬆ back to top

缩进

  • 一律用tab缩进,一个tab 等于4个空格的宽度

Return Early

  • 先把不可能的因素优先全部排除掉,在往下执行

    // bad
    function(int x) {
    	if (x) {
    		// ...
    	}
    }
    
    // good
    function(int x) {
    	if (!x)
    		return;
    	// ...
    }

⬆ back to top

循环

  • 数组循环使用原生的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))
    	// ...
    });

⬆ back to top

多级对象取值

  • 对于不确定的多级对象直接取值要用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();

⬆ back to top

额外的建议

  • {}和[]
    • 使用{}替代new Object()。使用[]替代new Array()。
    • 当成员名字为连续的整数时使用数组。当成员名字为任意的字符串或名字时使用对象。

⬆ back to top

嵌套回调并发处理

  • 前端

    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();
    });

⬆ back to top

About

编码规范

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published