• 做一个幸福的人,读书,旅行,努力工作,关心身体和心情。
  • 不管有没有人爱,也要努力做一个可爱的人。不埋怨谁,不嘲笑谁,也不羡慕谁,阳光下灿烂,风雨中奔跑,做自己的梦,走自己的路。

如何优雅的解决过多elseif分支问题

C/C++ lcq 4年前 (2015-04-24) 464次浏览 0个评论

事情原因是这样的,我在读我们的项目代码的时候,发现源码中很多处都有多个else if分支的情况,我随便截取一段代码处,如下图所示(注意,我没有把全部的else if分支截取出来,是因为else if超过了屏幕所能显示的全部)

反正这else if大概的完成的功能是根据一个枚举类型得到一个字符串。相应的,肯定还要写另外一个函数,通过字符串获取一个枚举类型。

首先,我要说明一下,这么写对于代码来说,可读性挺好,可维护性也比较高。但是我之所以想找一个更好的办法来解决,是因为我每次看到这一大段一大段的代码的时候,我的心情就不好了,总想把代码的行数降下来。。。额,可能是有一点代码洁癖吧。

闲话少说,来说说我想到的解决思路。最开始想到的是当然是使用switch语句代替这else if。能看到最直观的一个好处就是代码排版要比else if要好看,而且四行代码能变成三行。可使用switch语句有一个问题,switch语句只能case整型之类的变量,无法case字符串string。所以,自然这switch替代方案被我抛弃了。

由于这是一一对应的关系,紧接着我自然想到了map。因为使用map,可以很方便的通过key找到value,也很容易通过遍历value,找到相应的key。当然,map中的多个key可以对应同一个value。我们项目中的key与value是一一对应的。但没什么,至少使用map能解决我们的问题。然后,我写了一个类,替代了这一长段的else if。注意:我这个是在Qt的开发环境下写的。在QtCreator下面编译时没什么问题的。如果想在Visual Studio下面编译使用,请将QMap替换成STL中的map,自己去做相应的修改。下面是我写的类。

具体使用,由于我使用的是静态变量。所以如果你想查找”luchenqun”对应哪个key,调用MapTest::getKey(“luchenqun”);即可。如果你想查找8888对应的value是什么,调用MapTest::getVaule(8888);即可。

当然,这也算不得是一种什么优雅的解决方式。算是提供一种思路。大家喜欢那种就用那种,反正我是比较喜欢用map那种思路。。。呵呵。

 


参考资料:

1、过多if-else分支的优化

2、STL Map

3、封装 if/else、swith/case 及 while (这篇博客没太看懂)

4、c++中静态const型map成员变量的初始化


乐趣公园 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明如何优雅的解决过多elseif分支问题
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址