函子和代码分解

Functors and code factoring

本文关键字:分解 代码      更新时间:2023-10-16

假设我有一些代码,看起来像这样:

void doTasksAndStuff()
{
    // Do stuff
    ...
    // Do task
    ...
    // Do stuff
    ...
    // Do same task
    ...
    // Do stuff
    ...
}

由于任务执行了两次,我认为最好对相应的代码进行因式分解:

void doTask()
{
    // Do task
    ...
}
void doTasksAndStuff()
{
    // Do stuff
    ...
    doTask();
    // Do stuff
    ...
    doTask();
    // Do stuff
    ...
}

现在,如果我这样写呢:

void doTasksAndStuff()
{
    auto doTask = []()
    {
        // Do task
        ...
    };

    // Do stuff
    ...
    doTask();
    // Do stuff
    ...
    doTask();
    // Do stuff
    ...
}

由于doTask()只在函数doTasksAndStuff()中调用,在我看来,这是一种不污染任何命名空间的代码分解的干净方式,但这是这两种分解方式之间的唯一区别吗?

特别是,性能如何?内联呢?

性能应该大致相同。lambda的最大优点(和区别)是可以在闭包中捕获局部变量。如果你把它作为一个命名函数,那么你必须传递任务中使用的所有局部变量。

请注意,另一种方法是使用局部结构体,您可以将其视为穷人的lambda。