代码整洁之道
时间:2023-08-02 17:07:00
一、前言
1986年1月28日,美国东部时间上午11:39,挑战者号航天飞机发射仅73.124秒后,由于右侧固体火箭助推器故障,124秒后.5万米高空爆炸坠毁,7名航天战士全部死亡。
背景:高热气体从故障固体火箭助推器的外壳接头泄漏,喷洒在外部燃料舱上,主液氢燃料舱底部爆炸,液氢点燃。
根本原因:在火箭助推器的圆形接缝处,有2个由合成橡胶制成的同心密封圈。发射前夜,气温降到了-8摄氏度,比密封圈的最低承限温度低了13度,这个温度下的密封圈已经硬的失去了弹性,无法很好地密封高热气体。
工程师写了备忘录,发出了高风险预警信号,要求宇航局管理人员取消发射任务,面对金融和政治 压力宇航局管理人员无动于衷,最终导致灾难。
反思:提前严格检测各部件,并向制造商莫顿报告问题*奥赛科公司和美国宇航局的管理人员发出预警信号,抗议取消发射任务。以下是O型圈:提前对各部件进行严格检测,向制造商莫顿报告问题*奥赛科和美国宇航局的管理员发出预警信号,抗议取消
二、联想(雪崩效应)
由于上述挑战者事故,我们想到了我们作为工程师开发的系统,当小问题产生的一系列连锁积累也会导致以下问题:
1、不能使用服务提供商;
2、重试加大请求流量;
3、服务调用者不可用;
4.整个系统崩溃不可用
虽然2017年支付系统没有遇到灾难性问题,但各种问题层出不穷。当时的系统技术栈非常落后。
技术栈:Struts1.0、ibatis、jsp/html、ThreadPoolTaskExecutor定时任务。
程序:代码冗余、结构混乱、开发困难、测试部署困难。
遇到的问题action类2000多行代码,一个method方法有数百个银行代码、上游渠道、支付方式和路由。支付系统位于中间系统中,下面连接商家的支付渠道接口,上游连接各银行机构等渠道。没有可视化界面系统部署来测试和操作,只有一个jsp测试页面用于测试每个接口(交易订单、退款、交易查询、退款查询等)。
查询问题非常困难。您需要不同公司运维部门同事的机器,登录生产服务器跟踪日志查询问题(或打包日志查询)。经常出现长或短的问题,商家没有收到支付系统的异步通知,一个是由于支付系统问题没有通知商家,另一个是由于上游渠道问题没有通知支付系统,或在接收上游异步通知的过程中失败。
三、重构
公司决定重构系统,基于上述频繁问题造成的运维人员成本和时间成本。
技术栈:SpringBoot/SpringCloud kafka Redis vue angluar
该系统采用微服务架构,根据业务将支付系统分为:交易、支付、清算、收银台等模块,前后分离策略。
开发、测试和部署变得非常简单,使用链接日志跟踪中间,调查问题简单方便,在线问题减少了很多。
如图所示:
四、代码整洁之道
4.1 什么是整洁代码?
- 代码逻辑直接,缺陷难以隐藏
- 尽量减少依赖,维护方便,阅读方便
- 完善代码逻辑的分层策略,不冗余
- 有单元测试、性能调
- 只提供一种做一件事的方式
-
4.2 方法和技巧
- 有意义的命名
重构
Code Review逐步改进
-
4.3 有意义的命名
- a、名副其实
b、避免误导
c、区分有意义
变量、函数、参数、类、包命名的原则
public List getThem(){ List list1 = new ArrayList(); for(int[] x : theList) if (x[0] == 4) list1.add(x); return list1; }
我们认为上述代码不是很整洁,至少有以下问题:
(1)theList什么类型的东西?
p style="margin-left:0in;text-align:left;"> ( 2 ) theList 零下标的含义是什么?(3)值4的意义是什么?
(4)怎么使用返回的列表?
运用整洁的技巧之后:
public List getCat(){
List catList = new ArrayList();
for(Cat cat : animals)
if (cat.color == Constants.WIHTE)
catList.add(cat);
return catList;
}
五、重构
1、何谓重构:软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高可理解性,降低成本。
2、为何重构:可读性差、难以维护和修改,冗余甚至出现隐藏bug,带来线上隐患。重构可以改进这些问题,帮忙找出bug,避免问题。
3、何时重构:《三次法则》第一次做某件事时只管去做 第二次做类似的事会产生反感,但无论如何还是可以去做 第三次再做类似的事,就应该重构了。
预备性重构,让添加新功能更容易;帮助理解重构,使代码更易懂;有计划的重构,长期重构等。
4、挑战:延缓新功能开发,代码所有权,分支问题、测试问题。
尝试重构以下代码段,重构之前:
public void scaleToOneDimension(float desiredDimension, float imageDimension){
if(Math.abs(desiredDimension - imageDimension)
重构之后:
public void scaleToOneDimension(float desiredDimension, float imageDimension){
if(Math.abs(desiredDimension - imageDimension)
六、总结
我们在做系统开发编码时,无论是对于系统响应及时性没有前端系统要求那么高,却有业务复杂、数据严谨的性质。还是面对高并发多线程,海量业务,分布式事务,一致性等要求很高的情况。良好的代码质量是保障系统和业务稳定的基础,要求我们从每一个代码、每一个变量、每一个方法做起。
bati收s程序、jsp/html、ThreadPoolTaskExecutor任务
代码冗余、结构混乱、开发困难、测试部署艰难