要对代码有一些想法

前言。

技术服务于业务,今天来梳理一下。

技术的变化,从一开始的 jsp+ssm到现在的springboot+mybatis+vue,框架越来越便捷,正如曾经看到的那句话,底层越来越复杂,顶层越来越无脑。开发门槛越来越低,但是你懂的越来越少。原理跟基础,在网上java资料都很泛滥,但是碰到问题,怎么处理问题,怎么去解决问题,或者预防问题变成真正含金量的东西。人应该对技术做怎么样的思考,或许是之前走的太快太忙,没有好好思考过。

业务的变化,业务初步给人的感觉就是产品经理在巴拉巴拉的一顿乱说,好像给在专注写代码的你套上了过来开个会的枷锁。一开始也烦业务,为什么不让我好好写增删改查,打扰我宝贵的敲代码时间。后面被现实教育了。开始重新审视业务。首先,你的代码不值钱,你的增删改查来个实习也可以干,你的ctrl+c,ctrl+v ,实习的比你更加熟练,其次你的代码单纯的拿出来,没有变现价值,你的尝试都是偏向表面,或许你写的,都是可以百度到的写法,没有对某个点进行优化,涉及底层的东西,真的有价值吗?面试问的很多项目经验,都是问遇到什么问题,你怎么解决问题?更看重你对待技术的态度,跟处理方法,以及一个处理bug的思路。技术是服务于业务的,在这个前提下,你的业务可以自己去了解新的技术,去开源编写一些场景下的框架或者代码。

你可以进行的思考

1.复杂的逻辑条件,是否可以调整顺序,让程序更高效

代码基本是增删改查,只有跟对应逻辑集合在一起,才是一个功能模块。一般接收到一个需求,往往就是直接开干,if-else一次性写下来,逻辑在哪里出现分支就是一个if-else,如果分支在很前面,可能对应代码就是要写二次,然而其中分支变化点可能就是状态的不同。这里的基本思路是把重要的分支点尽量提前,把重复的代码提取出来。这是一个代码优化很重要的点,让你的代码具备可复用性,以及别人可以看到你提取出来是对一个逻辑的进行处理,提高可读性。另外是否可以调整顺序,其中某些值的校验无疑是放到比较靠前的,因为如果校验不通过,根本无法走到下面流程。这些判断都是业务支持提供的。

2.你的程序是否创建了不必要的对象。

每一个对象的应用都有开销,如何让你的代码用到的对象是都需要用到的。这里有二个点,一个点是在代码完成后,代码优化这个环节,你删除没有引用到的包或者对象 这里主要是指 多余的import类,第二个是把重复都在用的提取出来,比如支付宝对接时候,支付宝基本信息那个类就是都要使用的,用单例模式,懒汉加载。而不是用到的时候,重新new一个,这种代码也是可以优化的。

3.查询数据库时候,你是否查询了表的所有数据

查询sql的编写,一般情况都有很经典的select * from xx,查询全表内容,但是这个是不提倡的,因为表数据会越来越大,以及一些表的数据是尽量不要全带出来,同样优化时候,用具体字段代替 select *,最差也是全字段查询,也就是一个优于等于 select * 的选择题。

4.加上一行 你觉得不怎么重要的代码 ,是否会影响到主要流程

我项目中遇到过,想查看用户的所在地,这里有二个切入点,一个是用户手机和用户ip,都可以大概显示用户所在地,这个是不重要的数据,就选择了用户手机,因为用户手机唯一确定。我写在用户新增部分,手机号码查询归属地是调用第三方接口。测试时候,都是正常的。然后线上用户新增失败报错。排查时候是第三方接口出现波动,导致报错,然后原本正常的用户新增失败,因为用户新增部分是作回滚,但是手机号码查询归属地是写在controller层调用的,所以出现用户新增实际是成功的,但是用户页面出现你注册失败,再一次去注册就出现了你号码已经注册。所以这个影响到主要流程了。该怎么处理,最简单,就是调用第三方接口去捕获异常处理,这个不那么重要的信息获取,即使失败也不会影响主要流程,然后是如果有及时性,那么就另开异步线程去处理,即使失败也不会影响到当前流程。又或者是跑定时,当一天结束后,对手机号码归属地为null的数据,都调用第三方接口去查询手机号码归属地,然后回写到数据库中。

5.对空指针引起重视

