有没有更好的方法来使此软件流

时间:2019-01-18 13:37:40

标签: if-statement c++14

我有几个函数可以尝试评估一些数据。每个函数如果可以成功评估数据,则返回1;否则,则返回0。这些函数一个接一个地调用,但是如果一个返回值1,则执行应该停止。

示例函数如下:

int function1(std::string &data)
{
    // do something
    if (success)
    {
        return 1;
    }
    return 0;
}

int function2(std::string &data)
{
    // do something
    if (success)
    {
        return 1;
    }
    return 0;
}
... more functions ...

组织此流程的最清晰方法是什么?我知道我可以使用if语句:

void doSomething(void)
{
    if (function1(data))
    {
        return;
    }
    if (function2(data))
    {
        return;
    }
    ... more if's ...
}

但是这似乎很漫长,并且有很多需要输入的if。我想到的另一种选择是像这样从函数的返回0调用下一个函数

int function1(std::string &data)
{
    // do something
    if (success)
    {
        return 1;
    }
    return function2(data);
}

int function2(std::string &data)
{
    // do something
    if (success)
    {
        return 1;
    }
    return function3(data);
}
... more functions ...

使调用程序更整洁,因为您只需要调用function1()即可根据需要进行评估,但似乎会使代码难以维护。如果需要在流程的中间插入另一项检查,或者调用的顺序发生变化,则需要更改新检查之后的所有功能以解决该问题。

我错过了实现这种程序流程的一些智能清晰的c ++方法,还是这些方法中最好的一种。目前,我倾向于使用if方法,但感觉好像缺少一些东西。

2 个答案:

答案 0 :(得分:1)

void doSomething() {
    function1(data) || function2(data) /* || ... more function calls ... */;
}

逻辑或运算符||恰好具有您需要的属性-从左到右求值,并在一个操作数为true时立即停止。

答案 1 :(得分:0)

我认为您可以创建一个lambda向量,其中每个lambda包含有关如何评估数据的特定过程。像这样的东西。

std::vector<std::function<bool(std::string&)> listCheckers;

listCheckers.push_back([](std::string& p_data) -> bool { return function1(p_data); });
listCheckers.push_back([](std::string& p_data) -> bool { return function2(p_data); });
listCheckers.push_back([](std::string& p_data) -> bool { return function3(p_data); });
//...and so on...

//----------------------------- 
std::string theData = "Hello I'm a Data";

//evaluate all data
bool bSuccess = false;
for(fnChecker : listCheckers){
    if(fnChecker(theData)) {
        bSuccess = true;
        break;
    }
}

if(bSuccess ) { cout << "A function has evaluated the data successfully." << endl; }

您可以根据需要在运行时通过以下方式修改列表:外部对象,文件中的配置设置等...