Многократное использование секции с if

138
06 декабря 2019, 19:40

В ходе теста, после больших блоков проверяю, не была ли нажата кнопка СТОП. Есть такая секция с if

if (m_stopTest)
{        
    manualStopTest(); // Выключаем все
    //...
    return;           // Выходим из теста
}

Можно ли как-то правильно оформить, данную секцию, например, в функцию, чтоб менять то, что вложено в одном месте? Например, мысли такие

if (checkStop(m_stopTest)) return;

Где checkStop в себя включает все те проверки и вызовы. Но тогда не логично, что checkStop проверяет, и еще что-то там включает, выключает.

Answer 1

Вы хотите что-то такое?

bool checkStop(bool m_stopTest)
{
    if (m_stopTest) 
    {
        manualStopTest();
        return true;
    }
    return false;
}
Answer 2

Для решения вашей проблемы "прокидывания" return в вышестоящую функцию я вижу, как минимум, три варианта:

  1. Использовать функцию-предикат и передавать в неё подходящий параметр: флаг (как это продемонстрировал Harry в своём ответе) или даже дополнительно функцию, которую нужно выполнить, типа manualStopTest:

    using F = void (*)();
    bool checkStop(bool stop, F f)
    {
        if (stop) 
        {
            f();
            return true;
        }
        return false;
    }
    

    Использование:

    if (checkStop(m_stopTest, &manualStopTest)) return;
    

В этом случае return как бы передаётся по цепочке: return true; внутри checkStop приводит к return из функции верхнего уровня.

  1. Использовать макроподстановку:

    #define COND_RET(cond) \
    if ((cond))            \
    {                      \ 
        manualStopTest();  \
        return;            \
    }
    

    Пример:

    // какие-то действия ...
    COND_RET(m_stopTest)
    

В этом случае return один единственный, то это скорее C-стиль, нежели C++. Лучше избегать макросов, если в языке есть подходящие замены. В данном случае inline реализация функции из п.1 будет смотреться лучше.

  1. Выкинуть исключение во вложенной функции и поймать его уже где-то выше:

    void checkStop(bool stop, F f)
    {
        if (stop) 
        { 
            f();
            throw stopRequested();
        }
    }
    

    Использование:

    // Код высшего уровня 
    try {
        // Вызов кода верхнего уровня, т.е. функции, содержащей вызов checkStop
    }
    catch(...) {
        // Нужная обработка, может быть просто игнорирование
    }
    

    Такой вариант я тем не менее всё равно не стал бы советовать, т.к. использовать исключения для ветвления логики не принято. Как из-за лишнего оверхеда, так и по самой идеологии исключений, которые созданы для разруливания действительно исключетельных ситуаций.

READ ALSO
FFMPEG медленно записывает в файл

FFMPEG медленно записывает в файл

С помощью хороших людей вроде разобрался с тем как пользоваться ffmpeg для encodeВозникла следующая проблема, при записи в файл данных с микрофона...

104
WinSock2 - функция accept()

WinSock2 - функция accept()

Функция разрешения входящего соединения через сокет формирует дескриптор нового сокета, возвращая значение типа SOCKET

127
Как изменить размер JButton в Java

Как изменить размер JButton в Java

что делать? Я попробовал все методы/ или же большую часть

121
Как подключить локальную базу данных в NetBeans 8.2

Как подключить локальную базу данных в NetBeans 8.2

Я установил IDE NetBeans 82 и теперь стоит задача реализовать в приложении локальную базу

130