分析一套源代码的代码规范和风格并讨论如何改进优化代码

基于工程实践项目,我在Github上找了一个10K星的项目,前后端分离的人力资源管理系统,项目采用SpringBoot+Vue开发。

一、分析源代码目录结构

分析一套源代码的代码规范和风格并讨论如何改进优化代码_第1张图片

1.mvn文件夹–存放maven-wrapper.properties和相关jar包

2.src存放项目中的源代码

3.vuehr文件中存放前端相关的配置文件

4.README是项目的说明文件

二、命名规范

  1. 类命 驼峰式 MarcoPolo
  2. 方法名 localValue
  3. 常量 大写单词, 单词间_分割,语义清楚 MAX _ STOCK _ COUNT
  4. 抽象类 以Abstract /Base开始,异常类用 Exception结束,测试用Test结尾
  5. boolean类型,变量不要用is开头
  6. 包名统一英文单词单数形式,不使用缩写
  7. 接口中不加修饰,public 不要加
  8. 形容能力的接口使用-able结尾

分析一套源代码的代码规范和风格并讨论如何改进优化代码_第2张图片

三、代码格式

  1. 左小括号/右和字符之间不出现空格,if / for / while / switch / do 等保留字与括号之间都必须加空格
  2. 二目、三目运算符的左右两边都需要加一个空格
  3. 第二行相对第一行缩进 4 个空格,其他不缩进
  4. 传参要多个空格隔开
  5. 不同的业务逻辑之间或者不同的语义之间插入一个空行。相同业务逻辑和语义之间不需要插入空行

分析一套源代码的代码规范和风格并讨论如何改进优化代码_第3张图片

四、OOP规约

    1. 访问类中静态方法,不用对象引用类,直接用类名来进行访问。

    2. 过时接口,@ Deprecated 注解

    3. 不能使用过时的类或方法

    4. 常量或确定有值的对象来调用equals," test " .equals(object);

    5. 包装类对象之间值的比较,全部使用 equals 方法比较
      对于 Integer var = ?
      在-128 至 127 范围内的赋值, Integer 对象是在IntegerCache . cache 产生,会复用已有对象,这个区间内的 Integer 值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,
      推荐使用 equals 方法进行判断。

    6. POJO 类属性必须使用包装数据类型,RPC 方法的返回值和参数必须使用包装数据类型

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

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

    9. POJO 类必须写 toString 方法。

    10. 字符串的连接方式,使用 StringBuilder 的 append 方法进行扩展。

五、集合处理

    1. 只要重写 equals ,就必须重写 hashCode 。如果自定义对象做为 Map 的键,那么必须重写 hashCode 和 equals。
    2. ArrayList 的 subList 结果不可强转成 ArrayList ,否则会抛出 ClassCastException异常,即 java . util . RandomAccessSubList cannot be cast to java . util . ArrayList .
    3. Arrays . asList() 把数组转换成集合时,不能使用其修改集合相关的方法,它的 add / remove / clear 方法会抛出 UnsupportedOperationException 异常。asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。
    4. 泛型通配符来接收返回的数据,此写法的泛型集合不能使用 add 方法,而 不能使用 get 方法,做为接口调用赋值时易出错。第一、频繁往外读取内容的,适合用。第二、经常往里插入的,适合用
    5. 不要在 foreach 循环里进行元素的 remove / add 操作。 remove 元素请使用 Iterator方式,如果并发操作,需要对 Iterator 对象加锁。
    6. 集合初始化时,指定集合初始值大小。说明: HashMap 使用 HashMap(int initialCapacity) 初始化,
      正例:initialCapacity = (需要存储的元素个数 / 负载因子) + 1。注意负载因子(即 loaderfactor)默认为 0.75, 如果暂时无法确定初始值大小,请设置为 16(即默认值)。
    7. 使用 entrySet 遍历 Map 类集合 KV ,而不是 keySet 方式进行遍历。而 entrySet 只是遍历了一次就把 key 和 value 都放到了 entry 中,效率更高。

六、控制语句

  1. 表达异常的分支时,少用 if-else 方式 ,这种方式可以改写成
  1. 方法的返回值可以为 null ,不强制返回空集合,或者空对象等,必须添加注释充分
    说明什么情况下会返回 null 值。调用方需要进行 null 判断防止 NPE 问题。

  2. 定义时区分 unchecked / checked 异常,避免直接抛出 new RuntimeException() ,
    更不允许抛出 Exception 或者 Throwable ,应使用有业务含义的自定义异常。

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

    1. 避免重复打印日志,浪费磁盘空间,务必在 log 4 j . xml 中设置 additivity = false 。
      正例:

 

 

 

 

你可能感兴趣的:(分析一套源代码的代码规范和风格并讨论如何改进优化代码)