有时候if判断会写很多,代码写很长
如果if判断的层次很简单,只是if-else这种结构,读起来不会觉得有多么困难,只是很长而已;麻烦的是有很多嵌套(当然这是可以优化的);
优化的好,其实并不会太影响阅读;但对于有强迫症的人,if写太多,心理就是觉得不舒服。
网上有很多利用设计模式的方法处理过多的if判断的的文章。只是要写很多类,构造函数什么的,麻烦!
利用C++中的function,pair,vector和lambda表达式
最近我也有减少if的冲动,看到一个叫“麦片说”的人在2013-11-30写的博客(http://ju.outofmemory.cn/entry/56050),采用C++11新特性,将判断和处理封装成一对函数,将这一对函数放入链表中,通过遍历链表来实现判断,确实代码量减少了,逻辑清晰了,但该文章的代码,在VS2010下编译未通过。
现将我在VS2010环境下编译通过的代码贴出,留作速查;只是在细节上做了变化,思路完全未改变。
// testProcessIfelse.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <cstdio>
#include <vector>
#include <functional>
using namespace std;
//helper function
typedef std::pair<std::function<bool(int)>
,std::function<void(void)>> IfDoPair;
//指向类型为IfDoPair的对象的指针P_IfDoPair;
typedef std::shared_ptr<IfDoPair> P_IfDoPair;
typedef std::vector<P_IfDoPair> IfDoContainer;
IfDoContainer allcases;
template<typename F1, typename F2>
void add_case(F1& judgeFunc, F2& doFunc)
{
auto ifDoPair = std::make_shared<IfDoPair>(judgeFunc,doFunc);
allcases.push_back(ifDoPair);
}
int _tmain(int argc, _TCHAR* argv[])
{
//add all cases
add_case([](int nPara1){return nPara1 > 0 && nPara1<= 10;},
[](){std::cout<<"show 1";});
add_case([](int nPara1){return nPara1 > 11 && nPara1<= 20;},
[](){std::cout<<"show 2";});
//replace if-else
int nJudgeNumber = 15;
for(IfDoContainer::iterator it = allcases.begin(); it!=allcases.end(); it++)
{
if((*it)->first(nJudgeNumber))
{
(*it)->second();
}
}
int nPause = 0;
std::cin>>nPause;
return 0;
}
当然具体问题还需具体研究,没有通用公式
由于要通过vector进行遍历,所以每一个判断函数的参数个数和类型应当保持一致。如果每一个判断的条件都有很大差异的话,上述方法应该作用没有那么明显。当然分离判断与处理为2个不同的函数的思路是非常有用的,以后可以举一反三。请注意,我是在VS2010下,创建控制台程序测试的,需要了解C++11的这几个新特性。