出自:公众号【编程一生】

原文:https://mp.weixin.qq.com/s/y4DNrH3iqWns25__kFAQpQ

一、背景

程序的定义:程序=数据+算法+接口

二、常用技巧

技巧1 - 按目标设计接口做幂等设计

- 场景

背景:做任务赚积分。前端发出增加积分请求,如果收不到响应会重试。

后台开发人员:怎么判断是重试还是另一次请求?

解决方案:接口定义中需要传入原来积分是多少,增加到多少。开发人员直接将目标结果入库。

疑问:那实际生产环境发现了原来积分一样,增加到多少不一样的结果怎么办?

答疑:这说明上线的产品中肯定有漏洞或bug。怎么办?改bug呗!

- 解析

幂等性设计的定义:一次和多次请求某一个资源应该具有相同的副作用。直白点讲就是多次重试可以多次查询,但是修改更新应该只进行一次。

作为开发正确的观念应该是外部调用失败是常态,并且失败之后必然有重试。

不要靠巧合编程  --《程序员修炼之道》

技巧2 - 多版本并发控制解决并发问题

- 场景

背景:上文中的做任务赚积分,后台收到了增加积分请求。

开发人员:为了避免重试,我该怎么写代码呢?

解决方案:update XXX set score=XX where score=X

- 解析

多版本并发控制MVCC(MultiVersion Concurrency Control)的定义:该策略主要使用update with condition(更新带条件来防止)来保证多次外部请求调用对系统的影响是一致的。这也是「乐观锁」的主要思想。

乐观锁的定义:假设最好的情况,数据在变更的时候不会被别人更新,如果更新了,某个值就会改变。所以就用这个值来作为判断条件,只有条件为真才更新成功。

总是为并发进行设计  --《程序员修炼之道》

技巧3 - 预判断准入控制避免「箭头型」代码

- 场景

背景:上文中后台收到了增加积分请求,传入了一个负数的积分。

开发人员:我就if 正数 才往下执行就好了呀?

结果:一层层的判断下来,代码变成这个样子。

疑问:怎么解决这种复杂的「箭头型」代码问题呢?

答疑:「卫语句」在预判断时做准入控制。

- 解析

卫语句(guard clause)的定义:先对异常情况做检查,异常则直接返回。

最终一个请求被完美的分成预判断检查和正式执行两个部分,逻辑清晰,简单明了。

早重构,常重构  --《程序员修炼之道》

技巧4 - 异步设计分离响应和执行

- 场景

背景:上文的增加积分,并发量太大,因此采用了队列设计,大量请求排队等待数据库变更。

开发人员:这样后台接口部分很容易都在等着响应,服务被拖死。

解决方案:准入校验做充分,请求放到队列里后直接给用户返回操作成功。

疑问:万一最后失败了呢?

答疑:知道失败了还不修数据吗?数据补偿保证最终与对用户承诺一致撒。

- 解析

1/3/5秒原则:在1s以内得到响应,用户会觉得系统响应很快,体验非常好;1-3秒得到响应,用户可以接受,体验还不错;3-5秒才响应,用户就感觉慢了,体验有点糟糕;一旦响应超过5秒,用户就会认为是个失败的体验,选择离开或重新发起请求。

三、总结

思考!你的工作!  --《程序员修炼之道》

