Альтернатива многократному использованию if-else в базе кода

0

У меня есть огромный кусок кода, который работает на двух версиях некоторого параметра, скажем ver1 и ver2.

Версия - это поле времени выполнения, и я намерен сохранить его как, так что мне не нужно создавать код с разными флагами, и те же файлы lib могут использоваться для обеих версий.

Теперь существуют разные поля, применимые для ver1, а некоторые для ver2.

Поэтому в коде в нескольких местах мне нужно сделать

if(ver1) {
    // set fields specific to ver1
}
else {
    // set fields specific to ver2
}

Мне не нравится идея помещать так может, если заявления в коде, поскольку код имеет тенденцию выглядеть уродливым.

Какие-нибудь альтернативы это?

Я думал о каком-то общем встроенном/макроопределении, где поле задано только в том случае, если флаг передан верно?

Кроме того, на стороне оптимизации не должно быть дорого, чем в противном случае

@edit - некоторые детали внутренней организации кода

Не удается опубликовать детали кода. Но одним из важных фактов является то, что его огромный код устаревания, который нуждается в обновлении с обратной совместимостью.

Параметр версии передается каждому классу, чтобы определить, какое поле должно быть установлено и которое игнорировать.

Теги:
coding-style

3 ответа

3

Часто используемым решением является наличие двух классов, представляющих версии 1 и 2, с общим базовым классом, определяющим интерфейс с виртуальными функциями. Таким образом, вы получаете только один, если /else, а затем таблица виртуальных функций заботится о выборе правильной функции.

Я бы сказал, если это не правдоподобное решение, то if-else - самый ясный способ.

  • 0
    Не возможно в сценарии, я работаю!
  • 0
    @Dexter Ваш вопрос очень расплывчат в деталях. Может быть, вы должны описать, почему это не работает в вашем сценарии. Каков твой сценарий?
0

Вы можете легко сделать это с помощью функций. Основная цель функций - уменьшить избыточность кода.

#define VERSION1 25
#define VERSION2 55

void checkVersion(int vers)
    {
       switch(vers)
       {
         case VERSION1:
              code_Depending_On_Version1();
              break;


         case VERSION2:
              code_Depending_On_Version2();
              break;
        }
    }
  • 0
    Проблема этого подхода заключается в том, что существует несколько полей, которые устанавливаются в зависимости от версии и в разных местах в базе кода. Я бы в итоге создал несколько функций.
  • 0
    если вы имеете в виду, что ваш код написан как вложенный if-else (как люди делают в школе), то вам нужно серьезно пересмотреть свой подход к кодированию. Мое мнение состоит в том, чтобы создать функцию для кода, связанного с версией 1 и такой же для версии 2.
0

Если это просто косметика, то:

void blabla0(bool ver1)
{
 if(ver1)
 {
  blabla1();
  return;
 }
 blabla2(); // save one else and two brackets, but get a return :-(
}

Если вы всегда знаете параметр во время компиляции, я бы использовал шаблоны

template<bool ver> blabla0()
{
 if(ver1)
 {
  blabla1();
  return;
 }
 blabla2();
}

Это эффективно (компилятор построит две специализированные версии функции) и очистится.

Я забыл еще один:

void blabla0(bool ver1)
{
 ver1 ? blabla1(): blabla2();
}

Или используйте базовый виртуальный класс с двумя производными классами, специализированными для каждой версии, как это предложил Матс Петерсон.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню