控制结构?没错!你最爱的 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. 朱晔的互联网架构实践心得S2E1:业务代码究竟难不难写? | 掘金年度征文

    注意,这是我的架构实践心得的第二季的系列文章,第一季有10篇你也可以回顾. 最近我一直在思考几个问题: 业务代码究竟难不难写? 一直开发业务代码是不是完全学不到东西? 5年+开发经验的老程序员的价值在 ...

  3. 代码规范、如何写出好代码

    转载请注明出处: http://blog.csdn.net/gane_cheng/article/details/52152497 http://www.ganecheng.tech/blog/521 ...

  4. python代码大全p-如何写出优雅又地道的Python代码?【转载】

    在Python社区文化的浇灌下,演化出了一种独特的代码风格,去指导如何正确地使用Python,这就是常说的pythonic.一般说地道(idiomatic)的python代码,就是指这份代码很pyth ...

  5. 如何写代码,才能越写越轻松?

    2019独角兽企业重金招聘Python工程师标准>>> 毕业后一直在现在这家小公司,从什么都不懂,到现在可以单独做web项目,有了一些进步,但现在又遇到了新的问题,下边这段代码或许能 ...

  6. 弹出框口登录php代码,如何用JQuery写出登录弹出框

    类似百度的登录弹出框,可用jquery的fadeIn(),hide(),show(),slideDown()等动画函数实现,一下为html5 代码: $(document).ready(functio ...

  7. pythonic 代码_怎样才能写出Pythonic 的代码?

    近来,身边的一些Python 大牛们老是提到一个很时髦的词:Pythonic,但却很少人说得清楚它是个什么意思,搞得新童鞋一头雾水: 在我们周围有很多资深的工程师,用其他语言写过很多的代码,做过很多项 ...

  8. python用什么软件编程1001python用什么软件编程-怎样才能写出 Pythonic 的代码 #P1001#...

    L = [ i*i fori inrange(5) ] forindex, data inenumerate(L, 1):print(index, ':', data) 去除 import 语句和列表 ...

  9. python好学吗1001python好学吗-怎样才能写出 Pythonic 的代码 #P1001#

    L = [ i*i fori inrange(5) ] forindex, data inenumerate(L, 1):print(index, ':', data) 去除 import 语句和列表 ...

最新文章

  1. gulp-sass_如果您是初学者,如何使用命令行设置Gulp-sass
  2. iar代码优化影响运行速度吗_Java 性能优化:教你提高代码运行的效率
  3. 安川交流伺服电机的驱动
  4. postgresql测试题_PostgreSQL练习
  5. 阿里云一键建站产品,阿里云自营建站-中小企业建站首选
  6. oracle表还原truncate,Oracle数据库执行truncate table操作后如何逆向恢复之前的状态...
  7. 文件大小超过配置限制(2560000),代码洞察功能不可用怎么办?
  8. java测试用例怎么写_Java测试用例编写规则
  9. 木马手工查杀和隐藏控制技术分析
  10. 【maven】Unable to find javadoc command: The environment variable JAVA_HOME is not correctly set.
  11. 【Python】 matplotlib 以pdf形式保存图片
  12. DIMM DDR 区别和联系
  13. SSM+网上书店管理系统 毕业设计-附源码082255
  14. 毕业论文找文献是个问题,我直接用python把全网文献爬了一遍,这波就很舒服
  15. 关于video++,jsrun,有道笔记等的感想
  16. java utf-8 转 gbk / gbk 转 utf-8
  17. UI复习练习——防QQ的登录下拉列表
  18. GNVM版本下载太慢用淘宝镜像速度提百倍哈
  19. SecureFx设置密钥登陆
  20. 告诉你一个真实的美国

热门文章

  1. 一亩三分地 新手上路 网站规则 - 满分5大米(适用于所有用户) 答案 新手入门
  2. anaconda更改虚拟环境安装位置
  3. 利用Lambda表达式从实体集合中筛选出符合条件的实体集合
  4. android----Android语音播报的两种简单实现
  5. # Codeforces Round #548 (Div. 2)C Edgy Trees
  6. 使用Datadog在docker环境下监控Java, Tomcat, Nginx, Kfaka, ZooKeeper
  7. js逆向案例-obsfuscator混淆
  8. 老九学堂之分布式设计教材
  9. 锦城学院计算机系考研,考研心得分享
  10. vue导出excel加一个进度条_vue项目中如何把数据导出成excel文件