编码经验杂记

  1. 友好的表单业务的完整流程
    页面防止重复提交–> 页面表单验证–>展示loading图–>网络通信问题反馈处理 -->后台防止重复提交–> 后台数据验证–>后台业务处理–>保存数据(处里空格等)–>日志记录错误的详细信息–>展示详细处理结果和说明–>页面根据处理结果引导客户进行业务跳转。

  2. 业务优化点

    • 尽量减少循环
    • 重用资源,充分利用缓存(链接,不易变化的数据)
    • 尽量减少异步行为,让流程各步骤串行化
    • 充分利用索引
    • 尽量保证流程单一,不要掺杂其他流程。(例如,送券的流程掺杂统计过程)
    • 对于耗时的操作且不需要同步返回的,放在线程中执行
    • 流程中尽量减少系统间耦合
    • 在保证事务的情况下尽量把计算结果的流程和使用结果的流程分开
    • 表设计尽量减少多表关联查询,让不变的字段冗余
    • 尽可能的创建可重用对象
    • 并发是高效的,锁降低了并发的效率,甚至让并发变成顺序执行,失去了并发的意义。所以最好的并发是无锁的并发,应该尽量去掉锁。
  3. 编码注意事项

    • 获取一条记录后,如果没有,是不是应该新建一个,应该慎重考虑。
    • 改变代码顺序需要及其慎重
    • 并发环境要充分考虑所使用工具类是否线程安全
    • 有的接口是基于当前时间的,所以下次调用同样的参数可能就会不幂等,一种解决方法是把当前时间也作为参数传入。
    • 处理批量数据时,要处理好单个错误对全部数据的影响
    • 新加查询字段时,慎重通过判断null来增加查询条件,这很可能会改变接口的语义
      public ServiceResponse<PaginationResult>  getChannelSkuMappingPageList(@Valid ChannelSkuMappingPageRequest  req) {
              if (req.isEmpty()) {
                  return ResponseTool.success();
              }
      //这个是新加的字段,先前的语义是 没有这个字段也就是null的时候查询所有,如下代码会改变原来的语义
              if(req.getContainSyncProductPlatform()==null){
                  req.setNotPlatformCodes("1,3");
              }
      }
      
  4. 业务流程的稳定性

    • 所有参与的接口都必须严格幂等,这样才能重复调用来最快的恢复失败部分
    • 每次业务都应有唯一标识,参与的接口都被追踪和记录,这样才能知道业务走到了哪里,可以最快的进行恢复
    • 每个错误都应被严格记录日志和通知相关人员,这样才能最快发现问题
    • 每个异步任务都应记录进度和状态
  5. 拆分服务的界限的一个考量就是可能的访问数量,像c端访问量通常远远大于b端,所以应该把c端,b端分开

  6. 流式编程

    • 流式编程减少了循环的次数,提升了效率,相当于在一个循环里处理所有数据。
    • 考虑流的带宽,可以只是一个对象的带宽,也可以是10个对象的带宽。如果总共需要处理10个数据,带宽为1,如果数据来自数据库,那么就要有10次io,就不如一次10个数据,只需要一次io。所以带宽的大小依情况而定
  7. 抽象与框架

    • 抽象类或接口是框架的骨架,像房子的梁柱,通过梁柱之间的交互构成了房子的基本结;实现类是某种具体的梁柱,比如钢的,木头的等
    • 抽象类也可以被抽象类继承,这时有个问题,一个框架是不是一定以最上层的抽象类做骨架,答案是否定的,就像spring-boot实际上使用的是ConfigurableApplicationContext作为骨架,并不是最上层的ApplicationContext。
    • 骨架抽象类的实现类,往往不直接与其他骨架交互,它的方法除非通过强转的方式暴露给其他骨架,否则往往只是内部使用。
    • 每个框架在集成其他框架的时候,都会为其它框架提供一个访问入口类(往往会使用外观模式,类似微服务的网关),所以这里有个问题,要提供一个什么样的类,或者说为其他框架提供多大的访问权限。这个问题一般会通过继承的方式来处理。
    • 继承的层次越深,它的能力也就越强,权限也就更大,所以一个框架在集成其他框架的时候,对其它框架提供的层次类一般比自己使用的要高(能力要低),就像spring-boot自己使用的是ConfigurableApplicationContext,而对外提供的是ApplicationContext
    • 综上所述如果你要看一个框架的整体流程,只需要看骨架类,没必要细看其实现
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值