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


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

    一、分析源代码目录结构

    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结尾

    三、代码格式

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

    四、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. 泛型通配符<? extends T >来接收返回的数据,此写法的泛型集合不能使用 add 方法,而 <? super T> 不能使用 get 方法,做为接口调用赋值时易出错。第一、频繁往外读取内容的,适合用<? extends T >。第二、经常往里插入的,适合用 <? super T> 。
      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 。
        正例:
        <logger name="com.taobao.dubbo.config" additivity="false">

     

     

     

     

  • 相关阅读:
    零散的小知识0
    windows 安装touch指令
    sba
    jQuery中mouseenter vs mouseover 以及 mouseleave vs mouseout
    SSAS: Pareto Analysis
    SSAS: Display measures in Rows
    SSAS: Using DMV Queries to get Cube Metadata
    Do not execute sub-report when it's hidden in SSRS
    Read data from Excel XML file
    Concatenating Row Values in Transact-SQL
  • 原文地址:https://www.cnblogs.com/xqqu/p/11630423.html
Copyright © 2020-2023  润新知