首页 > 编程语言 >Java:如何写好代码,少点bug

Java:如何写好代码,少点bug

时间:2023-06-13 14:14:57浏览次数:34  
标签:实体类 Java 少点 代码 update 用户 字段 SQL bug

前言

工作差不多两年了。
2021-04-14实习入职,至今2023-04-07,和大佬相比我这还是属于初级程序员,技术不强。
平时写代码没啥技术含量,但真的挺多同事连基本的CRUD都写不好,不管是代码规范还是安全性问题都有很大的纰漏,所以觉得自己最大的骄傲就是代码规范,bug少。

同时希望刚工作不久的同学,尽量少点bug代码写好看点,你后面也会帮别人擦屁股的,同是打工人照顾下后面接手的兄弟

代码规范

代码规范我挑最常见最重要的讲:

  1. controller不要堆业务代码。像switch、for、大量的if else别写在contro,将业务抽到service

  2. controller对异常处理仅仅是打印日志,返回错误信息给前端的,少用try-catch,写个全局异常处理器

  3. 同一性质的业务代码抽成一个方法,并加上注释。举个例子:

比如说新增用户,然后将用户信息同步到另一个系统。业务逻辑如下:
1. 校验用户信息
2. 新增用户
3. 插入用户日志
4. 同步另一系统

这样1可以抽成校验方法,2,3对用户操作也抽,剩下4也抽个。

这样做有最大的好处:

  1. 看代码的人可以清晰知道哪个方法是干啥的,减少无关代码的阅读成本
  2. 降低维护成本。如果你全不抽,都是怼在一个方法里,八成后面添加代码的兄弟也懒得抽方法,直接怼导致方法越长
  1. 尽量最多嵌套两个for,实在需要多个for遍历,看能否在数据库来处理。如果数据量大那就加索引来处理

  2. 不要排斥异常甚至是NPE(空指针异常)。记住,不符合业务逻辑,该抛异常就得抛。NPE尤为强调,不要怕出现就老是 if(obj != null)...来避免进而写自己代码

  3. 新增和编辑contro接口请分开写。不要搞个saveOrUpdate,前期业务代码少可以简单判断处理,后面多了很容易出错

  4. 对于不同性质的实体类,不要用转换工具,如BeanUtils.copyProperties。什么叫不同性质的实体类?举个例子:

有两个对象,都是User实例:同性质
有三个对象,分别是User、UserDO、UserVO:同性质
有四个对象:User、Menu、Role、Department:不同性质

对于不同性质的实体类数据设值,别用BeanUtils.copyProperties等工具类,请老老实实写个方法一个个属性get、set。为后面看代码的兄弟着想下,别让人家老翻哪些属性是对应上的

  1. 对于字典属性,转换为文本请加一个字段,不要覆盖。举个例子:
有个商家编码属性:private String merchantCode。
现在需要商家编码对应的商家名称,就再搞个private String merchanName。获取商家字典映射merchantCode -> merchanName。

为什么这么简单的事还讲?因为我遇到过一个人就不这么做,转换的文本直接覆盖原字段上,导致后面开发兄弟做更新操作,数据库原本保存字典值,后面都更新为中文了

  1. 在表数据不大情况下,请查询全部字段。大家SQL优化最牢记就是不要select *,这也得看具体情况,数据不大情况下完全可以这样做,好处是减少和前端扯皮要数据的工作量

  2. 编辑操作别update前端给的全部字段。编辑某条记录,通常是回显此条所有信息,然后改相应字段,再把改后的数据给到后端。这里有个问题,如果前端不小心改了本来不应在编辑界面的字段,可能导致数据库也修改了。还是举个例子:

假设用户表有 id,userName,sex,idCard(像创建时间啥的就不列了)
界面上只能编辑用户名和性别,但你把用户的全部字段都返回给界面,前端可能不小心动了idCard字段,然后你直接update接收的整个对象,也就会把idCard也更新了。

严谨做法,后端一个个把需要修改的字段重新set新对象里,然后再update

  1. 涉及微服务之间的api调用,不要抛异常。如果出现异常,catch捕获后返回error的ResultDTO即可

  2. 少常量硬编码。诸如 str.equals("1"),sex == 1少写,建个枚举或者常量类写好注释比较好

代码安全

  1. 保证事务。只要insert、update、delete,都问问自己需不需要事务,哪些操作可以看作一个事务。顺便说下@Transactional有种失效场景极易忽视:同一个类A方法调B方法,A没加B加了@Transactional,这种是不起作用的

  2. 使用第三方SDK调用接口,要考虑的失败情况有3种:

  1. 响应respongse == null
  2. 抛出异常
  3. success = false
  1. 在查询数据库数据时,多考虑下表是否是大表,是的话:
  1. 尽量通过分页,限制查询条数
  2. 分批查,然后实体类间属性映射少用(否则容易oom)。
  3. 异步处理

