JAVA代码规范审查

JAVA代码规范审查

1. 添加必要的注释

  • 所有的类都必须添加创建者和创建日期,以及简单的注释描述

  • 方法内部的复杂业务逻辑或者算法,需要添加清楚的注释

  • 一般情况下,注释描述类、方法、变量的作用

  • 任何需要提醒的警告或TODO,也要注释清楚

  • 如果是注释一行代码的,就用//;如果注释代码块或者接口方法的,有多行/* **/

  • 一块代码逻辑如果你站在一个陌生人的角度去看,第一遍看不懂的话,就需要添加注释了

/**
 * @author 田螺
 * @date 2023/04/22 5:20 PM
 * @desc 田螺的实现类,捡田螺、卖田螺 (更多干货,关注公众号:捡田螺的小男孩)
 */
public class TianLuoClass {
 
    /**
     * 这是卖田螺的两法,它将两个田螺的价格整数相加并返回结果。
     * 
     * @param x 第一个整数
     * @param y 第二个整数
     * @return 两个整数的和
     */
    public int sellTianLuo(int x, int y) {
        return x + y;
    }
}

2.日志打印规范

  • 日志级别选择不对。常见的日志级别有error、warn、info、debug四种,不要反手就是info

  • 日志没打印出调用方法的入参和响应结果,尤其是跨系统调用的时候。

  • 业务日志没包含关键参数,如userId,bizSeq等等,不方便问题排查

  • 如果日志包含关键信息,比如手机号、身份证等,需要脱敏处理

  • 一些不符合预期的情况,如一些未知异常(数据库的数据异常等),又或者不符合业务预期的特殊场景,都需要打印相关的日志

3. 命名规范

  • 类和接口应该使用首字母大写的驼峰命名法

  • 方法和变量应该使用小写的驼峰命名法

  • 常量应该使用全大写字母和下划线

  • 开发者是不是选择易于理解的名称给变量、类和方法进行命名

4.参数校验

我们代码评审的时候,要注意参数是否都做了校验,如userId非空检查、金额范围检查、userName长度校验等等。一般我们在处理业务逻辑的时候,要遵循先检查、后处理的原则。

5. 判空处理

  • 获取对象或列表的属性时,都要判空处理。要不然很多时候会出现空指针异常。

6. 异常处理规范

  • 不要捕获通用的Exception异常,而应该尽可能捕获特定的异常

  • 在捕获异常时,应该记录异常信息以便于调试

  • 内部异常要确认最终的处理方式,避免未知异常当作失败处理

  • finally块中释放资源,或者使用try-with-resource

  • 不要使用e.printStackTrace(),而是使用log打印。

  • catch了异常,要打印出具体的exception,否则无法更好定位问题

  • 捕获异常与抛出异常必须是完全匹配,或者捕获异常是抛异常的父类

  • 捕获到的异常,不能忽略它,要打印相对应的日志

  • 注意异常对你的代码层次结构的侵染(早发现早处理)

  • 自定义封装异常,不要丢弃原始异常的信息Throwable cause

  • 注意异常匹配的顺序,优先捕获具体的异常

  • 对外提供APi时,要提供对应的错误码

  • 系统内部应该抛出有业务含义的自定义异常,而不是直接抛出RuntimeException,或者直接抛出Exception\Throwable

7. 模块化,可扩展性

代码编写设计是否满足模块化,接口是否具有可扩展性

8. 并发控制规范

  • 在使用并发集合时,应该注意它们的线程安全性和并发性能,如ConcurrentHashMap是线性安全的,HashMap就是非线性安全的

  • 乐观锁,悲观锁防止数据库并发.乐观锁一般用版本号version控制,悲观锁一般用select …for update

  • 如果是单实例的多线程并发处理,一般通过Java锁机制,比如sychronized ,reentrantlock

  • 如果是同一集群的多线程并发处理,可以用Redis分布式锁或者走zookeeper

  • 如果是跨集群的多线程并发处理,则考虑数据库实现的分布式锁。

  • 在使用分布式锁的时候,要注意有哪些坑,比如redis一些经典的坑.

