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

news/2024/4/20 7:17:15/文章来源:https://www.cnblogs.com/ailuo9494/p/16634942.html

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。

 

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

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

相关文章

设计模式之(3)——抽象工厂方法模式

定义:抽象工厂模式简单地讲,就是提供一个超级工厂,围绕这个超级工厂创建其他工厂;抽象工厂模式提供一个创建一些列相关或者相互依赖对象的接口;在此之前我们先来讲一下产品等级和产品族的概念;相同的产品等级就是相同的同一类的产品,比如美的冰箱、格力冰箱、海尔冰箱,…

Mysql----事务

《需求》 《操作》 《细节》

分类数据展示功能_缓存优化_分析

分类数据展示功能_缓存优化_分析 对数据进行一个缓存优化,分析发现:分类的数据在每一次页面加载后会重新请求数据库来加载,对数据库的压力比较大,而且这数据不会经常发送变化,可使用redis来缓存这个数据 分类数据展示功能_缓存优化_代码实现public class CategoryServiceI…

日常问题: 上线确认

作为开发,手头没事的时候,担心自己没参与大项目,年终没产出。而真正需求到来的时候,却是狂风暴雨一般,密集且时间紧迫。在紧锣密鼓996之后,终于迎来了上线。 但这一天不太顺利。背景 xxx正式上线。上线前,方案强调要开发把所有配置都给到他,他要确认下。当时觉得有问题…

第一个代码Hello World!

HelloWorld新建一个文件夹,存放代码新建一个Java文件 文件后缀为.java名为Hello.java[注意]要显示系统后缀名编写代码 public class Hello{ public static void main(String[] arge){ System.out.print("Hello,World!"); }} 打开cmd 路径需要是Hello.j…

Linux

1、关机命令命令 说明sync 将数据由内存同步到硬盘中shutdown 关机shutdown -h 10 10分钟后关机shutdown -h now 立马关机shutdown -h 20:25 指定时间关机shutdown -h +10 10分钟后关机shutdown -r now 系统立马重启shutdown -r +10 10分钟后重启reboot 重启,等于shutdown -r …

线性布局LinearLayout

线性布局中的下级视图有两种排列方式当orientation属性为horizontal时,线性布局中的下级视图在水平方向上从左往右排列 当orientation属性为vetical时,线性布局中的下级视图在垂直方向上从上往下排列线性布局的权重 概念:线性布局的权重,用来表示线性布局中各视图所占比例大…

NC50439 tokitsukaze and Soldier

在一个游戏中,tokitsukaze需要在n个士兵中选出一些士兵组成一个团去打副本。 第i个士兵的战力为v[i],团的战力是团内所有士兵的战力之和。 但是这些士兵有特殊的要求:如果选了第i个士兵,这个士兵希望团的人数不超过s[i]。(如果不选第i个士兵,就没有这个限制。) tokitsukaz…

Dos命令

打开cmdwin+r ->cmd 以管理员身份运行win->windows系统->命令提示符->右键->更多->以管理员身份运行 常用的Dos命令 盘符切换 输入D: 切到D盘 查看当前目录下的所有文件 dir 切换目录 cd (change directory) cd msicheng 从Users文件夹进入其子文件夹msiche…

个人网盘搭建——搭建Cloudreve并对接onedrive

前言 搭建这个主要是为了方便自己备份,顺便可以水一下文章(bushi) 其次是自己有好几个微软的全局账号吃灰,还是想稍微利用一下的,如果有人要子号可以来联系哦,好心的我应该会给你的吧 由于个人使用,不会介绍很难的安装方法。下面会介绍宝塔简单快速的安装方法。后续也许…

Spring学习笔记(三)——Spring依赖注入

1.Spring Bean属性注入的几种方式 1.1构造函数注入 使用构造函数实现属性注入大致步骤如下:在 Bean 中添加一个有参构造函数,构造函数内的每一个参数代表一个需要注入的属性; 在 Spring 的 XML 配置文件中,通过 <beans> 及其子元素 <bean> 对 Bean 进行定义; …

动态规划算法(背包问题)

1.应用场景-背包问题 背包问题:有一个背包,容量为4磅 ,现有如下物品1)要求达到的目标为装入的背包的总价值最大,并且重量不超出 2)要求装入的物品不能重复 2.动态规划算法介绍 1)动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步…

开启apache服务器gzip压缩

开启apache服务器gzip压缩-百度经验 https://jingyan.baidu.com/article/db55b609a7bc234ba20a2f7e.html 从服务端优化来说,通过对服务端做压缩配置可以大大减小文本文件的体积,从而使加载文本的速度成倍的加快。目前比较通用的压缩方法是启用gzip压缩。它会把浏览器请求的页…

Linux修改主机静态IP

通过VIM编辑器打开主机配置文件夹vim /etc/sysconfig/network-scripts/ifcfg-ens33修改IP地址为静态地址BOOTPROTO="static"添加静态IP地址和网关IP 地址 IPADDR=192.168.244.100 网关 GATEWAY=192.168.244.2 域名解析器 DNS1=192.168.244.2网络重启service network …

点击按钮收藏

分析 后台代码RouteServlet类:/*** 添加收藏* @param request* @param response* @throws ServletException* @throws IOException*/public void addFavorite(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1、获取线…

前端5JQ

js获取用户输入 JS类属性操作 JS样式操作 事件 JS事件案例 JQuery类库 JQuery基本使用 基本筛选器(了解) 表单筛选器Js获取用户输入 普通数据(输入,选择) ​ 标签对象.value 获取文件数据的时候: 标签对象.value只能获取到文件路径,而标签对象.files结果是一个数组,可以通…

前端Day10

视口(viewport):浏览器显示页面内容的屏幕区域。分为布局视口、视觉视口、理想视口。 布局视口: 视觉视口: 理想视口: meta视口标签: width=device-width:布局视口宽度为当前设备宽度* user-scalable=no:不允许用户缩放 二倍图: 1.物理像素比: ①物理像素:即分辨…

分布式系统的session共享问题

目前大多数大型网站的服务器都采用了分布式服务集群的部署方式。所谓集群,就是让一组计算机服务器协同工作,解决大并发,大数据量瓶颈问题。但是在服务集群中,session共享往往是一个比较头疼的问题。因为session是在服务器端保存的,如果用户跳转到其他服务器的话,session就…

网络network

网络network 基础network模型 OSI七层模型,一层一层封装数据帧(添加报文头),传过去之后再一层一层解封装(解封装掉报文头) 应用层:应用软件层面业务端口,例如http/https,ftp,sftp,smtp(25),除了在四层TCP IP+端口号的方式进行外,还需要检查http/https的url,cook…

python中的多线程与多进程

线程概念: 线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。 线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一…