zoukankan      html  css  js  c++  java
  • 阿里巴巴Java开发手册(格式规约篇)——查自己的漏-补自己的缺

    一、编程规约

    (三) 格式规约

    1. 【强制】大括号的使用约定。如果是大括号内为空,则简洁地写成{}即可,不需要换行;如果是非空代码块则:

    1) 左大括号前不换行。行。 2) 左大括号后换行。 3) 右大括号前换行。 4) 右大括号后还有else等代码则不换行;表示终止右大括号后必须换行。

    2. 【强制】 左括号和后一个字符之间不出现空格;同样,右括号和前一个字符之间也不出现空格。详见第5条下方正例提示。

    3. 【强制】if/for/while/switch/do等保留字与左右括号之间都必须加空格。

    4. 【强制】任何运算符左右必须加一个空格。 说明:运算符包括赋值运算符=、逻辑运算符&&、加减乘除符号、三目运行符等。

    5. 【强制】代码块缩进4个空格,如果使用tab缩进,请设置成1个tab为4个空格。 正例: (涉及1-5点

    public static void main(String args[]) {
        String say = "hello"; 
        // 运算符的左右必须有一个空格 
        int flag = 0; 
        // 关键词if与括号之间必须有一个空格,括号内f与左括号,1与右括号不需要空格 
        if (flag == 0) { 
            System.out.println(say); 
        } 
    
        // 左大括号前加空格且不换行;左大括号后换行 
        if (flag == 1) { 
            System.out.println("world"); 
        // 右大括号前换行,右大括号后有else,不用换行 
        } else { 
            System.out.println("ok"); 
        // 右大括号做为结束,必须换行 
        } 
    }

     (八)注释规约

    1.【强制】类、类属性、类方法的注释必须使用Javadoc规范。使用/** 内容 */格式,不得使用// xxx方式。

      说明:再IDE编辑窗口中,Javadoc方式会提示相关注释,生成Javadoc可以正确输入出相应注释;再IDE中,工程调用方法时,不进入方法即可悬浮提示方法、参数、返回值的意义,提高阅读效率。

    2.【强制】所有的抽象方法(包括接口中的方法)必须用Javadoc注释、除了返回值、参数、异常说明外,还必须指出该方法做什么事情,实现什么功能。

      说明:对子类的实现要求,或者调用注意事项,请一并说明。

    5.【强制】所有的枚举类型字段必须要有注释,说明每个数据项的用途。

     二、异常日志

    (一)异常处理

    4.【强制】捕获异常时为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请将该异常抛给它的调用者。最外层的业务使用者必须处理异常,将其转化为用户可以理解的内容。

    7.【强制】不要在finally块中使用return。

      说明:finally块中的return返回后方法结束执行,不会再执行try块中的return语句。

    11.【推荐】定义时区分unchecked/checked异常,避免直接抛出new RuntimeException(),更不允许抛出Exception或者Throwable,应使用有业务含义的自定义异常。推荐业界已定义过的自定义异常,如:DAOException/ServiceException等。

    12.【参考】对于公司外的http/api开放接口必须使用”错误码“;而应用内部推荐异常抛出;跨应用间RPC调用优先考虑使用Result方式,封装isSuccess()方法、”错误码“、”错误简短信息“。

      说明:关于RPC方法返回方式使用Result方式的理由:

      1)使用抛异常返回方式,调用方如果没有捕获到就会产生运行时错误。

      2)如果不加栈信息,只是new 自定义异常,加入自己的理解error message,对于调用端解决问题的帮助不会太多。如果加了栈信息,在频繁调用出错的情况下,数据序列化和传输的性能损耗也是问题。

    (二)日志规约

    1.【强制】应用中不可直接使用日志系统(Log4j、Logback)中的API,而应依赖使用日志框架SLF4J中的API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。

      

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    private static final Logger logger = LoggerFactory.getLogger(Abc.class);
    

     3.【强制】应用中的扩展日志(如打点、临时监控、访问日志等)命名方式:

      appName_logType_logName.log。

      logType:日志类型,如stats/monitor/access等;logName:日志描述。这种命名的好处;通过文件名就可以知道日志文件属于什么应用,什么类型,什么目的,也有利于归类查找。

      正例:mppserver应用中单独监控时区转化异常,如:

      mppserver_monitor_timeZoneConvert.log

      说明:推荐对日志进行分类,如将错误日志和业务日志分开存放,便于开发人员查看,也便于通过日志对系统进行及时监控。

     4.【强制】对trace/deug/info级别的日志输出,必须使用条件输出形式或者使用占位符的方式。

      说明:

    logger.debug("Processing trade with id: " + id + " and symbol: " + symbol);
    

      如果日志级别时warn,上述日志不会打印,但是会执行字符串拼接操作,如果symbol是对象,会执行toString()方法,浪费了系统资源,执行了上述操作,最终日志却没有打印。

      正例:(条件)建议采用如下方式

      

    if(logger.isDebugEnabled()){
      logger.debug("Processing trade with id: " +  id + ” and symbol: “ + symbol);      
    }
    

      正例:(占位符)

      logger.debug("Processing trade with id: {} and symbol : {} ", id ,symbol );

     6.【强制】异常信息应包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么通过关键字throws往上抛出。

      正例:logger.error (各类参数或者对象toString() + "_" + e.getMessage(),e);

    五、MySQL数据库

    (三)SQL语句

      1.【强制】不要使用count(列名)或count(常量)来替代count(*),count(*)是SQL92定义的标准统计行数的语法,跟数据库无关,跟NULL和非NULL无关。

      说明:count(*)会统计值为NULL的行,而count(列名)不会统计此列为NULL值的行。

      2.【强制】当某一列的值全是NULL时,count(col)的返回结果为0,但sum(col)的返回结果为NULL,因此使用sum()时需注意NPE问题。

      正例:SELECT IF( ISNULL( SUM(g) ), 0 ,SUM(g)) FROM table;

      

  • 相关阅读:
    物理学——总结
    创建场景和赛道——挑战:为赛道建立一个新的单元测试
    物理学——牛顿运动定律
    物理学——挑战:实现道路碰撞检测
    1291. Gearwheels 夜
    hdu 4442 Physical Examination 夜
    hdu 4450 Draw Something 夜
    1129. Door Painting 夜
    hdu 4431 Mahjong 夜
    1128. Partition into Groups 夜
  • 原文地址:https://www.cnblogs.com/gzhcsu/p/7611495.html
Copyright © 2011-2022 走看看