Си диез / Говнокод #5104 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
if (",0,1,2,5,6,9,10,11,14,17,18,".IndexOf("," + cc + ",") != -1)
{
    gridwells[rid, cc].Editor = null;
    gridwells[rid, cc].View.BackColor = Mark_FormFunctions.DefColor;
}
else if (",3,4,7,8,15,12,13,".IndexOf("," + cc + ",") != -1)
{
    gridwells[rid, cc].Editor = DoubleEditor;
    gridwells[rid, cc].View = Mark_FormFunctions.EditView;
}

Вот так можно обойтись без switch

Запостил: Buzurud Buzurud, (Updated )

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

  • А чё, в сирешётке нету битсета?
    Чтобы писать
    если сс естьв (0,1,2,5,6,9,10,11,14,17,18) то...


    Да и данный гк можно было сделать поадекватнее, если смотреть не в строке, а в массиве чисел.
    Ответить
  • в принципе, правильно вот так:
    if (new[] { 1, 2, 3, .. }.Contains(cc)) { }

    хотя в данном случае:
    if (cc % 2 == 0) { }

    К.О.
    Ответить
    • Насчёт второго выражения, пожалуйста, поподробнее. Для меня оно неочевидно.
      Ответить
      • наврал, ага, извиняюсь
        мне показалось что там четные-нечетные числа
        Ответить
        • А мне сначала показалось, что в первом варианте cc % 4 равно 1 или 2, но потом заметил, что там куча исключений.
          Ответить
    • > if (new[] { 1, 2, 3, .. }.Contains(cc)) { }

      А это скомпилится не в перебор массива случайно? Битсеты-то компилятся в простую проверку бита, а тут что?
      Ответить
        • ага. а в этом случае иначе никак.
          можно, конечно, нагородить
          Dictionary<int, Action<TEditor, TView>>
          но зачем?
          тем более что массив можно сохранить в конфиге и распарсить, а switch - нельзя
          var arr = config.GetSection("foo").Bar.Split(",").Select(s => Int32.Parse(s));
          Ответить
      • Не знаю, как в C# с битсетами, но через Dictionary будет быстрее массива.
        В любом случае массив лучше строки.
        Ответить
        • Битсет можно сэмулировать, правда, ценой потери читабельности (раз язык не поддерживает).
          Ответить
          • есть зверь BitVector32 но он наследие 1.х, которое не реализует ни единого интерфейса
            Ответить
        • switch если больше 4 разворачивается компилятором в hashtable
          оно, конечно, быстрее массива (premature optimization, ага), хотя я уверен не существует такого кода, где это имело бы значение, а если и существует - то это плохой дизайн
          зато массив можно сохранить в конфиг
          Ответить
          • ЛОЛЧЁ какая в жопу предварительная оптимизация?!
            Свитчи оптимизирует компилятор без ущерба читабельности кода.
            Самое большое зло в программировании - это называть любую оптмизацию "предваритальной" (даже если этот термин ну ваще в контексте не пришей пизде рукав) и вспоминать тот древний лозунг.
            Кстати, один из паттернов говнокода - предварительная пессимизация.
            Ответить
            • readable, maintainable, scalable но less efficient array vs. less-readable, less-maintainable, less-scalable но more efficient switch-case?
              я выбираю массив
              Ответить
              • Лолчё каким местом массив читабельнее свитча?
                У тебя походу оптимофобия.
                То есть ты любой более оптимальный вариант (независимо от его адекватности и читабельности) сразу считаешь злом и пытаешься себе доказать, что он менее читабелен.
                Ответить
                • итого, имеем:
                  if (new[] { 0,1,2,5,6,9,10,11,14,17,18 }.Contains(cc))
                  {
                       gridwells[rid, cc].Editor = null;
                       gridwells[rid, cc].View.BackColor = Mark_FormFunctions.DefColor;
                  }
                  else if (new[] { 3,4,7,8,15,12,13 }.Contains(cc))
                  {
                       gridwells[rid, cc].Editor = DoubleEditor;
                       gridwells[rid, cc].View = Mark_FormFunctions.EditView;
                  }
                  и
                  switch (cc)
                  {
                      case 0:
                      case 1:
                      case 2:
                      case 5:
                      case 6:
                      case 9:
                      case 10:
                      case 11:
                      case 14:
                      case 17:
                      case 18:
                      {
                           gridwells[rid, cc].Editor = null;
                           gridwells[rid, cc].View.BackColor = Mark_FormFunctions.DefColor;
                           break;
                      }
                      case 3:
                      case 4:
                      case 7:
                      case 8:
                      case 5:
                      case 12:
                      case 13:
                      {
                           gridwells[rid, cc].Editor = DoubleEditor;
                           gridwells[rid, cc].View = Mark_FormFunctions.EditView;
                           break;
                      }
                  }
                  Ответить
                  • case 0,1,2,5,6,9,10,11,14,17,18: {
                    // insert user code here
                    }
                    case 3,4,7,8,15,12,13: {
                    // insert user code here
                    };

                    А, ну да, в сишарпе не додумались до этой фичи, ты хочешь сказать.
                    Ответить
                    • Да давно пора заменить убогий сишный свитч, на что-то более человеческое...
                      Ответить
                        • Я ж не задрот какой-нибудь. Я деньги зарабатывать хочу с нормальным компилем, а не с этой резвлекаловкой.

                          Это может быть нужно лишь при переходе проекта с языка на язык.
                          Или написания какого-то "скриптового" языка, например для игр, и то есть более подходящие для этого средства.
                          Ответить
                          • в нормальном компиле, чую, унылый свитч будет какашкой мамонта покоиться еще сто лет, пока будут придерживаться линейки С -> C++ -> C#
                            Ответить
              • Я правильно понимаю, что мы говорим о производительности работы с массиов из 10ти примерно элементов?)))
                Ответить
                • Сегодня десять, завтра сто десять. Но это же волнует только нас, байтоёбов, куда нам до гуру программинга, которые любой оптимальный код готовы запинать за оптимальность.
                  Ответить
                  • >>завтра сто десять.
                    кстати да
                    завтра 110

                    а за 110 свичей человека не грех и уволить
                    если он конечно не пишет драйвер для встраиваемового устройств
                    Ответить
                    • > а за 110 свичей человека не грех и уволить

                      В оконной функции?

                      В нормальных языках в свич можно пихать диапазоны и перечисления, так что 110 свичей будут выглядеть вполне нормально.
                      Ответить
                        • Случаи множественного выбора часто сводятся к нескольким диапазонам, а диапазоны можно сразу пихать в свич (в нормальных языках).
                          case i of
                            1000..9999: result := 4;
                           // и так далее

                          Но ты бы это в 9000 кейсов расписал.
                          Ответить
                          • у нас теперь нормальные языкы - это которые поддерживают расширенную семантику в свиче, а ненормальные - которые не поддерживают?
                            перечисли ка теперь "нормальные" языки
                            Ответить
                          • Помню, в Паскале была такая вещь, что если объявишь тип "Массив из 6 элементов", то нельзя его передать в функцию, которая принимает массив из 7 элементов.
                            Как там щас с этим обстоят дела?
                            Ответить
                            • когда-то и строк в Паскале не было 🙂
                              помню книга даже была по алгоритмам и структурам данных, в некоторых случаях авторы прибегали к сям
                              Ответить
                        • это нормально только в случае какой-то хеви-хеви оптимизации
                          и то это тогда пишется не руками а генерится автоматом
                          Ответить
                      • а если там енумы с какими-то несортируемыми значениями, то какие тут диапазоны?

                        например 20 типов заказа
                        Ответить
                        • case TipZakaza of
                          tzSrochno: begin
                          end;
                          tzNeOchenSrochno: begin
                          end;
                          итд. Что тут не сортируется?
                          А если надо делать выбор по строке - то тут, если строк много, надо строить карту строк и делать свитч по индексу строки в карте.
                          Ответить
                    • о том и говорю
                      в конфиге (зло а что делать) можно перечислить все 110
                      либо парсить выражения типа "1-55,58,59-110" с помощью регэкспа и разворачивать их в массив
                      со свичом такое вообще нереально
                      Ответить
                      • >либо парсить выражения типа "1-55,58,59-110" с помощью регэкспа

                        😀
                        Уважаемый Петросян, не убивайте меня, пожалуйста, смехом.
                        Ответить
                          • Не надо их самому парсить, пусть компилятор парсит.
                            Ответить
                            • Вот Вам енум лицензии трех типов: PERSONAL, CORPORATE и OPENSOURCE

                              сделайте для него range пожалуйста, как Вы тут говорили "1-55"
                              Ответить
                              • case License of
                                  lPersonal: begin
                                    //...
                                  end;
                                  lCorporate: begin
                                    //...
                                  end;
                                  lOpenSource: begin
                                    //...
                                  end;
                                end;
                                Ответить
                              • case licence of
                                    PERSONAL..CORPORATE : ЖРАТ();
                                    OPENSOURCE: Assert(False, 'Nullify here');
                                  end;
                                Ответить
                                • if licence = nil then begin;
                                   writeln('Congratulations, you've got NULLED edition!');
                                  end;

                                  что-то настроение праздничное...
                                  Ответить
            • Есть такой рефакторинг "Replace Conditional Logic with Strategy". Считаете ли Вы его говнокодом?
              Ответить
                • да, Вам)
                  смысл его в том, что вместо цепочки ифов мы делаем несколько классов, каждый их которых инкапсулирует в себе поведение для каждого случая. Мы один раз выбираем класс, и потом его используем.
                  //жаба:
                  //было
                  if (user.getGender() == Genders.BOY) {
                   user.drinkBeer();
                  } else {
                   user.drinkMartini();
                  }
                  //100500 строк кода
                  if (user.getGender() == Genders.BOY) {
                  user.watchFootBall();
                  } else {
                  user.watchMelodrama();
                  }
                  //стало:
                  PersonStrategy strategy = PersonStrategyFactory.getForUser(user);
                  strategy.drink();
                  strategy.watch();

                  тоесть мы заменяем иф на вызов метода объекта!
                  это ли не пессимизация?
                  Ответить
                  • Если елсеифов штук 20 идёт, то это уже вопрос, что медлнее - тупой поочерёдный перебор или вызов метода. Лучше всего - таблица переходов, которая как раз и формируется для свича.
                    Ответить
                    • скажем их 6
                      Вы будете делатьс тратегию или будете писать по 6 кейсов на каждый раз, когда нужно что-то проверить?
                      а если таких разов 10?
                      Ответить
                      • Если это один и те же 6 вариантов, то я, конечно, сделаю стратегию. Поскольку это действительно повышает читабельность.
                        А вот каким хреном массиив читабельнее свитча - это я понять не могу, это что-то на уровне самовнушения "оптимально - значит нечитабельно".
                        Ответить
                        • Массив лучше хотя бы потому, что можно менять его в рантайме.
                          Ответить
                              • А свитч-кейс внутри - это что? Двоичный поиск либо таблица переходов.
                                Что тоже можно эмулировать в рантайме.
                                Но если условия меняются - то битсет лучше.
                                Ответить
                                • При чем здесь "внутри" ? Внутри это всё вообще машинные коды, я же говорю об удобстве при разработке.
                                  Ответить
                                  • Тогда используй множества, чтобы определить, находится ли элемент в наборе, а никак не массивы, которые ищут элемент перебором.
                                    Ответить
                                    • Ну да, множества. Только массивы ничего не ищут. Ищут алгоритмы, и если содержимое массива предварительно представить в виде дерева, то получится то же самое множество. 🙂
                                      Ответить
                                      • Если содержимое массива представить в виде дерева или ещё какой структуры, то какой это тогда массив?
                                        Ответить
                                        • Хм-м. В С++ есть например функция make_heap() как раз для этого предназначенная. А если массив представить в виде возрастающей/убывающей последовательности - то это тоже уже не массив ? 🙂
                                          Ответить
                                          • Массив, но с дополнительным свойством. Тут некоторые коментаторы предлагают стандартную функцию поиска по массиву перебором, без спец структур.
                                            Ответить
                            • Битсет можно легко реализовать. Это не проблема. Жаль лишь, что майкрософт об этом не позаботился.
                              Вечная кара ему!
                              Ответить
  • А если циферки отсортировать по убыванию вероятности их появления, то говнокод будет еще круче))
    Ответить

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

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


    8