1. C++ / Говнокод #18114

    +143

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    void MyWindow::OkButtonClicked()
    {
        if((!cb1->isChecked()) && (!cb2->isChecked()))
            emit Simple(line->text());
        if((cb1->isChecked()) && (!cb2->isChecked()))
            emit Register(line->text());
        if((!cb1->isChecked()) && (cb2->isChecked()))
            emit Invers(line->text());
        if((cb1->isChecked()) && (cb2->isChecked()))
            emit RegVers(line->text());
    }

    Запостил: dia, 05 Мая 2015

    Комментарии (10) RSS

    • сори если с ошибками - в основном программирую на objective-c
      typedef enum {
      val1 = 0,
      val2,
      val3,
      val4} Values;

      в методе:
      Values valueCombination = val1;
      if (cb1->isChecked()) valueCombination += 1;
      if (cb2->isChecked()) valueCombination += 2; //или другие ваши способы получить комбинацию значений
      switch(valueCombination) {
      ... //перебор всех значений enum вместо много раз if со сложными условиями
      }
      Ответить
      • магия чисел - тоже говно.

        тут либо концепция кривая, либо надо просто if/else'ами сделать. более чем на 2 чекбокса это все равно не скалируется. если надо третий чекбокс - то концепция говно. если двух хватает - то лучше чем простой if/else не придумаешь.

        и если концепция говно - то надо начинать в сторону радиобуттонов или дроплиста думать.
        Ответить
        • ну будет еще одна строчка для чекбокса:
          if (cb3->isChecked()) valueCombination += 4;

          я пишу +=, но да, обычно битовые сдвиги записывают по-другому.
          Концепция говно? Ну так весь OpenGL по-вашему построенный на этой концепции - тоже говно? Там для того, чтобы в одну переменную запихнуть несколько значений используется вертикальная палка
          Ответить
          • > ну будет еще одна строчка для чекбокса:

            и еще 2x строчек в switch/case.

            > Ну так весь OpenGL по-вашему построенный на этой концепции - тоже говно?

            Я нигде ни разу не обобщал это на все использования битовых флагов.

            > Концепция говно?

            Да, говно: когда народ пытается 2-3 чекбоксами выразить хез какие концепции, которые никакого непосредственной связи с чекбоксами не имеют. Потому что чекбокс это просто бул переменная. Выбор "один из нескольких" - это очевидно либо радиобуттоны, либо дроплист.
            Ответить
    • void *(*funcs[])(const char *) = {
          Simple, Register, Inverse, RegVers
      };
      
      unsigned int mask = cb->isChecked | (cb2->isChecked << 1);
      funcs[mask](line->text());

      Мне одному кажется, что так проще?
      Ответить
      • плагиат, батенька
        Ответить
      • я написал почти то же самое, только другим кодом
        Ответить
      • Всё здесь прекрасно, кроме void *(*funcs[])(const char *). Сишкопитушарство. Указатель на функцию, которая указатель массив... Байты... Нет, это она возвращает void*, как же мы не догадались. И это вообще массив функций, чёрт.

        Помогут либо typedefs, либо шаблоны. Либо смена языка.
        template <typename T> using ref = T*;
        template <typename T> using cppref = T&;
        template <typename T> using narray = T[];
        template <typename T, size_t N> using array = T[N];
        template <typename R, typename ... A> using func = R (*) (A...);
         
        //void *(*funcs[])(const char *);
        narray<func<ref<void>, ref<const char>>> funcs;
        // хотя бы видно невооружённым сишкой глазом,
        // что тут массив функций
        Ответить
        • Осталось ввести сахар: разрешить последний параметр шаблона указывать за скобками через слово of
          Тогда будет
          narray of func<ref of void, ref of const char>
          Ответить
          • Можно попробовать реализовать обёртку-типохранитель с операторами, которые будут преобразовывать тип и decltype для возвращения из пространства монад значений в пространство типов.
            Заодно, используя шаблонные функции, можно будет некоторые аргументы-типы писать как параметры шаблона, а некоторые - преобразовывать к значениям и передавать как обычные аргументы.

            Набросок (интуитивный):
            template <template <typename> class C, typename T>
            type<C<T>> operator / (const C<void>&, const T&) {}
            
            auto void_ = type<void>();
            auto cchar = type<const char>();
            decltype(narray(func(ref / void_, ref / cchar))) funcs = ...;

            А дальше #define of /
            Ответить

    Добавить комментарий