改善丑陋的代码–并列if-else优化(表驱动)

Aki 发布于 2022-11-10 196 次阅读


改善丑陋的代码——并列if-else语句优化(表驱动)_哔哩哔哩_bilibili

有下列一个场景,要求输入一个字符串,并对字符串为 1~4 之内的做出不同的选择,不符合要求的重新输入。本质上是一个映射关系,一个字符串对应着一个选择。我们后期每次添加新选择的时候都要手动的添加if-else语句,当语句越来越多时越不好阅读。我们可能会这样写:


    string temp;
    while (1)
    {

        cin >> temp;
        if (tmp == "1")
        {
            func1();
        }
        else if (tmp == "2")
        {
            func2();
        }
        else if (tmp == "3")
        {
            func3();
        }
        else if (tmp == "4")
        {
            func4();
        }
        else
        {
            
        }
    }

可以使用一个 map 来进行优化,形成一个映射表。

void func1(){cout << "func1" << endl;}
void func2(){ cout << "func2" << endl; }
void func3(){ cout << "func3" << endl; }
void func4(){ cout << "func4" << endl; }
using void_ptr = void(*)(void);

map<string, void_ptr> func_ptr = { {"1",func2},{"2",func1},{"3",func3},{"4",func4} };

    string tmp;

    auto end = func_ptr.end(); //注意这里在循环外部获取了end,因为我们的循环不会改变map的元素数量和值,因此end这个值是不变的,放在循环里,每次循环都要获取一次end,浪费了性能,特别是元素数量特别大时

    while (1)
    {
        cin >> tmp;
        auto res = func_ptr.find(tmp);
        if (res != end)   //注意这里要判断映射表里有没有对应键的值
        {
            res->second();      //函数指针调用函数
        }
        else
        {
            
        }
    }

这样我们后期添加新的选择时只需要添加对应的映射关系到映射表中就行了,方便维护。