代码中的if…else杂谈3
if-else链过长的几个解决方法。
map映射
老代码中经常见到下面这种写法
1 | |
- 这么写代码通常伴随着大量的复制粘贴,如果代码中不存在大量重复代码,这么写也可以接受。
- 如果后期经常需要增加
else-if,这么写多少有点不妥。
解决
上述问题可以通过map映射的方式解决:
1 | |
1 | |
- 所有逻辑在最开始就已经写好,后期增加可能只需要修改
ANIMAL_MAP,比使用if-else更加一目了然。 - 将
showInfo的参数由字符串改为枚举,更方便在编译器发现问题。
界面状态的复杂逻辑
可以借助QStackedWidget,QButtonGroup与std::vector、std::map配合来处理一些界面上的复杂逻辑。

如上图所示,切换第一行的按钮,会改变第二行按钮的可点击状态,点第二个按钮会执行相关操作:
mainwindow.h
1 | |
mainwindow.cpp
1 | |
运行结果如图所示:

- 配合
animalButtonGroup_和skillButtonGroup_两个QButtonGroup,界面从创建到交互所需信息都包含到了SKILL_VECTOR、ANIMAL_INFO_VECTOR中。 - 第二行按钮的置灰逻辑只有12行代码,逻辑清晰且不受按钮个数增加的影响。
- 注释部分代码更像是日常使用(其上方代码只是为了演示),配合Qt反射实现的简单工厂模式(参见
简单工厂模式与Qt类反射2)能使代码更加符合开-闭原则。
职责链
职责链模式有时也能减少该类if-else的出现。
多态、工厂模式
多态、工厂模式也是解决该类问题的有效方法,具体可参见简单工厂模式与Qt类反射2。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!