面试官:代码中 if…else 过多的问题,这几种方案帮你优化代码
前言if...else 是所有高级编程语言都有的必备功能 。但现实中的代码往往存在着过多的 if...else 。
虽然 if...else 是必须的,但滥用 if...else 会对代码的可读性、可维护性造成很大伤害,进而危害到整个软件系统 。
现在软件开发领域出现了很多新技术、新概念,但 if...else 这种基本的程序形式并没有发生太大变化 。
使用好 if...else 不仅对于现在,而且对于将来,都是十分有意义的 。今天我们就来看看如何“干掉”代码中的 if...else,还代码以清爽 。
问题一:if...else 过多问题表现
if...else 过多的代码可以抽象为下面这段代码 。其中只列出5个逻辑分支,但实际工作中,能见到一个方法包含10个、20个甚至更多的逻辑分支的情况 。
另外,if...else 过多通常会伴随着另两个问题:逻辑表达式复杂和 if...else 嵌套过深 。
对于后两个问题,本文将在下面两节介绍 。本节先来讨论if...else过多的情况 。
if (condition1) {} else if (condition2) {} else if (condition3) {} else if (condition4) {} else {}
通常,if...else过多的方法,通常可读性和可扩展性都不好 。
从软件设计角度讲,代码中存在过多的if...else往往意味着这段代码违反了单一职责原则和开闭原则 。
因为在实际的项目中,需求往往是不断变化的,新需求也层出不穷 。所以,软件系统的扩展性是非常重要的 。而解决if...else过多问题的最大意义,往往就在于提高代码的可扩展性 。
如何解决
接下来我们来看如何解决 if...else 过多的问题 。下面我列出了一些解决方法 。
- 表驱动
- 职责链模式
- 注解驱动
- 事件驱动
- 有限状态机
- Optional
- Assert
- 多态
对于逻辑表达模式固定的if...else代码,可以通过某种映射关系,将逻辑表达式用表格的方式表示;再使用表格查找的方式,找到某个输入所对应的处理函数,使用这个处理函数进行运算 。
适用场景
逻辑表达模式固定的if...else
实现与示例
if (param.equals(value1)) {doAction1(someParams);} else if (param.equals(value2)) {doAction2(someParams);} else if (param.equals(value3)) {doAction3(someParams);}// ...
可重构为Map<?, Function<?> action> actionMAppings = new HashMap<>(); // 这里泛型 ? 是为方便演示,实际可替换为你需要的类型// When initactionMappings.put(value1, (someParams) -> { doAction1(someParams)});actionMappings.put(value2, (someParams) -> { doAction2(someParams)});actionMappings.put(value3, (someParams) -> { doAction3(someParams)});// 省略 null 判断actionMappings.get(param).apply(someParams);
推荐阅读
- SUV|奇瑞找到新设计师了?捷途大圣官图再放送:够硬!
- 附代码 微信小程序实例:如何获取和渲染数据
- 最基础的Python知识,学会这些已足够你开始写Python代码了
- python爬取贴吧网页源代码
- 绕过雷蛇官网的动态验证码
- 头条上的官方教程,我学到东西了
- 官宣!易建联收获19-20赛季常规赛MVP 周琦一分惜败
- 你还不知道这些面试技巧?来听听hr的建议
- 留学生|月薪6k面试受歧视,海归血泪控诉悔不当初,留学已不是最佳选择
- 一款让你拜服的百度官方数据分析工具