9. 单元测试规范

  • 测试类的命名,一般以测试的类+Test,如:CalculatorTest.

  • 测试方法的命名,一般以test开头+ 测试的方法,如testAdd.

  • 单测行覆盖率一般要求大于75%.

  • 单测一般要求包含主流程用例、参数边界值等校验用例

  • 单测一般也要求包含中间件访问超时、返回空、等异常的用例,比如访问数据库或者Redis异常.

  • 单测用例要求包含并发、防重、幂等等用例.

10. 代码格式规范

  • 缩进使用四个空格

  • 代码块使用花括号分隔

  • 每行不超过80个字符

  • 每个方法应该按照特定的顺序排列,例如:类变量、实例变量、构造函数、公共方法、私有方法等。

11. 接口兼容性

重点关注是否考虑到了接口的兼容性

12. 程序逻辑是否清晰,主次是否够分明

程序逻辑是否清晰。可以划分主次,抽一下小函数。

13. 安全规范

  • 输入校验:应该始终对任何来自外部的输入数据进行校验,以确保它们符合预期并且不会对系统造成伤害。校验应该包括检查数据的类型、大小和格式。

  • 防范SQL注入攻击:在使用SQL查询时,应该始终使用参数化查询或预处理语句,以防止SQL注入攻击。

  • 防范跨站脚本攻击(XSS): 在Web应用程序中,应该始终对输入的HTML、JavaScript和CSS进行校验,并转义特殊字符,以防止XSS攻击。

  • 避免敏感信息泄露: 敏感信息(如密码、密钥、会话ID等)应该在传输和存储时进行加密,以防止被未经授权的人访问。同时,应该避免在日志、调试信息或错误消息中泄露敏感信息。

  • 防范跨站请求伪造(CSRF): 应该为所有敏感操作(如更改密码、删除数据等)添加CSRF令牌,以防止未经授权的人员执行这些操作。

  • 防范安全漏洞: 应该使用安全性高的算法和协议(如HTTPS、TLS)来保护敏感数据的传输和存储,并定期对系统进行漏洞扫描和安全性审计。

14. 事务控制规范

  • 一般推荐使用编程式事务,而不是一个注解 @Transactional的声明式事务。因为 @Transactional有很多场景,可能导致事务不生效。

  • 事务范围要明确,数据库操作必须在事务作用范围内,如果是非数据库操作,尽量不要包含在事务内。

  • 不要在事务内进行远程调用(可能导致数据不一致,比如本地成功了,但是远程方法失败了,这时候需要用分布式事务解决方案)

  • 事务中避免处理太多数据,一些查询相关的操作,尽量放到事务之外(避免大事务问题)

15. 幂等处理规范

幂等表示一次和多次请求某一个资源应该具有同样的副作用,或者说,多次请求所产生的影响与一次请求执行的影响效果相同。

关注接口是否考虑幂等。比如开户接口,多次请求过来的时候,需要先查一下该客户是否已经开过户,如果已经开户成功,直接返回开户成功的报文。如果还没开户,就先开户,再返回开户成功的报文。这就是幂等处理。

一般情况有这几种幂等处理方案:

  • select+insert+主键/唯一索引冲突

  • 直接insert + 主键/唯一索引冲突

  • 状态机幂等

  • 抽取防重表

  • token令牌

  • 悲观锁

  • 乐观锁

  • 分布式锁

幂等要求有个唯一标记,比如数据库防重表的一个业务唯一键。同时强调多次请求和一次请求所产生影响是一样的。

16. 中间件注意事项 (数据库,redis)

如果用数据库、Redis、RocketMq等的中间件时,我们需要关注这些中间件的一些注意事项哈。

比如数据库

  • 关注数据库连接池参数设置、超时参数设置是否合理

  • 避免循环调用数据库操作

  • 如果不分页,查询SQL时,如果条数不明确,是否加了limit限制限制

  • 数据库的返回是否判空处理

  • 数据库慢SQL是否有监控

  • 表结构更新是否做兼容,存量表数据是否涉及兼容问题考虑

  • 索引添加是否合理

  • 是否连表过多等等

