首页 > 其他分享 >写代码有这10个好习惯的话,可以减少80%非业务的bug

写代码有这10个好习惯的话,可以减少80%非业务的bug

时间:2022-08-29 10:11:40浏览次数:53  
标签:10 缓存 代码 数据库 接口 查询 80% bug

1. 修改完代码,记得自己测试一下

「改完代码,自己先测试」是每位程序猿们必备的基本素养。尤其不要抱着这种「侥幸心理:我只是改了一个变量或者我只改了一行配置代码,没必要自己测试」。改完代码后最好要求自己去测试一下,这样可以规避很多不必要的bug。

 

2. 方法入参尽量都检验

入参校验也是每个程序员必备的基本素养。你的方法处理「必须先校验参数」。比如入参是否允许为空,入参长度符合你的预期长度了没。这个尽量养成习惯吧,要知道很多「低级bug」都是「不校验参数」导致的。

比如你的数据库字段设置为varchar(16),对方传了一个32位的字符串过来,你不校验参数,「插入数据库那就直接异常」了。这个经常发现没?

 

3. 修改老接口的时候,要先思考接口的兼容性

很多bug都是因为修改了对外老接口,但是「不做兼容导致」的。关键这个问题还多数是比较严重的,可能直接导致系统发版失败了。这个也是新手程序员经常犯的错误哦~

所以,如果你的需求是在原来接口上修改的,并且这个接口是对外提供服务的,那你就一定要考虑接口兼容。

 

4.复杂的代码逻辑,添加清楚的注释

写代码的时候是没有必要写太多的注释的,好的方法或变量命名就是最好的注释。但是如果是「业务逻辑很复杂的代码」,真的非常有必要写「清楚注释」。清楚的注释,更有利于后面的维护,不然别人会看不懂你的代码是在干嘛的。

 

5 尽量不在循环里远程调用、数据库操作,要优先考虑批量进行

远程操作或者数据库操作都是「比较耗网络、IO资源」的,所以尽量不在循环里远程调用、不在循环里操作数据库,能「批量一次性查回来最好是不要循环多次去查」。(但是呢,也不要一次性查太多数据哈,分批查询,效果会好很多,不然你的电脑又要卡很久了)

 

6 手动写完业务代码的SQL,先拿去数据库运行一下,同时也explain看下执行计划

手动写完业务代码的SQL,可以先把它拿到数据库运行一下,看看有没有语法错误嘛。有些小伙伴不好的习惯就是,写完就把代码打包上去测试服务器,其实把SQL放到数据库执行一下,可以规避很多错误的。

同时呢,也用「explain看下你Sql的执行计划」,尤其走不走索引这一块。可以一目了然。

explain select * from user where userid =10086 or age =18;

 

7 调用第三方接口,需要考虑异常处理、安全性、超时重试这几个点

调用第三方服务,或者分布式远程服务的的话,需要考虑:

  • 异常处理(比如,你调别人的接口,如果异常了,怎么处理,是重试还是当做失败)
  • 超时(没法预估对方接口一般多久返回,一般设置个超时断开时间,以保护你的接口)
  • 重试次数(你的接口调失败,需不需要重试,需要站在业务角度上思考这个问题)

举一个简单例子,一个http请求别人的服务,需要考虑设置connect-time和retry次数。

如果是转账等重要的第三方服务,还需要考虑「签名验证」「加密算法」等。

 

8 接口需要考虑幂等性

接口是考虑幂等性是必须的,尤其是在抢红包、转账等这些重要接口的时候。最直观的业务场景,就是「用户连着点击两次或者多次时」,你的接口有没有hold得住。

  • 幂等(idempotent、idempotence)是一个数学与计算机学概念,经常出现在抽象代数中。
  • 在编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数或幂等方法是指可以使用相同参数重复执行,并能获得相同结果的函数。

一般「幂等技术方案」有下面这几种:

  • 查询操作
  • 唯一索引
  • token机制,防止重复提交
  • 数据库的delete删除操作
  • 乐观锁
  • 悲观锁
  • Redis、zookeeper 分布式锁(比如抢红包需求,用了Redis分布式锁)
  • 状态机幂等

 

