导航

代码规范

Posted on 2017-03-30 09:18  _eve  阅读(1462)  评论(0编辑  收藏  举报

命名规约

1.    代码中的命名不能以下划线和美元符号开头,也不能以这俩结束。                                                    
2.    代码中的命名不能出现用拼音和单词组合的形式。                                                    
3.    类名使用驼峰式命名规则,但领域模型的相关命名除外。                        例:XmlService.java、UserDO.java                            
4.    代码中的方法名、参数名、成员变量、局部变量都用驼峰形式命名。                            例:localValue/getHttpMessage()/inputUserId                        
5.    常量的命名都用大写,单词间用下划线隔开,力求语义清楚,见名知意,不要怕长。                                例:MAX_STOCK_COUNT                    
6.    抽象类命名使用Abstract或者Base开头。                                                    
    异常类命名使用Exception结尾。                                                    
    测试类命名使用它所测试的类名开头,以Test结尾。                                                    
7.    数组类型的定义:String [] args,而不允许使用String args[]来命名。                                                    
8.    POJO类(bean)中,布尔类型的变量,不要加is,否则部分框架解析会引起序列化错误。                                                    
        例:基本数据类型为布尔型的变量,名称为isSuccess,它的方法也是isSuccess(),RPC框架反向解析时,因为“以为”对应的属性名称为Success,所以会导致获取不到属性,抛出异常。                                                
9.    包名使用小写,点分隔符之间有且仅有一个自然语义的单词,包名使用单数形式,但类名如果有复数含义,类名可以使用复数形式。                                                    例:工具类com.alibaba.open.util,类名是MessageUtils
10.    杜绝不规范的缩写。提高代码的可读性。                例:AbstractClass不可以缩写为AbsClass                                    
11.    如果使用到了设计模式,建议在类名中体现出具体模式。                        例:public class OrderFactory;                            
12.    接口中的类和属性不要加任何修饰符号(public也不要加),保持代码的简洁性,并加上有效的javadoc注释。                                                    
    尽量不要在接口中定义变量,如果一定要定义变量,肯定是与接口方法有关,并且是整个应用的基础常量。                                                    
13.    接口和实现类                                                    
    对于Service和DAO类,基于SOA的理念,暴露出来的一定是接口,内部的实现类用Impl的后缀与接口区别。                                                    
14.    枚举类名建议戴上Enum的后缀。                                                    
    枚举成员的名称全部用大写,单词间用下划线隔开。                    枚举其实就是特殊的常量类,且构造方法被默认强制是私有。                                
15.    各层命名规约                                                    
    Service和DAO层的方法命名规约:                                                    
        获取单个对象的方法用get做前缀。                                                
        获取多个对象的方法用list做前缀。                                                
        获取统计值的方法用count做前缀。                                                
        插入的方法用save或者insert做前缀。                                                
        删除的方法用remove或者delete做前缀。                                                
        修改的方法用update做前缀。                                                
    领域模型的命名规约:                                                    
        数据对象:xxxDO,xxx即为数据库表名。                                                
        数据传输对象:xxxDTO,xxx为业务领域相关的名称。                                                
        展示对象:xxxVO,xxx一般为网页名称。                                                
        POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO。                                                

 

常量定义

1.    不允许出现魔法值(在代码中直接出现的值,而只有在这个值记述的那部分代码中才能明确了解其含义)直接出现在代码中。                        
2.    long或者Long初始赋值时,必须使用大写的L,因为小写的容易和数字1弄混淆,造成误解。                        
3.    不要使用一个常量类维护所有的常量。应该按照常量功能进行归类,分开维护。因为大而长的常量类查找不方便,不利于维护和理解。                        
4.    常量的复用层次:                        
    跨应用共享常量:放置在二方库中,通常是client.jar中的constant目录下。                        
    应用内共享常量:放置在一方库的modules中的constant目录下。                        
        易懂变量也要统一定义成应用内共享常量。                    
        例如两人分别定义了表示“是”的常量                    
        A 􀑝􀋖public static final String YES = "yes";                    
        B 􀑝􀋖public static final String YES = "y";                    
        A.YES.equals(B.YES)的结果,预期是true,但实际返回是false,导致产生问题。                    
    子工程内部共享常量:在当前子工程的constant目录下。                        
    包内共享常量:在当前包下单独的constant目录下。                        
    类内共享常量:直接在类内部private static final定义。                        
5.    如果变量值仅在一个范围内变化用Enum类。如果还带有名称之外的延伸属性,必须使用Enum类。                        
        例如:下面的数字就是延伸信息,表示星期几

 

格式规约

1.    花括号        
        如果大括号内为空,则简洁的写成{}即可,不需要换行;    
        如果是非空代码块,则:    
            左大括号前不换行。
            左大括号后换行。
            右大括号前换行。
            右大括号后还有else等代码则不换行;表示终止右大括号后必须换行。
2.    小括号        
        左括号和后一个字符之间不出现空格,同样,右括号和前一个字符之间也不出现空格。    
3.    if/for/while/switch/do等保留字与左右括号之间都必须加空格。        
4.    任何运算符左右必须加一个空格。        
5.    缩进采用4个空格,禁止使用Tab字符。        
    如果使用Tab,则必须要设置一个Tab为四个空格。        
6.    单行字符数限制不超过120个,超出需要换行。换行需遵循的原则:        
        第二行相对第一行缩进4个空格,从第三行开始,不再继续缩进;    
        运算符与下文一起换行;    
        方法调用的点符号与夏文一起换行;    
        多个参数超长时,逗号后进行换行;    
        不要在括号前换行。    
7.    方法参数定义和传入时,多个参数逗号后边必须加空格。        
8.    不要为了对齐,增加多余的空格。        
    例如:    int a = 3;    
        long b = 4L;    
9.    方法体内的执行语句组,变量的定义语句组,不同的业务逻辑或者不同的语义之间插入一个空行,最好在前面加上合适的注释。        

 

OOP规约

1.    避免通过一个类的对象引用访问此类的静态变量或静态方法,增加编译器解析成本,直接用类名访问即可。        
        直接通过类名.变量名直接访问,而不需要new一个对象得到实例再访问。    
2.    所有的覆写方法必须加@override注解。        
3.    相同参数类型,相同业务含义,才可使用java的可变参数,避免使用Object。        
    可变参数必须放置在参数列表的最后。        
4.    对外暴露的接口签名,原则上不允许修改方法签名,避免对接口调用产生影响,接口过时要加@Deprecated注解,并说明采用的新接口或者新服务是什么。        
5.    不能使用过时的类或方法。        
6.    用equals判断时,将常量或确定有值的放在前面,避免出现空指针异常。        
7.    所有的相同类型的包装类对象之间的值的比较,全部使用equals方法比较。        
8.    关于基本数据类型与包装数据类型的使用标准如下:        
        所有的POJO类属性必须使用包装数据类型。    
        RPC方法的返回值和参数必须使用包装数据类型。    
        所有的局部变量使用基本数据类型。    
            【八种基本数据类型的包装类】
            byte ——Byte
            short ——Short
            int ——Integer
            long-----Long
            float-----Float
            double----Double
            char----Character
            boolean---Boolean
9.    定义DO/DTO/VO等POJO类时,尽量不要设定任何属性默认值。        
        例:POJO类的gmtCreate默认值为new Date(),但是这个属性在数据提取时并没有置入具体值,在更新其他字段时,又附带更新了此字段,导致创建时间被修改为当前时间。    
10.