比如Redis:

  • Redis的key使用是否规范

  • Redis 异常捕获以及处理逻辑是否合理

  • Redis连接池、超时参数设置是否合理

  • Redis 是否使用了有坑的那些命令,如hgetall、smember

  • 是否可能会存在缓存穿透、缓存雪奔、缓存击穿等问题。

17. 注意代码坏味道问题

  • 大量重复代码(抽公用方法,设计模式)

  • 方法参数过多(可封装成一个DTO对象)

  • 方法过长(抽小函数)

  • 判断条件太多(优化if...else)

  • 不处理没用的代码(没用的import)

  • 避免过度设计

18. 远程调用

  • 不要把超时当作失败处理: 远程调用可能会失败,比如网络中断、超时等等。开发者需要注意远程调用返回的错误码,除非是明确的失败,如果仅仅是超时等问题,不能当作失败处理!而是应该发起查询,确认是否成功,再做处理。

  • 异常处理:远程调用可能会抛出异常,例如由于服务端错误或请求格式不正确等。因此,开发人员需要确保能够捕获和处理这些异常,以避免系统崩溃或数据丢失。

  • 网络安全:由于远程调用涉及网络通信,因此开发人员需要考虑网络安全的问题,例如数据加密、认证、访问控制等。尽可能使用安全的协议,例如HTTPS 或 SSL/TLS

  • 服务质量:远程调用可能会影响系统的性能和可用性。因此,开发人员需要确保服务的质量,例如避免过度使用远程调用、优化数据传输、实现负载均衡等。

  • 版本兼容:由于远程调用涉及不同的进程或计算机之间的通信,因此开发人员需要注意服务端和客户端之间的版本兼容性。尽可能使用相同的接口和数据格式,避免出现不兼容的情况。

  • 尽量避免for循环远程调用: 尽量避免for循环远程调用,而应该考虑实现了批量功能的接口。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/18692.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从 0~1 创建 Vue2 项目

前言 从0开始搭建Vue2项目;介绍项目目录结构;为了项目方便需要添加的配置。创建 Vue2 项目共有两种方式: 手动选择;选择默认模式。 给孩子点点关注吧!😭 一、环境准备 1.1 安装包管理工具 1.1.1 安装 …

CentOS7安装MySQL

CentOS默认安装有MariaDB,这是MySQL的分支。 但还是要在系统中安装MySQL,且安装完成后可直接覆盖MariaDB。 1、下载并安装MySQL官方 Yum Repository wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 使用上面命令就…

VS Code 常用插件推荐

VS Code 常用插件推荐 1. Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code 适用于 VS Code 的中文(简体)语言包 2. Auto Rename Tag 自动关闭标签,写 html 标签的时候可以重命名标签名。 现在 vscode 已经内置了&…

分享2个教学视频录制的方法!

案例:如何录制教学视频? 【我是一名老师,我想录制一些教学视频发布在网络平台上,但是我不知道如何操作。有没有人知道录制教学视频需要什么工具?如何录制?】 随着在线教育的普及,越来越多的教…

三位一体,铸就无敌铁军!海陆空协同,开启集群新篇章!

在机器人领域,多机器人系统的研究一直是一大热点,众多高校与研究所逐步投入到机器人集群系统的研究当中,其中无人机编队表演、无人车群园区运输、无人船集群水域监测等集群应用更是进入了大众的视野。但对多机器人集群系统的需求却远不止于此…

KD305Y带吸收比极化指数兆欧表

一、概述 KD305Y绝缘电阻测试仪对众多的电力设备如:电缆、电机、发电机、变压器、互感器、高压开关、避雷器等要求做一系列的绝缘性能试验,首先是要做绝缘电阻测试。近年来随着电力事业的飞速发展,大容量设备的使用不断增加,用普通的兆欧表无…

idm下载器2024官方最新中文版免费下载

