业务代码如何才能不再写出大串的if/else?(上)

简介: 业务代码如何才能不再写出大串的if/else?

控制结构?没错!你最爱的 if、for都是一类坏味道,没想到吧?自己竟然每天都沉浸在写坏味道的体验中。

控制语句,到底何错之有呢?

嵌套代码

CR 如下分发我刚写完的一篇博客的案例:

image.png

逻辑很简单,但有多层缩进,for 循环一层,里面有俩 if ,又多加两层。若逻辑再复杂点,缩进岂不是像啤酒肚一般越来越大?


为啥代码会写成这鬼样子呢?


因为你在写流水账,如机器人般地按需求一步步翻译成代码。

代码逻辑肯定没错,但功能实现后,未重新整理代码。


现在就得消除缩进。


从for循环入手,通常for循环处理集合,而循环里处理的是该集合中的元素。所以,可将循环中的内容提取成方法,只处理一个元素:

1.png

这就是一次拆分,分解出来事务 issueArticle 每次只处理一个元素。这就优化了缩进问题:

  • issueArticles 只有一层缩进,这才是正常方法应有的样子
  • 但 issueArticle 还残留多层缩进,待继续优化

if 和 else

issueArticle 里,造成缩进的原因是 if 语句。if 缩进很多时候都是在检查某先决条件,条件通过时,才能执行后续代码。

这样的代码可使用卫语句(guard clause),即设置单独检查条件,不满足该检查条件时,方法立刻返回。

以卫语句取代嵌套的条件表达式(Replace Nested Conditional with Guard Clauses)。

重构后的 issueArticle 函数:

1.png

如今这就只剩一层缩进,代码复杂度大大降低,可读性和可维护性也大大增强。

禁用else

大多数人印象中,if 和 else 几乎比翼齐飞。

else 可以不写吗?

可以!

根据文章信息进行收费:

image.png

不用 else,简单方式就是让每个逻辑提前返回,类似卫语句:

image.png

业务简单的代码,这重构还很轻松,但对复杂代码,就得上多态了。


嵌套、else 语句,都是坏味道,本质上都在追求简单,因为一段代码的分支过多,其复杂度就会大幅度增加。


衡量代码复杂度常用的标准,圈复杂度(Cyclomatic complexity,CC),CC越高,代码越复杂,理解和维护的成本越高。

在CC判定中,循环和选择语句占主要地位。CC可使用工具检查,如Checkstyle,可限制最大的圈复杂度,当圈复杂度大于设定阈值,就报错。

重复 Switch

1.png

实际支付的价格会根据用户在系统中的用户级别有所差异,级别越高,折扣越高。


两个函数里出现了类似的代码,其中最类似部分就是 switch,都据用户级别判断。

这并非仅有的根据用户级别进行判断的代码,各种需区分用户级别场景都有类似代码,而这也是一种典型的坏味道:重复switch(Repeated Switch),通常都是因为缺少一个模型。

解决方案:以多态取代条件表达式(Relace Conditional with Polymorphism)。




目录
相关文章
|
测试技术
|
1天前
|
监控 数据安全/隐私保护 Python
ERP系统中的业务流程优化与重构解析
【7月更文挑战第25天】 ERP系统中的业务流程优化与重构解析
5 0
|
11月前
|
新零售 人工智能 供应链
链动2+1开发运营版丨链动2+1系统开发案例详情/方案项目/功能说明/逻辑规则/源码程序
新零售是指传统零售业与互联网技术相结合,通过数字化、数据化和智能化的手段,重新定义和升级传统零售业态的模式和经营方式。
|
9月前
|
算法 开发者
如何从写业务代码中跳出来,有效提升个人技术能力?
如何从写业务代码中跳出来,有效提升个人技术能力?
|
10月前
|
安全
交易所系统开发详细项目丨案例规则丨方案设计丨步骤需求丨逻辑功能丨源码程序
Requirement analysis and planning: Collaborate with customers to clarify the requirements and goals of the coin exchange system. Understand the customer's business model, target user group, and currencies to be supported by the exchange, and develop a detailed demand plan.
|
10月前
|
安全 区块链
基于OKExChain的去中心化交易平台KSwap开发规则功能/逻辑源码方案
// 购买数字资产 function buy(uint amount) public payable returns (uint remaining) {【更全面的开发源码搭建可看我昵称】
「业务架构」定义业务能力-备忘单
「业务架构」定义业务能力-备忘单
|
运维 监控 NoSQL
浅谈业务开发与非业务开发
讲述业务开发、非业务开发及两者之间区别
|
运维 JavaScript 安全
产品相关 细说软件产品和业务 & 业务过程(流程) & 业务逻辑
产品相关 细说软件产品和业务 & 业务过程(流程) & 业务逻辑
119 0
|
安全 数据可视化 Java
Jmix - 业务系统高效开发的少代码平台
少代码具有低代码产品的所有优点,但是又没有任何低代码产品的缺点。[Jmix.cn ](https://www.jmix.cn/)从定位、产品设计方面把低代码平台的缺陷都抹平并且提升为优点。我们称它为 “少代码”。
456 2
Jmix - 业务系统高效开发的少代码平台