Переходите на новый уровень: Практические методы избавления от вложенных switch в C++

В программировании крайне не рекомендуется использовать вложенные конструкции условий, такие как switch. Тем не менее, мы все еще можем столкнуться с кодом, которому необходимо рефакторинг, чтобы избавиться от этого рода условий. В статье рассмотрим несколько методов, с помощью которых можно избавиться от вложенных switch в C++.

Метод 1: Использование шаблонов и полиморфизма

Одним из самых эффективных способов избавления от вложенных switch является использование шаблонов и полиморфизма. Суть метода заключается в том, что мы создаем класс для каждого оператора switch, и эти классы наследуются от базового класса. Каждый класс переопределяет функцию оператора (). Затем мы создаем объекты каждого класса и помещаем их в массив. Каждый элемент массива соответствует возможному значению оператора switch. В конечном итоге нам необходимо только создать объект класса, передать ему значение и вызвать соответствующую функцию.

class IOperator 
{
public:
    virtual ~IOperator() {}
    virtual void operator()() = 0;
};

class Operator1: public IOperator 
{
public:
    void operator()() override { /* ... */ }
};

class Operator2: public IOperator 
{
public:
    void operator()() override { /* ... */ }
};

class Operator3: public IOperator 
{
public:
    void operator()() override { /* ... */ }
};

class Operator4: public IOperator 
{
public:
    void operator()() override { /* ... */ }
};

int main()
{
    std::vector<std::unique_ptr<IOperator>> operators;
    operators.push_back(std::make_unique<Operator1>());
    operators.push_back(std::make_unique<Operator2>());
    operators.push_back(std::make_unique<Operator3>());
    operators.push_back(std::make_unique<Operator4>());

    int value = 1; // Get value for switch

    (*operators[value])();

    return 0;
}

Метод 2: Использование функций-указателей

Другим способом избавления от вложенных switch является использование функций-указателей. Можно создать массив указателей на функции, каждый элемент которого соответствует разным значениям оператора switch. Для каждого значения определенной функции мы можем поместить код, который будет вызываться при выполнении оператора switch соответствующего значения.

void operator1()
{
    // ...
}

void operator2()
{
    // ...
}

void operator3()
{
    // ...
}

void operator4()
{
    // ...
}

int main()
{
    std::vector<std::function<void()>> functions;
    functions.push_back(operator1);
    functions.push_back(operator2);
    functions.push_back(operator3);
    functions.push_back(operator4);

    int value = 1; // Get value for switch

    functions[value]();

    return 0;
}

Метод 3: Использование std::map

Третий метод заключается в использовании std::map для сохранения ссылki на функцию для каждого возможного значения оператора switch. ОБычно этот метод менее эффективен, чем предыдущие, но он все еще оптимальнее, чем использование вложенных switch.

void operator1()
{
    // ...
}

void operator2()
{
    // ...
}

void operator3()
{
    // ...
}

void operator4()
{
    // ...
}

int main()
{
    std::map<int, std::function<void()>> functions;
    functions[1] = operator1;
    functions[2] = operator2;
    functions[3] = operator3;
    functions[4] = operator4;

    int value = 1; // Get value for switch

    functions[value]();

    return 0;
}

Выводы

Мы рассмотрели несколько методов, которые может использовать программист для избавления от вложенных switch в C++. Каждый метод имеет свои достоинства и недостатки. Использование шаблонов, полиморфизма и функций-указателей позволяют избежать многих проблем, которые могут возникнуть при использовании вложенных switch, а использование std::map может упростить и ускорить работу. Независимо от метода, выбранного программистом, главное - избежать создания вложенных switch и создать более удобный и читаемый код.

Смотри также: