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

本文分享自华为云社区《业务代码如何才能不再写出大串的if/else?》,作者: JavaEdge 。

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

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

嵌套代码

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

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

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

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

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

现在就得消除缩进。

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

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

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

if 和 else

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

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

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

重构后的 issueArticle 函数:

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

禁用else

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

else 可以不写吗?

可以!

根据文章信息进行收费:

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

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

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

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

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

重复 Switch

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

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

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

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

引入 UserLevel 模型,消除 switch:

前面代码即可去掉 switch:

switch 其实就是一堆“ if…else” 的简化写法,二者等价,所以,这个重构手法,以多态取代的是条件表达式,而不仅是取代 switch。

点击关注,第一时间了解华为云新鲜技术~

为啥你写的代码老有大串的if/else?相关推荐

  1. 为啥你写的代码总是这么复杂?

    本文分享自华为云社区<写出的代码复杂度太高?看下专家怎么说>,原文作者:元闰子 . 前言 在进行软件开发时,我们常常会追求软件的高可维护性,高可维护性意味着当有新需求来时,系统易扩展:当出 ...

  2. 老司机写的java代码_菜鸟 or 老司机?写段代码看看吧

    有的小伙伴可能用Python写代码已经非常久了,可能觉得已经是个高手了,那么看看下面这个简单的实现需求,你会写怎样的Python代码呢?通过你写的代码,应该可以大约评估下你到底是菜鸟还是一个老司机了, ...

  3. 天天写业务代码?写业务代码中的成长机会!

    写业务代码有成长机会吗?关于这个问题,答案非常肯定:必须有成长机会.对于大部分公司而言,能够写底层代码或者中间件代码的人总是有限的,写业务代码会面临更高的复杂度. 这里分三个层次来看其中的成长机会. ...

  4. 殷浩详解DDD:如何避免写流水账代码?

    简介: 在日常工作中我观察到,面对老系统重构和迁移场景,有大量代码属于流水账代码,通常能看到开发在对外的API接口里直接写业务逻辑代码,或者在一个服务里大量的堆接口,导致业务逻辑实际无法收敛,接口复用 ...

  5. 朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的8种坑

    我承认,本文的标题有一点标题党,特别是写业务代码,大家因为没有足够重视一些细节最容易调的坑(侧重Java,当然,本文说的这些点很多是不限制于语言的). 1.客户端的使用 我们在使用Redis.Elas ...

  6. 阿里工程师年薪百万,写的代码到底咋样?

    点击"技术领导力"关注∆  每天早上8:30推送 来源| 淘系技术  作者|朱天富 导语:本文是由阿里技术专家,朱天富所写.介绍了阿里是如何提高代码质量的,读完此文你就会对大厂的代 ...

  7. 淘系技术-DDD-聊聊如何避免写流水账代码

    向读者们道歉,由于工作太忙,又对文章质量有追求,所以这篇文章产出速度较慢,但可以向大家保证:文章中的内容都经过了反复实践和踩坑.DDD系列的前几篇文章可以点击文字下方阅读~ DDD系列第一讲 DDD系 ...

  8. 写的函数符号表里没有_你有没有想过,C语言 main 函数到底为啥这么写?

    但凡是学过C语言的人,都知道要先写main函数,然而很多时候我们看到的main函数却各有差异,这究竟是为啥?哪种是对的呢?今天我们就来聊聊main函数. 那么main函数一共有多少个版本呢? 1.ma ...

  9. 揭秘:一个月不摸鱼能写多少代码?

    作者 | 老鱼皮 来源 | 程序员鱼皮(ID:coder_yupi) 猜猜写了多少行?都写了哪些语言呢? 时间过得真是太快了,又到月底了.对于程序员来说,总结还是挺重要的,我也一直保持着一个习惯,就是 ...

最新文章

  1. 一幅图读懂量子力学(数学的判决)
  2. Spring学习(五)——Spring注解(一)
  3. Git bash 终止git log 命令
  4. ML之xgboost:绘制xgboost的二叉树graphviz的两种方法代码实现
  5. 【深度学习】Keras vs PyTorch vs Caffe:CNN实现对比
  6. java中的方法在哪里_Java中的本机方法是什么,应在哪里使用?
  7. Python刷题-4
  8. cas sso 整合记录
  9. linuxC编程实战 my_server.c例子问题总结
  10. 利用OpenFileDialog 获取图片存储到数据库中
  11. 书信用语“商祺”是的意思
  12. 用WIN PE通过修改系统注册表修复因盘符错乱而导致系统无法启动问题
  13. MVVM框架的了解与使用
  14. Endnote 域代码已更改
  15. C语言————输出It‘s a computer中的computer
  16. Spring boot 整合Druid框架不支持瀚高,报dbtype not support
  17. 【linux内核分析与应用-陈莉君】物理内存分配与回收机制下
  18. python turtle画表情包
  19. ERROR: cannot launch node of type [turtlesim /turtlesim_node]: turtlesim
  20. 在DNS服务器上动态注册失败,活动目录向DNS注册SRV记录不成功的原因

热门文章

  1. 学生开源项目_吸引学生加入您的开源项目的9种方法
  2. (13)Vue.js 自定义指令
  3. (22)css3新增边框圆角属性border-radius
  4. (4)HTML标签补充和HTML转义字符
  5. ES6(ECMAScript2015)/01/ES6简介
  6. es6 实例:模块的 Singleton 模式
  7. kelvin模型蠕变方程_第二章:黏弹性与波传播——2.4 力学模型和波传播
  8. 视觉SLAM笔记(54) Ceres 操作后端优化
  9. CAN笔记(13) STM32-M4 bxCAN
  10. mysql 如何磁阵_Raid教程 全程图解手把手教你做RAID