阿里巴巴开发手册笔记整理

    长久以来,一直有一个愿望,就是自己能够遵循某种规范进行实践,或者说能找一个比较经得起实践的理论来指导。  直到我们老师给我们推荐了阿里巴巴开发手册,大概看了看目录,嗯 ,  是我想要的。于是,这里就趁着休息的时间来进行整理一下,一是为了记录自己的学习历程,二是为了方便复习查找。

一. 命名风格:

      避免英文与 中文拼音的混合使用,且要避免纯拼音命名。

      类名必需遵循驼峰形式。

      常量命名全部大写,单词间用下划线隔开

      抽象类命名以Abstract 或 Base 开头;  异常类命名使用Exception结尾;  测试类命名要以测试的类的名称开始,以Test结尾。

      POJO类中布尔类型的变量,都不要加 is,因为部分框架解析会引起序列化错误。(RPC框架)。

      包名统一使用消息额,点分隔符之间有且仅有一个自然语意的英语单词。  包名统一使用单数形式,类名可以使用复数形式。

      杜绝完全不规范的缩写,避免望文不知意。

      任何自定义编程元素的命名,使用尽量完整的单词组合来表达其意。以期达到代码自解释的目的。

      如模块,接口,类,方法使用了设计模式,在命名时体现出具体模式。

扫描二维码关注公众号,回复: 3314194 查看本文章

      接口中不要加任何修饰符,可以加上有效的javadoc注释。  接口中不要定义变量,可以定义整个应用的基础常量。JDK8 接口允许默认实现,这个默认方法必须是对所有实现类都有价值的默认实现。

      Service和DAO类,基于SOA的理念,暴露出来的服务一定是接口,内部的实现类用Impl的后缀。

      形容能力的接口名称,通常是--able的形式。

     枚举类命建议带上Enum后缀,枚举成员名称需要全大写,单词间用下划线隔开。(枚举类就是特殊的常量类,且构造方法被默认强制是私有)。

     Service/DAO层方法命名规约:

         获取单个对象以 get 做前缀;

         获取多个对象用 list 做前缀;

         获取统计值的方法 用 count 做前缀;

         插入的方法 用 save/insert 做前缀;

          删除的方法用 remove/detete  做前缀.

          修改的方法 用 update 做前缀。

     领域模型命名规约:

           数据对象: xxxDO,xxx 即为 数据表名

           数据传输对象: xxxDTO,  xxx 为 业务领域相关的名称;

           展示对象: xxxVO, xxx 一般为网页名称;

           POJO 是 DO/DTO/BO/VO的统称,禁止命名成 xxxPOJO.

常量定义:

       long 或者Long,赋初始值时,必须使用大写的L.  小写的l 容易与1 混淆。

       常量要按功能进行分类,分开维护。

       常量复用层次有五层,分别是 跨应用共享常量,应用内共享常量,子工程内共享常量,包内共享常量,类内共享常量。

       左小括号和右小括号之间与字符不要有空格。

        if/for/while/sitch/do 等保留字与括号之间要有空格。

        采用四个空格缩进,禁止使用tab字符。

         注释的双斜线与注释内容之间有且仅有一个空格。

         单行字符数限制不超过120个,超出需要换行。  第二行与第一行缩进4个空格,第三行开始不再缩进。 运算符需要与下文一起换行; 括号前不要换行。

          方法定义和传入时,多个参数逗号后边必须加空格。

          相同的业务逻辑之间和语义之间不需要插入空行,反之。

OOP规约:

          避免通过类的对象引用来访问静态变量或者静态方法。

          相同的参数类型,相同的业务含义,才可以使用 Java的可变参数,避免使用Object.

           不能使用过时的类或方法。

           Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象调用equals.

           所有包装类对象之间  值的比较,全部使用equals.

           全部的POJO类属性必须使用包装数据类型。

           RPC方法的返回值和参数必须使用包装数据类型。

           所有的局部变量使用基本数据类型。

           定义DO/DTO/VO 等POJO类时,不要设定任何属性默认值。

           序列化类新增属性时,不要修改serialVersionUID字段。

           构造方法里卖弄禁止加入任何业务逻辑,如有初始化逻辑,可以放在init方法。

           POJO类必须重写toString方法,如果有父类POJO类,需要调用 super.toString.

           当一个类有多个构造方法,或者多个同名方法,按顺序放在一起便于阅读。

           类内方法定义顺序: 共有方法或保护方法,私有方法,getter/setter方法。

           getter/setter方法种不要增加业务逻辑。

           循环体内,字符串的连接方式,使用 StringBuilder 的append方法进行扩展。

           使用final的情况:最终类;不允许修改的域变量;不允许重写的方法;不允许重新赋值的局部变量;避免上下文重复使用的变量。

            慎用Object的clone方法来拷贝对象。

            工具类不允许有public或default构造方法。

集合处理:

           只要重写equals,就必须重写 hashCode.

           并发操作,需要加锁。

并发处理:

        获取单例对象需要保证线程安全,其中的方法也要保证线程安全。

        创建线程以及线程池的时候,名称必须有意义。

         线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。

         高并发时,同步调用需要去考量锁的性能损耗。

异常日志与其它:

        不要在视图模板中加入任何复杂的逻辑。

        任何数据结构的构造或初始化,都应指定大小,避免数据结构无限增长吃光内存。

        对大段代码进行 try-catch,这是不负责任的表现。。对于非稳定代码的 catch 尽可能进行区分 异常类型,再做对应的异常处理。

        最外层的业务使用者,必须处理异常,将其转化为用户可以理解的 内容。

        finally 块必须对资源对象、流对象进行关闭,有异常也要做 try-catch。 

        对于公司外的 http/api 开放接口必须 使用“错误码”;而应用内部推荐异常抛出。

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

        

安全规约:

              隶属于用户个人的页面或者功能必须进行权限控制校验。 

              用户敏感数据禁止直接展示,必须对展示数据进行脱敏。 

              用户请求传入的任何参数必须做有效性验证。 

              表单、AJAX 提交必须执行 CSRF 安全过滤

               发贴、评论、发送即时消息等用户生成内容的场景必须实现防刷、文本内容违禁词过 滤等风控策略。

数据库规约:

            表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint ( 1 表示是,0 表示否)。

            表名,字段名必须使用小写字母或数字:MySQL 在 Windows 下不区分大小写,但在 Linux 下默认是区分大小写。

             表名不使用复数名词。

            小数类型为 decimal,禁止使用 float 和 double。

            varchar 是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长 度大于此值,定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索 引效率。

             表必备三字段:id, gmt_create, gmt_modified。

             表的命名最好是加上“业务名称_表的作用”。

              单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。

              超过三个表禁止 join。需要 join 的字段,数据类型必须绝对一致;多表关联查询时, 保证被关联的字段需要有索引。 

               SQL 性能优化的目标:至少要达到 range 级别,要求是 ref 级别,如果可以是 consts 最好

               

猜你喜欢

转载自blog.csdn.net/qq_36285943/article/details/82596852