业务纰漏

  1. 新增/更新漏字段。insert、update字段时,大家基本跟着原型或PRD来的,产品很多时候就不知道表,所以部分字段设值他是不知道的,也没有技术文档让我们照着敲,因此我的建议是多看表多看字段,问问字段设值的时机在啥时候

SQL建议

  1. 如果开发能不用mybatis-plus,尽量不用这玩意。这东西是纯对mybatis做增强没错,但因为有了他的出现,见过非常多的同事SQL能力很差,有的为了偷懒在多表情况也是不写SQL,一顿在应用嵌套for

标签:实体类,Java,少点,代码,update,用户,字段,SQL,bug
From: https://www.cnblogs.com/ibcdwx/p/17297051.html

相关文章

  • java 泛型 深入
    评:泛型的好处:(casting)的绝对无误。/*******不使用泛型类型*******/Listlist1=newArrayList();list1.add(8080);//编译器不检查值String......
  • 【技术积累】JavaSciprt中的函数【一】
    什么是函数?如何声明函数?JavaScript中的函数是一段可重复使用的代码块,它可以接受输入并返回输出。在JavaScript中,函数是一种特殊的对象,因此可以将其存储在变量中,将其作为参数传递给其他函数,并从其他函数中返回。在JavaScript中,声明函数有两种方式:函数声明和函数表达式。1.函数......
  • Java8 Stream List Map:Stream 流对象汇总 求和 某个属性 BigDecimal MDouble
    测试实体(数字对象使用MDouble):importcom.mchweb.common.lang.MDouble;importlombok.*;@Getter@Setter@Builder(toBuilder=true)@NoArgsConstructor@AllArgsConstructorpublicclassUser{privateMDoublemoney;}importcom.mchweb.common.lang.MDouble;imp......
  • 喜报 | ShowMeBug获国家高新技术企业认证!
    近日,深圳至简天成科技有限公司(以下简称至简天成)顺利通过国家高新技术企业认证! 国家高新技术企业是由国务院主导、科技部牵头的国家级荣誉资质,是我国科技类企业中的“国”字号招牌,完成认证需要经过各级政府、科技、财政等多部门层层审核与考评,是中国高科技企业的权威认证。顺利......
  • 你真的读懂了Java源码?Collections源码初探
    最近重温Java知识,遇到不懂的问题搜索互联网/博客很难直接找到答案,还好如今有了chatGPT,比大多数CV复读机/纯文档翻译的内容更有用。很多文章总结冠以“深入理解xxx”,“万字长文详解xxx”的文章,也不过是演示一遍调用代码,让你知道了怎么用,在什么情况下用。但至于为什么这么用,以及Java......
  • java WebUploader 分片上传
    ​ 对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送、接收都是不可取,很容易导致内存问题。所以对于大文件上传,采用切块分段上传,从上传的效率来看,利用多线程并发上传能够达到最大效率。 本文是基于springboot+vue实现的文件上传,本文主要介绍服务端实现文件......
  • Java 利用POI对象 SXSSFWorkbook 导出Excel
    最开始调用的方法是(标记的地方): workbook=newHSSFWorkbook();和workbook=newXSSFWorkbook();这两个方法就是导出Excel的最关键的方法,接下来我来说说这两个方法作用:1.HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls;2.XSSFWorkbook:是操作Excel2007的版本......
  • Java判断一个List中是否有重复元素
    1.将List转为Set,通过2个集合的size大小是否相等来判断有无重复元素publicstaticvoidmain(String[]args){ListstringList=newArrayList<>(Arrays.asList("a","a","b","c"));SetstringSet=newHashSet<>(stringList);......
  • mac M2 装PHP xdebug
    目前xdebug你不支持arm只能自编译pecel安装是arm64arch-arm64sudopeclinstallxdebug编译下载https://xdebug.org/download编译gitclonehttps://github.com/xdebug/xdebug.gitcdxdebugphpize./configure--enable-xdebug--host=arm-linux-gnueabimak......
  • Javascript中的内存(垃圾)回收机制
    JavaScript具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行常见的垃圾回收方式:标记清除、引用计数方式。一、标记清除方法1、工作原理:【标记“离开环境”的就回收内存】当变量进入环境时,将这个变量标记为“进入环境”。当变量离开环境时,则将其标记为“......