哈喽大家好呀,coco玛奇朵发现我已经有一阵子没有给大家分享windows软件了,今天给大家分享一款暗藏惊喜的windows软件,用过之后真的很难拒绝! 这是一个可以帮你提升下载速度的工具,有了它几秒就能帮你下载好各种资源。…

Ubuntu 增加swap交换内存

一、创建虚拟内存 在实际开发中发现swap交换分区不够用了,于是需要创建虚拟内存来增加交换分区的大小。 在系统空闲空间位置创建swap虚拟内存专用文件夹 cd /data //切到你想要创建交换分区的目录 mkdir swap //新建文件夹swap cd swap //进入swap文件夹 备…

el-table多级嵌套列表,菜单使用el-switch代替

需求:根据el-table实现多级菜单复选,并且只要是菜单就不再有复选框,也没有全选按钮,一级菜单使用el-switch代替原有的列复选框,子级如果全部选中,那么父级的el-switch也会被选中,如下图&#xf…

亿发工业互联网智能制造ERP系统,生产工厂信息化建设解决方案

亿发工业互联网智能制造ERP系统,生产工厂信息化建设解决方案 随着制造水平的发展,传统工厂原有的生产组织模式和质量管理模式已不能满足先进制造水平的要求。确保公司战略目标的实现,有必要借助信息技术加强对各种业务流程的管理。而企业走向…

10个最流行的向量数据库【AI】

矢量数据库是一种将数据存储为高维向量的数据库,高维向量是特征或属性的数学表示。 每个向量都有一定数量的维度,范围从几十到几千不等,具体取决于数据的复杂性和粒度。 推荐:用 NSDT场景设计器 快速搭建3D场景。 矢量数据库&…

FE_Vue框架的重要属性讲解【ref props mixin】

1 ref属性 对于传统的HTML而言,id 和 ref确实没有什么差别,但是对于组件来说就不一样了。给组件加id,打印出获取的结果为组件所对应的完整DOM结构。给组件加ref,打印出获取的结果就是VueComponent实例。 被用来给元素或子组件注册…

软考A计划-重点考点-专题十(算法分析与设计)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

【sop】基于灵敏度分析的有源配电网智能软开关优化配置[升级1](Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

剑指 Offer 34. 二叉树中和为某一值的路径

题目描述: 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 题目来源 示例 1: 输入:root [5,4,8,11,null,13,4,7,2,nul…

mac iterm2设置rz sz文件传输

1、安装lrzsz $ brew install lrzsz 2、创建并设置iterm2-send-zmodem.sh sudo vim /usr/local/bin/iterm2-send-zmodem.sh # /usr/local/bin/iterm2-send-zmodem.sh#!/bin/bash # Author: Matt Mastracci (matthewmastracci.com) # AppleScript from http://stackoverflow.com…

Cy5.5-PEG2000-Biotin,Cy5.5-聚乙二醇-生物素;Biotin-PEG-Cy5.5;可用于检测抗生物素、链霉亲和素或中性生物素

Cyanine5.5-PEG-Biotin,Cy5.5-聚乙二醇-生物素 中文名称;Cy5.5-聚乙二醇-生物素 英文名称;Cyanine5.5-PEG-Biotin 性状:粘稠液体或固体粉末,取决于分子量大小 溶剂:溶于水、氯仿、DMSO等常规性有机溶剂 分子量PEG:1k、2k、3.…

高薪Android开发工程师面试题必备!

5-6月各种补招和散招才是招聘高峰,也是拿offer的高峰,机会多多。 悲观者往往正确,但乐观者往往成功。不要制造焦虑吓自己。 多为面试准备准备,机会多多也要把握住! 以下都是一线互联网大厂最常见的几个问题&#xf…

文件上传漏洞详解

0x01 上传漏洞定义 文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件…

MySQL索引

目录 一、索引的概述二、索引的作用2.1 索引是如何实现?2.2 使用索引的副作用 三、创建索引的原则依据四、MySQL的优化哪些字段/场景适合创建索引?五、索引的分类及创建5.1 普通索引直接创建索引修改表方式创建创建表的时候指定索引 5.2 唯一索引直接创建…
最新文章