代码中的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 协议 ,转载请注明出处!