java设计技巧_程序常用的设计技巧相关推荐

  1. 网页成品——手表商城网站模板源码(17页) web期末作业设计网页_手表商城网页设计作业成品

    HTML5期末大作业:手表商城网站设计--手表商城网站模板源码(17页) web期末作业设计网页_手表商城网页设计作业成品 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物 ...

  2. HTML5期末大作业:手表商城网站设计——手表商城网站模板源码(17页) web期末作业设计网页_手表商城网页设计作业成品

    HTML5期末大作业:手表商城网站设计--手表商城网站模板源码(17页) web期末作业设计网页_手表商城网页设计作业成品 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物 ...

  3. 网页作业HTML+CSS+JS大作业——汽车租赁(47页) 加特效 web期末作业设计网页_汽车大学生网页设计作业成品

    HTML+CSS+JS大作业--汽车租赁(47页) 加特效 web期末作业设计网页_汽车大学生网页设计作业成品 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电器. ...

  4. HTML+CSS+JS大作业——汽车租赁(47页) 加特效 web期末作业设计网页_汽车大学生网页设计作业成品

    HTML+CSS+JS大作业--汽车租赁(47页) 加特效 web期末作业设计网页_汽车大学生网页设计作业成品 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电器. ...

  5. 51单片机的简易计算器设计(仿真+程序+原理图+PCB+设计报告)

    本设计: 基于51单片机的简易计算器设计(仿真+程序+原理图+PCB+设计报告) 仿真:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 编号S0001 芯片可以替换为 ...

  6. FPGA开发经验谈-FPGA 设计的四种常用思想与技巧(二)

    串并转换设计技巧 串并转换是 FPGA 设计的一个重要技巧,它是数据流处理的常用手段,也是面积与速度互换思想的直接体现.串并转换的实现方法多种多样,根据数据的排序和数量的要求,可以选用 寄存器. RA ...

  7. 引物设计软件_你的引物设计进行得如何了?这份PCR引物设计及软件使用技巧供你参考...

    点击蓝字 关注我们 自从1985年Karny Mullis发明了聚合酶链式反应以来,PCR技术已成为分子生物学研究中使用最多.最广泛的手段之一,而引物设计是PCR技术中至关重要的一环.使用不合适的PC ...

  8. 用JAVA写一个画图程序(课程设计)

    1.设计思路 首先我直接去了Windows自带画图程序去实践模拟,看看具体方法,进行了布局和按钮的思考. 容器顶层放工具栏,工具栏中存放图形按钮.工具按钮.颜色按钮.对于图形按钮,存放在垂直的Box中 ...

  9. java课程设计连连看_连连看_java课程设计报告

    连连看_java课程设计报告 <连连看> 项目设计报告 专 业: 软件工程 班 级: 07级2班 姓 名: 二00九 年 七 月 二十一 日 目 录 1.项目设计目的.意义-------- ...

最新文章

  1. 小甲鱼-累加数据段中的前3个字型数据【不对的话,请指教!】
  2. RocketMQ NameServer启动要初始化哪些参数
  3. Ubuntu 18.04 更改静态IP
  4. 五、curator recipes之选举主节点Leader Latch
  5. 作为大数据和云计算学习的一个序吧
  6. 【时间序列】使用微软Power BI进行时间序列预测
  7. Apache ECharts各种图表页面展示
  8. 是什么的简称_被简称为“中大”的大学,为什么没有别的大学和它争名字?
  9. Codeforces Round #725 (Div. 3) G. Gift Set 二分
  10. Java虚拟机学习集锦是我攒来的,带你碾压面试官!
  11. 实践案例丨Pt-osc工具连接rds for mysql 数据库失败
  12. TensorFlow2.0:索引和切片(2)
  13. ASP.NET验证控件详解
  14. 开课吧Java课堂之动态方法调度
  15. es6.0 java,es6.0.0源码idea启动问题
  16. 【图像隐写】基于matlab DCT数字水印嵌入+攻击+提取【含Matlab源码 1758期】
  17. linux五笔输入法制作_在linux下制作拼音五笔输入法
  18. Spring Boot---(10)SpringBoot整合RabbitMQ
  19. 酷派改变者S1(C105/C105-6/C105-8) 解锁BootLoader 并刷入recovery root
  20. linux编译文件 no such,Linux中编译或安装程序时提示No such file or directory

热门文章

  1. 7月更新速递 | 产品实验室N+1,EasyV For Unreal上线!
  2. 小程序 + 电商,玩转新零售
  3. CF833B The Bakery
  4. 链表.艾氏塞法最终优化版
  5. php最短的代码实现爱情,WordPress Shortcode(短代码):完全指南
  6. 企业即时通信软件有哪些?要如何选择?
  7. 微博pythonurllib登陆是什么_python模拟登录新浪微博抓取数据(cookielib和urllib2)
  8. 最基础_负数二进制转换
  9. 简单说说一个系统从单机到分布式到演变
  10. 高通简单的启动流程说明