面试官:代码中 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 过多的问题 。下面我列出了一些解决方法 。

  1. 表驱动
  2. 职责链模式
  3. 注解驱动
  4. 事件驱动
  5. 有限状态机
  6. Optional
  7. Assert
  8. 多态
方法一:表驱动介绍
对于逻辑表达模式固定的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);


    推荐阅读