阿里P8架构师教你kill代码重复/大量ifelse(上)

简介: 阿里P8架构师教你kill代码重复/大量ifelse

本文就教你如何优雅消除重复代码并改变你对业务代码没技术含量的观念。

1 crud 工程师之“痛”

很多 crud 工程师抱怨业务开发没有技术含量,什么设计模式、高并发都用不到,就是堆CRUD。每次面试被问到“讲讲常用设计模式?”,都只能把单例讲到精通,其他设计模式即使听过也只会简单说说,因为根本没实际用过。

对于反射、注解,也只是知道在框架中用的很多,但自己又不写框架,更不知道该如何使用。

  • 设计模式是世界级软件大师在大型项目的经验所得,是被证实利于维护大型项目的
  • 反射、注解、泛型等高级特性在框架被大量使用,是因为框架往往需要以同一套算法应对不同数据结构,而这些特性可以帮助减少重复代码,也是利于维护

提升项目的可维护性是每个 coder 必须注意的,非常重要的一个手段就是减少代码重复,因为重复过多会导致:

  • 修改一处忘记修改另一处,造成Bug
  • 有一些代码并非完全重复,而是相似度高,修改这些类似的代码容易改(cv)错,把原本有区别的地方改成一样

2 工厂+模板方法模式,消除多if和重复代码

2.1 需求

开发购物车下单,对不同用户不同处理:

  • 普通用户需要收取运费,运费是商品价格的10%,无商品折扣
  • VIP用户同样需要收取商品价格10%的快递费,但购买两件以上相同商品时,第三件开始享受一定折扣
  • 内部用户可以免运费,无商品折扣
  • 实现三种类型的购物车业务逻辑,把入参Map对象(K:商品ID,V:商品数量),转换为出参购物车类型Cart。

2.2 菜鸟实现

  • 购物车
  • image.png
  • 购物车中的商品
  • image.png
  • 2.2.1 普通用户
  • image.png
  • 2.2.2 VIP用户
  • VIP用户能享受同类商品多买的折扣。只需额外处理多买折扣部分。
  • image.png
  • 2.2.3 内部用户

免运费、无折扣,只处理商品折扣和运费时的逻辑差异。

image.png

三种购物车超过一半代码重复。

虽然不同类型用户计算运费和优惠的方式不同,但整个购物车的初始化、统计总价、总运费、总优惠和支付价格逻辑都一样。


代码重复本身不可怕,可怕的是漏改或改错。

比如,写VIP用户购物车的同学发现商品总价计算有Bug,不应该是把所有Item的price加在一起,而是应该把所有Item的price*quantity相加。

他可能只修VIP用户购物车的代码,漏了普通用户、内部用户的购物车中重复逻辑实现的相同Bug。


有三个购物车,就需根据不同用户类型使用不同购物车。


使用多if实现不同类型用户调用不同购物车process

image.png

就只能不断增加更多的购物车类,写重复的购物车逻辑、写更多if逻辑吗?

当然不是,相同的代码应该只在一处出现!

目录
相关文章
|
2月前
|
存储 前端开发 架构师
阿里资深架构师带你深入浅出JVM!
JVM = 类加载器(classloader) + 执行引擎(execution engine) + 运行时数据区域(runtime data area)
43 1
|
3月前
|
安全 Java 应用服务中间件
阿里技术官架构使用总结:Spring+MyBatis源码+Tomcat架构解析等
分享Java技术文以及学习经验也有一段时间了,实际上作为程序员,我们都清楚学习的重要性,毕竟时代在发展,互联网之下,稍有一些落后可能就会被淘汰掉,因此我们需要不断去审视自己,通过学习来让自己得到相应的提升。
|
2月前
|
机器学习/深度学习 测试技术 Ruby
YOLOv5改进 | 主干篇 | 反向残差块网络EMO一种轻量级的CNN架构(附完整代码 + 修改教程)
YOLOv5改进 | 主干篇 | 反向残差块网络EMO一种轻量级的CNN架构(附完整代码 + 修改教程)
129 2
|
1月前
|
程序员 Python
类的设计奥秘:从代码到架构的科普全解
类的设计奥秘:从代码到架构的科普全解
13 2
|
1月前
|
消息中间件 并行计算 网络协议
探秘高效Linux C/C++项目架构:让进程、线程和通信方式助力你的代码飞跃
探秘高效Linux C/C++项目架构:让进程、线程和通信方式助力你的代码飞跃
34 0
|
2月前
|
架构师 Java API
阿里P7架构师带你深入剖析synchronized的实现原理
显示锁ReentrantLock的内部同步依赖于AQS(AbstractQueuedSynchronizer),因此,分析ReentrantLock必然涉及AQS。
19 1
|
2月前
|
XML Java 数据库连接
阿里P7架构师带你修炼MyBatis
我们通过一个简单的权限控制需求(RABC,Role-Based Access Control,基于角色的访问控制),来讲解通过XML方式配置MyBatis的基本用法(即select、update、insert、delete等操作的XML配置方式)。
35 0
|
2月前
|
设计模式 微服务
从代码到架构,我的技术成长之路
【2月更文挑战第5天】技术是一门不断进步的艺术,我在不断的实践中,通过学习和思考,逐渐领悟到了代码、架构等方面的知识和技能。在这个过程中,我发现技术并不仅仅是一种工具,更是一种思维方式和生活态度。本文将分享我的技术成长历程和所获得的思考。
27 2
|
2月前
|
存储 监控 安全
阿里云云通信短信服务安全之安全架构
阿里云云通信长期致力于通过多种渠道向客户透明服务相关情况。客户一般可通过阿里云官网提出对阿里云云通信相关资质、服务使用情况、产品说明等信息,我们将7*24小时不间断处理您的建议与咨询。对于客户合理的要求,阿里云云通信服务团队均会及时响应客户的需求。同时,阿里云云通信也在探索更多增加透明度的方式,如对公邮箱、线上查询接口、钉钉服务客户群等。
|
3月前
|
消息中间件 人工智能 Java
面试了一个前阿里P7,Java八股文与架构核心知识简直背得炉火纯青
前几天,跟个老朋友吃饭,他最近想跳槽去大厂,觉得压力很大,问我能不能分享些所谓的经验套路。 每次有这类请求,都觉得有些有趣,不知道你发现没有大家身边真的有很多人不知道怎么面试,也不知道怎么准备面试,哪怕是一些工龄比较长的“老开发”: 有的人明知道有些问题肯定会被问,面试前还不好好准备,结果要么回答得模棱两可,要么答非所问; 有的人则是不知道怎么包装自己的项目经历,结果明明还不错的项目却看上去平平无奇,过后就被面试官忘了; 更有甚者,简历写得花里胡哨,结果一问三不知,简历和经历完全对不上。