1. C# / Говнокод #5104

    +135

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 29 Декабря 2010

    Комментарии (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
                      };

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

                            Это может быть нужно лишь при переходе проекта с языка на язык.
                            Или написания какого-то "скриптового" языка, например для игр, и то есть более подходящие для этого средства.
                            Ответить
                            • в нормальном компиле, чую, унылый свитч будет какашкой мамонта покоиться еще сто лет, пока будут придерживаться линейки С -> C++ -> C#
                              Ответить
                    • возразить нечего, ага
                      в теории кто-угодно Лев Толстой
                      Ответить
                      • Используй же множества, в которых поиск элемента выполняется куда более оптимальным способом, чем тупым перебором.
                        Ответить
                        • я осознал
                          if (new HashSet<int> { 1,2,.. }.Contains(..) )
                          Ответить
                          • Наконец-то.
                            Ответить
                            • да, совсем про него забыл
                              но .NET 3.5 only
                              так что для 2.0 и массив подойдет
                              как любят говорить американцы: is it your bottleneck?
                              Ответить
                      • >>в теории кто-угодно Лев Толстой

                        почему-то вспомнилось: http://tinyurl.com/26yfq3q
                        Ответить
                • Я правильно понимаю, что мы говорим о производительности работы с массиов из 10ти примерно элементов?)))
                  Ответить
                  • ага)
                    Ответить
                  • Сегодня десять, завтра сто десять. Но это же волнует только нас, байтоёбов, куда нам до гуру программинга, которые любой оптимальный код готовы запинать за оптимальность.
                    Ответить
                    • >>завтра сто десять.
                      кстати да
                      завтра 110

                      а за 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" с помощью регэкспа

                          :D
                          Уважаемый Петросян, не убивайте меня, пожалуйста, смехом.
                          Ответить
                          • а с помощью чего такие выражения парсить?
                            Ответить
                            • Не надо их самому парсить, пусть компилятор парсит.
                              Ответить
                              • в рамках C# как ты себе это представяешь?
                                Ответить
                              • Вот Вам енум лицензии трех типов: 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() как раз для этого предназначенная. А если массив представить в виде возрастающей/убывающей последовательности - то это тоже уже не массив ? :)
                                            Ответить
                                            • Массив, но с дополнительным свойством. Тут некоторые коментаторы предлагают стандартную функцию поиска по массиву перебором, без спец структур.
                                              Ответить
                              • Битсет можно легко реализовать. Это не проблема. Жаль лишь, что майкрософт об этом не позаботился.
                                Вечная кара ему!
                                Ответить
    • А если циферки отсортировать по убыванию вероятности их появления, то говнокод будет еще круче))
      Ответить
    • Где здесь С++?
      Ответить
      • Капитан, вы?
        Ответить
        • да я его величество C++ собственной персоной можете полабызать мой величественный хуй
          Ответить
        • >Капитан, вы?
          Нет. Просто гость с отшибленной головой.

          Какими судьбами Вас к нам занесло? :)

          Чем разговаривать с безголовым, лучше бы поучавствовали в холиваре:
          http://govnokod.ru/5135
          http://govnokod.ru/5136
          , где требуется защита С++!
          А то С++ без Вас там не справиться и сольёт даже паскалистам!
          Неужели Вы такое допустите?
          Ответить

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