Missmiaom
4/15/2020 - 6:35 AM

less if else

表驱动

解决方法: 使用映射关系,将条件表达式和处理函数一一对应并进行注册。使用时根据条件表达式,找到对应的处理函数进行处理。

适用场景:条件表达模式固定的 if else。

职责链模式

解决方法:使用链表将功能组件串联起来,同时将条件判断权交给每个功能组件,形成完整的功能。

适用场景:条件表达式灵活多变,没有统一的形式。

职责链模式通常有外部控制和内部控制两种控制模式:

  • 外部控制模式由调用者控制组件顺序和调用关系,使用更为方便
  • 内部控制模式由组件本身决定下一个调用组件,使用更为灵活

事件驱动

解决方法:使用观察者模式,关联不同的事件类型和对应的处理机制。

适用场景:表驱动方式的补充。

与表驱动的不同

  • 表驱动通常是一对一的关系;事件驱动通常是一对多。
  • 表驱动中,触发和执行通常是强依赖;事件驱动中,触发和执行是弱依赖。

有限状态机

解决方法:可以看做是表驱动的一种,当前状态和事件两者组合与处理函数的一种对应关系。处理成功之后还会有一个状态转移处理。

适用场景:存在状态和状态流转的场景,如协议栈、订单处理等功能中。

消除 Null 判断

解决方法:引入响应的 Null 子类,实现相应的函数,屏蔽 Null 对象的影响

适用场景:移除大量的判空操作

可以使用 C++17 中的 std::optional<T> 来替代 if-else

补充

《重构》 中关于条件表达式的简化