任何判断都应该要知道是否值可能存在为空的情况,所以空指针的判断是摆在首位的。优先是确定不为空的值放在前面,然后再是.equals(传入的值),这个要养成习惯,不然线上如果数据哪里出问题了,拿某个对象里面某个值进行对比,那个值碰巧是空,报错的话,代价很大,切勿轻易尝试。

6.你的关键业务代码是否有日志输出

线上不可能让你打断点去排查,所以你的排查极大程度是依赖日志,你的每个操作数据库不可能都记录,那么对数据库开销很大,所以一般是依赖日志。对应操作需要打印对应日志,基本的日志 输出我比较推荐 logger.infoFrom 这个 一般记录 调用接口,操作人,调用结果,调用传参,对应数量 等等。另外info跟error的日志输出级别也要注意。如果你还对接了微信,微信有一个微信报警,企业有对应企业账号的话,可以去了解一下。你可以把即为关键的信息报警。比如用户下单失败,用户签约失败,用户付款异常失败等等,都可以报警给你

7.化整为零

你的代码写成一坨,别人就需要一行一行看下来,而且很多都是重复的,可能就是状态某个值不一样,其他都一样。那样的代码重复太多,可以提取出来,划分成功能单一的小函数,这个有一个说法,尽量代码一个函数不要超过50行,除非真的特别长,50行一拉到底,一气呵成,方便你对这个代码进行了解,也方便别人调用。如果你代码是提供给别人对接,那么更加需要拆分,因为如果需求改变,别人同样还是调用你的代码,那么就是你自己动大手术还是小手术的区别了。写在一起,可能都要更改,但是你做好了拆分,可能你就更换零件就可以了。你懂的。

8.可变因素,是否最好都有一个字典表去支持

配置这东西,我接触的项目中,有网页的其中涉及客服的二维码,这里处理方式有既然是页面的图片,那么页面写死,可以这样做。但是客服每天都要更换,那么天天修改页面,先客服图片给你,上传到oss,然后对应cdn加速,最终的网址你给前端,然后前端修改页面,每天都这样。程序员要做的就是把重复的动作给提取出来,然后做成程序,这样就是一个价值。后面创建字典表,前端去读取字典二维码数据,后端提供给客服上传二维码功能,上传的二维码网址回写更新字典表的数据。那么每天客服自己去修改就可以了,甚至可以短时间内多次修改,都满足。

9.查询大表,是否加了索引

查询数量表比较大的表时,我们需要确认三点A.表是否建了索引 B.查询sql是否命中索引 C.sql是否还有优化的余地

10.你的方法返回一个空集还是null

mybatis中有返回一个对象类 也有一个对象list的,其中判空标准不一样,如果是类,判断是否等于null,如果是对象list的,是空集,不为null,需要判断对象list.size()==0

11.查询数据库,如果数据返回太多,考虑分批处理

这里用到的是数据导出,用户数据导出一个案例,查询出来的数据导出成excel表在浏览器自动下载。本地测试是没问题的,因为本地测试数据库的数据不多,就是简单测试一下功能,但是放到线上测试环境就导不出,打印日志,也基本都是正常的,就是最后一步在浏览器自动下载没有实现,之后是对应用户表数据传输到本地,发现也导出失败,最后排查是数据过多,那么就考虑分批处理,获取对应总条数然后进行500条一批,也就是 对象list.size() / 500 + 1 作为总导出的次数,然后再走原先流程,完成用户数据excel导出。

12.你的接口是否考虑到幂等性,并发情况呢

幂等性是什么?一次和多次请求某个资源对于资源本身应该具有同样的结果,就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同

比如你点击下单,不可能连续点多次提交订单,就生成多个订单吧

这个极大程度是出现在资金冲突情况,某个接口可以进行资金的增加减少。开二个页面,对同一个用户的资金进行增加减少,首先是查询出来,然后做加减。这种处理方法要用到version版本号来确定你当前操作是否同一条数据,如果不是,返回重新操作。或者使用update ,对在sql语句中对对应数据进行操作,记得结果值不能小于0,利用数据表自身的修改语句锁行来进行处理并发

13.redis的使用

很多数据只是本次使用比较频繁,到下次就不用了,比如token,对于本次登录,用户操作,每个请求都要校验token,如果每次都取mysql数据库的token数据就消耗资源,所以这里用redis做缓存,将不变的用户数据,缓存起来,这样性能有所提升。

以上原创来自 https://mp.weixin.qq.com/s/9l1AvpSa9m5QINrVicejxw

同时加上自己的一些理解跟案例

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345