如何优雅的避免代码嵌套(C++)

46 阅读2分钟

表驱动法

表驱动法的基本原理是将一组相关的数据存储在一个表格中,然后通过查表的方式来获取所需的结果,而不是通过嵌套的条件判断语句来实现。这样做的好处是可以将逻辑和数据分离,使代码更加清晰简洁。

#include <iostream>
#include <map>
std::string calculate_grade(int score) {
    std::map<std::pair<int,int>, std::string> grade_table = {
            {{90, 100}, "A"},
            {{80, 89}, "B"},
            {{70, 79}, "C"},
            {{60, 69}, "D"},
            {{0, 59}, "E"}
    };
    for (const auto& entry: grade_table) {
        if (score >= entry.first.first && score <= entry.first.second) {
            return entry.second;
        }
    }
    return "Invalid score";
}
int main() {
    int score = 85;
    std::string grade = calculate_grade(score);
    std::cout << "The grade for score " << score << " is " << grade << std::endl;
    return 0;
}

状态模式

状态模式是一种行为型设计模式,它可以用于解决代码中的条件语句嵌套问题。该模式将对象的状态抽象成独立的类,并将不同状态的行为封装在各自的类中,从而避免了大量的条件判断语句。

#include <iostream>

class State {
public:
    virtual void play() = 0;
    virtual void pause() = 0;
    virtual void stop() = 0;
};
class PlayState : public State {
public:
    void play() override {
        std::cout << "正在播放音乐" << std::endl;
    }
    void pause() override {
        std::cout << "暂停播放音乐" << std::endl;
    }
    void stop() override {
        std::cout << "停止播放音乐" << std::endl;
    }
};
class PauseState : public State {
public:
    void play() override {
        std::cout << "继续播放音乐" << std::endl;
    }
    void pause() override {
        std::cout << "音乐已经停止" << std::endl;
    }
    void stop() override {
        std::cout << "停止播放音乐" << std::endl;
    }
};
class StopState : public State {
public:
    void play() override {
        std::cout << "开始播放音乐" << std::endl;
    }
    void pause() override {
        std::cout << "音乐已经停止,无法暂停" << std::endl;
    }
    void stop() override {
        std::cout << "音乐已经停止" << std::endl;
    }
};
class MusicPlayer {
private:
    State* current_state;
public:
    MusicPlayer() {
        current_state = new StopState();
    }
    void set_state(State* state) {
        current_state = state;
    }
    void play() {
        current_state->play();
        set_state(new PlayState());
    }
    void pause() {
        current_state->pause();
        set_state(new PauseState());
    }
    void stop() {
        current_state->stop();
        set_state(new StopState());
    }
};
int main() {
    MusicPlayer player;
    player.play();
    player.pause();
    player.play();
    player.stop();
    return 0;
}

高阶函数

#include <iostream>
#include <vector>
#include <algorithm>
#include <ranges>

int main() {
    std::vector<int> vec{1, 2, 3, 4, 5};
    auto result = vec
            | std::views::filter([](int x){ return x % 2 == 0; })
            | std::views::transform([](int x){ return x * x; });
    for (auto x: result) {
        std::cout << x << " ";
    }
    std::cout << std::endl;
    return 0;
}