Кресты / Говнокод #18114 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 dia, (Updated )

Комментарии (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 /
          Ответить

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8