9 主从延迟问题考虑

先插入数据,接着就去查询,这类代码逻辑比较常见,这「可能」会有问题的。一般数据库都是有主库、从库的。写入的话是写主库,读一般是读从库。如果发生主从延迟,很有可能出现你插入成功了,但是却查询不到的情况。

  • 如果是重要业务,需要考虑是否强制读主库,还是再修改设计方案。
  • 但是呢,有些业务场景是可以接受主从稍微延迟一点的,但是这个习惯还是要有吧。
  • 写完操作数据库的代码,想下是否存在主从延迟问题。

 

10.使用缓存的时候,考虑缓存跟DB的一致性,还有(缓存穿透、缓存雪崩和缓存击穿)

通俗点说,我们使用缓存就是为了「查得快,接口耗时小」。但是呢,用到缓存,就需要「注意缓存与数据库的一致性」问题了。同时还需要规避缓存穿透、缓存雪崩和缓存击穿三大问题。

  • 缓存雪崩:是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至宕机。
  • 缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。
  • 缓存击穿:指热点key在某个时间点过期的时候,而恰好在这个时间点对这个Key有大量的并发请求过来,从而大量的请求打到db。

 

标签:10,缓存,代码,数据库,接口,查询,80%,bug
From: https://www.cnblogs.com/ailuo9494/p/16634942.html

相关文章

  • 重装win 10 系统
    一、制作启动盘    ①、下载win10镜像       (1.1)、传送门       (1.2)、复制地址迅雷下载    ②、下载安装UltraISO ......
  • git时:OpenSSL SSL_read: Connection was reset, errno 10054
    OpenSSLSSL_read:Connectionwasreset,errno10054...处理方法Solution1:(原因)更新DNS缓存。在cmd中输入以下命令:ipconfig/flushdnsSolution2:(原因)文件太大了......
  • 10 分钟彻底理解 Redis 的持久化和主从复制
    在这篇文章,一起了解一下其中一个非常重要的内容:Redis的持久化机制。什么是Redis持久化?Redis作为一个键值对内存数据库(NoSQL),数据都存储在内存当中,在处理客户端请求时,所......
  • PowerShell教程 - 程序性能和BUG分析工具
    更新记录转载请注明出处。2022年8月29日发布。2022年8月29日从笔记迁移到博客。程序性能和BUG分析工具https://hibernatingrhinos.com/products/efprofhttps://s......
  • HC32L110(三) HC32L110的GCC工具链和VSCode开发环境
    目录HC32L110(一)HC32L110芯片介绍和Win10下的烧录HC32L110(二)HC32L110在Ubuntu下的烧录HC32L110(三)HC32L110的GCC工具链和VSCode开发环境以下介绍Ubuntu下搭建......
  • 黑马_10、使用 Express 写接口
    使用Express写接口步骤如下1创建基本的服务器代码://导入expressconstexpress=require('express')//创建服务器实例constapp=express()//writeyourco......
  • gym-103708E Erudite of words
    Eruditeofwords组合数学+容斥定义\(F_i\):表示由\(i\)个字母组成的长度为\(n\)的单词数(每个字母必须在单词中出现)显然答案就是\(F_k*C_{m}^{k}\)关于\(F_i......
  • PAT Advanced 1029 Median(25)
    题目描述:GivenanincreasingsequenceSofNintegers,themedianisthenumberatthemiddleposition.Forexample,themedianofS1={11,12,13,14}is1......
  • Python3项目初始化10-->JS基础、dom、jquery、database
    29、JS基础var定义变量数字字符串和Python一样布尔值true和false首字母不大写逻辑判断if(){}elseif(){}else{}借助浏览器console执行操作,见截图。   ......
  • golang json使用10、-10、0表示,true、false、null
    packagemainimport("encoding/json""errors""fmt")typeAstruct{BrBoolean`json:"br"`}funcmain(){varcAe:=json.Unm......