c++ - 提取方法时返回语句

标签 c++ refactoring

假设您有一个很长的方法,如下所示:

int monster()
{
    int rc = 0;

    // some statements ...

    if (dragonSlayer.on_vacation()) {
        cout << "We are screwed!\n";
        if (callTheKing() == true)
            return 1;
        else
            return 2;
    } else {
        cout << "We are saved!\n";
        slayTheDragon();
    }

    // rest of long method...

    return rc;
}

我正在研究代码的骨架化。我想把屠龙部分提取出来

int handleDragon() {
    if (dragonSlayer.on_vacation()) {
        cout << "We are screwed!\n";
        if (callTheKing() == true)
            return 1;
        else
            return 2;
    } else {
        cout << "We are saved!\n";
        slayTheDragon();
    }

    return 0; // ?
}

并将 monster() 中的代码替换为对 handleDragon() 的调用。

但是有个问题。该部分中间有一个 return 语句。如果我保留处理 handleDragon() 的返回码的部分,它将在 big 方法中保留垃圾。

除了使用异常,有没有一种优雅安全的方式将这段代码重构出怪物方法?应该如何处理这些类型的情况?

最佳答案

如果屠龙者可用,则从 handleDragon 方法返回 0:

int handleDragon() {
    if (dragonSlayer.on_vacation()) {
        cout << "We are screwed!\n";
        if (callTheKing() == true)
            return 1;
        else
            return 2;
    } else {
        cout << "We are saved!\n";
        slayTheDragon();
        return 0;
    }
}

然后回到monster方法,如果返回值大于零,返回那个值,否则继续:

// some statements ...

int handleDragonResult = handleDragon();
if (handleDragonResult > 0) {
    return handleDragonResult;
}

// rest of long method...

您还应该记录 handleDragon 方法,以解释返回的值。

关于c++ - 提取方法时返回语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3134681/

相关文章:

c++ - const char*、const char(&)[N] 和 std::string 的函数重载

java - 使用 lambda 表达式分割 csv 文件

refactoring - 任务 ToObservable 错误处理

C++ 语法错误

c++ - 使用基类的派生类中定义的类型

design-patterns - 重构以使用构建器模式或伸缩构造器模式

ruby - 用代码包围 Ruby 方法

c# - 以编程方式创建和执行合并复制

c++ - Electron 应用程序和 Win32 native 桌面应用程序之间的进程间通信

c++ - 编译错误c++(需要替换),线程有问题吗?