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

    +139

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    public class Switch
        {
            public Switch(object switchElement)
            {
                Object = switchElement;
            }
    
            public object Object{get; private set; }
        }
    
        public static class SwitchExtensions
        {
            public static Switch Case<T>(this Switch switchCase, Func<T, bool> isTrue, Action<T> action) where T : class
            {
                return Case(switchCase, isTrue, action, false);
            }
    
            public static Switch Case<T>(this Switch switchCase, Func<T, bool> isTrue, Action<T> action, bool fallThrough) where T : class
            {
                if (switchCase == null)
                    return null;
    
                var obj = switchCase.Object as T;
    
                if (obj != null)
                    if (isTrue(obj))
                    {
                        action(obj);
                        return fallThrough ? switchCase : null;
                    }
    
                return switchCase;
            }
        }
    
    
               //пример использования
    
                IImporter<AccountModel> result = null;
    
                new Switch(type)
                    .Case<string>(x => x == ".xls", y => result = new ExcelImporter())
                    .Case<string>(x => x == ".csv", y => result = new CsvImporter());
    
                return result;

    У нас будет свой Switch/Case с преферансом, куртизанками и экстеншен методами

    Запостил: Tessen, 09 Октября 2013

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

    • показать все, что скрытоНе виду говнистости
      - да, за место обычного switch он пройдется по порядку по всем case
      - да, при визуальном виде записи case кажется что action выполнится в любом случае, но ведь реалиция есть и можно посмотреть

      Получается что говнистоть будет только в том случае, если у автора там всегда string, но метод - универсален

      Мне даже стало инетерсно и я нагуглил его на stackoverflow
      http://stackoverflow.com/a/1426626
      Ответить
      • показать все, что скрытоА в чем преимущество этой конструкции перед пачкой if-else? Ну кроме того, что LINQ и экстеешн методы это круто, и каждый уважающий себя шарпей должен их юзать в каждом своем проекте ;)
        Ответить
        • показать все, что скрытоВ данном примере нет LINQ, а методы расширения делают код понятнее, компактнее и это очень удобно. Просто этот пример не иллюстрирует всю красоту extension-ов. (Минус не я вам поставил)
          Ответить
          • показать все, что скрыто> В данном примере нет LINQ
            > красоту extension-ов
            Я знаю. Просто многие программисты их юзают когда надо и когда не надо..

            > Минус не я вам поставил
            Это стертор ;)

            Но все же интересно услышать, чем подход из топика лучше пачки ифов. Ведь семантика тут именно от пачки ифов (ну или от case when из sql, но там нет fallthrough), а не от свича.
            Ответить
            • Эй, Борманд, Вы чего наговариваете?!
              Ответить
            • показать все, что скрытоНу работать будет и пачка if-ов и этот метод. Если у кого есть время и желание может реализовать и выложить, было бы интересно посмотреть.

              Но я себе не очень преставляю адекватную читаемость if-а, который дублирует логику например where T : class, некрасиво будет, много кода, т.е. это есть огранчение .Case<int>(x => x == 5, y => result = new CsvImporter()); А если посложнее, то совсем каша будет. Все таки так более наглядно, удобно, красиво
              Ответить
              • Борманд, чего это Вы не наговариваете?!
                ;D
                Ответить
              • показать все, что скрыто> Но я себе не очень преставляю адекватную читаемость if-а, который дублирует логику например where T : class, некрасиво будет, много кода, т.е. это есть огранчение
                Не совсем понял. Можно пример мли другими словами?...

                Просто я совсем не вижу разницы между кейс из топика и обычным ифом. То же условие в первом аргументе. То же действие во втором. Тот же fallthrough который эквивалентен наличию/отсутствию else. Какого-то нового функционала тут не добавили. Или я просто чего-то не замечаю? ;)
                Ответить
                • показать все, что скрытоP.S. да и внешнее сходство со свичом, имхо, только путает читателя...
                  Ответить
                • показать все, что скрытоЯ имел в виду что в if-ах будет вот такое условие: if(!obj.GetType().IsClass) - оказалось совсем не больно
                  Ответить
                  • показать все, что скрытоХм. А как код из топика упростит данное условие? :)
                    Ответить
                    • показать все, что скрытоДа никак, Смекалистый чушню несет и вы сами это знаете.
                      Ифы это тоже треш конечно же, но они хотя бы понятнее.
                      Если их не много, например два, то вполне себе вариант.
                      Но я бы делал какой-никакой классификатор все же.
                      Например, если на будущее форматы могут меняться, то последние строчки придется менять всегда.
                      Ответить
                      • показать все, что скрыто> я бы делал какой-никакой классификатор все же
                        я тоже что-то похожее когда-то делал
                        https://github.com/roman-kashitsyn/rules-dsl
                        Ответить
                      • показать все, что скрытоЭто почему ещё чушь? Потому что я не считаю это говнокодом и мне этот вариант куда симпатичнее кучи if-ов?
                        Ответить
                        • показать все, что скрыто
                          // код автора
                          new Switch(type)
                              .Case<string>(x => x == ".xls", y => result = new ExcelImporter())
                              .Case<string>(x => x == ".csv", y => result = new CsvImporter());
                          
                          // ифы
                          if (type == ".xls") {
                              result = new ExcelImporter();
                          } else if (type == ".csv") {
                              result = new CsvImporter();
                          }
                          Что из этого наглядней, интуитивней, короче и быстрее исполняется? :)

                          P.S. Хотя я нашел плюс у этой записи - в разных ветках кейса можно писать разные типы. С ифами пришлось бы вставлять проверку и каст.
                          Ответить
                          • показать все, что скрытоНу нельзя же так. Это ведь не одно и то же!
                            int type = 1;
                            // var type = new Foo();
                            if (type == ".xls") {
                                result = new ExcelImporter();
                            } else if (type == ".csv") {
                                result = new CsvImporter();
                            }

                            Он просто не скомпилируется, в отличает от 1-го примера. Нужна ещё проверочка, а потом ещё проверочка :) И что выйдет красивее ещё спорный вопрос
                            Ответить
                        • показать все, что скрытоО лол, да, именно!
                          По идее мап: ключ-действие решает трабл в одну строчку, но нет, апологеты тру красивого программирования суют свои лямбды везде где ни попадя.

                          И да, старые добрые ифы тут куда лучше смотрятся.
                          Ответить
            • показать все, что скрыто>Ведь семантика тут именно от пачки ифов
              зачем есть же Dictionary<string,delegate>.
              Ответить
              • показать все, что скрытоНе совсем то. Код ОП'а это именно пачка последовательных ифов (в которых можно указать не только == "x" но и любой другой предикат) и действий (case when из sql). А Dictionary будет выбирать одно конкретное действие при совпадении ключа и выполнять его (case из паскаля).
                Ответить
                • показать все, что скрытоНе совсем понимаю как конструкция if else if или switch/case не является выбором одного конкретного действия.
                  Ответить
                  • показать все, что скрытоСо словарем и в паскалевском case действие выбирается по совпадению ключа. Исполняется ровно одно действие.

                    В сишном switch/case действие тоже выбирается по ключу, но исполняется одно или несколько действий (в зависимости от break'ов).

                    В коде автора, case when в sql и пачке if/else последовательно проверяются условия (которые могут быть не только == "foo", но и любым другим предикатом) до тех пор, пока одно из них не вернет true.Тогда выполняется одно действие (в коде автора может и несколько, если fallthrough = true).

                    Ну неужели не чувствуете разницу в семантике? :)
                    Ответить
                    • показать все, что скрытоТы хочешь сказать, что код автора может вести себя как сишные switch без break?
                      Но все равно цель остальных конструкций, это либо выбрать одно действие, либо выполнить первое попавшееся действие, то бишь одно единственное .
                      Ответить
                    • показать все, что скрытоВ таком случае это не if { } else if { }, где возможно только одно действие, а if { } if { }
                      Ответить
        • показать все, что скрыто*пристыженно посмотрел на свой NSArray+linq.h
          Ответить
    • Коментарий автора убил. Безусловно, очень толковый парень.
      ЖЖошь, сотона! )
      Ответить
      • показать все, что скрытоХороший комментарий с примером - залог того будут ли переиспользовать или не будут эту конструкцию.
        Ответить
        • Я имею в виду коммент топика, "У нас будет свой Switch/Case с преферансом, куртизанками и экстеншен методами". Надо же было такое придумать.
          )
          Ответить
          • показать все, что скрыто> Надо же было такое придумать.
            А я стихи пишу, вот, послушай:

            Я помню чудное мгновенье:
            Передо мной явилась ты,
            Как мимолетное виденье,
            Как гений чистой красоты.

            http://lurkmore.to/%D0%91%D0%BB%D1%8D%D0%BA%D0%B4%D0%B6%D0% B5%D0%BA_%D0%B8_%D1%88%D0%BB%D1%8E%D1%85 %D0%B8
            Ответить
            • Стихи суперские. Александр Сергеевичь сосет на коленях и просит о посчаде.
              А ссылку погубил злой рок.

              Вот новая.

              http://images.t-nation.com/forum_images/a/5/a5d6f_ORIG-tumblr_lh8ojoMhBJ1qbylvso1_500.jpg

              )
              Ответить
            • http://cs5782.vkontakte.ru/u73275706/142050532/x_17ce0eef.jpg
              Ответить
            • показать все, что скрытоНа будущее: выделяй ссылку с конца до первой буквы, тогда прыщелис не кодирует кириллицу в это уёбище.
              Ответить
              • показать все, что скрыто
                (function(s){ location.replace(s.replace(/\s/g, '')) })
                ('http://lurkmore.to/%D0%91%D0%BB%D1%8D%D0%BA%D0%B4%D0%B6%D0% B5%D0%BA_%D0%B8_%D1%88%D0%BB%D1%8E%D1%85 %D0%B8')

                Более простое решение этой проблемы
                Ответить
                • показать все, что скрытоБолее пердоликовое решение, даже если пердолиться в текстовом редакторе.
                  Ответить
                  • показать все, что скрытоА вообще уже надо выпустить большой настраиваемый юзерскрипт (или расширение) для ГК. Чтоб пробелы в ссылках убирал и делал их активными, чтоб гоатсе минусовал, рейтинг не показывал, добавлял кнопку "скрыть всё, что показано", комменты нечитанные копировал наверх, олдфагов и адекватных выделял, ветки комментариев сворачивал, ...
                    И чтоб все эти полезности можно было по одной включать-выключать.
                    Ответить
                    • о-о-о, закатай губу!..
                      :O
                      Ответить
                      • показать все, что скрыто> о-о-о, закатай губу!..
                        Это всё легко реализуется. Главная сложность - запилить нормальный интерфейс настроек со 100500 галочками + расширяемость (чтоб каждый мог свою опцию добавить, но при этом всё оставалось чем-то относительно целым и не скатилось в говно довольно быстро).
                        Ну и минусование гоатсе - в общем случае эквивалентно капче.

                        Остальное же - найти элемент или массив элементов и сделать "map <опция> <элементы>". Vindicar сделал основу, vistefan, если не ошибаюсь в никах, сделал выделение олдфагов.
                        Ответить
                        • Свиток будет искать гоатсе на страницах по символьной маске/сигнатуре?
                          Ответить
                          • Тогда ваша затея обречена на провал, это я вам гарантирую. Не потому, что я так уж люблю гоатсе, а потому, что извращаться можно сколько угодно: псевдографичное гоатсе содержит до кучи символов, его можно сколько угодно раз изменять, модифицировать. Ведь нет стандарта на гоатсе, я прав? Можно запостить хуйню, весьма отдаленно напоминающее гоатсе, участники посмотрят и поймут, что это, а свиток достанет трубку, кисет, набъет самокрутку и чиркнет спичкой о сапог.
                            Ответить
                            • показать все, что скрыто> Ведь нет стандарта на гоатсе, я прав?
                              ГОСТ Р42.100500 ГОАТСЕ
                              Ответить
                            • Единственный выход - смотреть, сколько допсимволов содержит тот или иной пост, конкретно в теге [сode], так как псевдографику иначе не запостишь. Если много - минусовать нах.
                              Ответить
                              • показать все, что скрытоЯ кроме гоатсе перечислил ещё несколько функций, которые могут оказаться полезными.

                                Но в крайнем случае - вручную жать на кнопку "скрыть" и хранить, скажем, в localStorage факт сокрытия. Или, как уже раньше предлагали (и делали), игнорить определённых юзеров.
                                В основном тут возникают всплески школоты, которая не особо меняет формат гоатсе и сообщений о поиске кавказцев. А взрослых тонких троллей крайне мало - их и вручную можно скрыть или почитать их комментарии для самообразования.
                                Ответить
                                • Можно использовать принцип облачников, который еще называют "барановым" принципом, и который успешно применяется несколькими местными баранами:
                                  свиток смотрит оценку за пост, выставленную другими участниками, и на основе этого выставляет аналогичную: к примеру, если стоит минус, свиток декрементит, если плюс - инкрементит. Лажа в том, что свиток заранее не знает, кто выставлял оценку. Это может быть например Борманд, а может быть и залетный тролль, которому понравилось гоатсе. Бараны вышли из положения так. Свиток проверяет, есть ли минусы, если есть, то сколько? Если много - минусует. Бараны, такие бараны.
                                  Ответить
                                  • показать все, что скрытоИнтересно бы было наблюдать за рейтингом, если бы у 10% пользователей стояли бы скрипты, которые ставят плюс/минус рандомно или по какой-нибудь внезапной функции от текста (скажем, чётность количества символов), а у остальных 90% - скрипт с "барановым" принципом.
                                    Ответить
                                    • Свиток оный имеется у 3-4 человек.
                                      Я знаю, о чем говорю, я проверял:

                                      как-то раз мило пошутил (мило, но не остроумно, это было сделано намерено) в топике у ProgramistOtBaga. Кто-то плюсанул. Потом пошло-поехало, плюсовать. А шутка была скорее глупая, ее минуснуть надо было. Правда, кое-кто и минусовал, чувствуя подвох - они подтирали мне результат теста (поэтому я и решил, что свиток есть у 3-4 человек)
                                      Возможно, что свитка и вовсе нет - тогда вывод еще хуже: стадное чувство детектед; ее разобравшись в сути поста жать + или -, только потому, что другие оценили - как то уныло. Ну да баг им судья.
                                      Ответить
                                      • Я бы предлагал забыть на следующие полчаса о нормах приличия и морали, влезть по уши в дерьмо и составить годную строковую сигнатуру из массива слов, которые в совокупности составляют порочащие сведения или мат:

                                        >>обслужу
                                        >>кавказец
                                        >>хуястые
                                        >>минет
                                        >>подставлю
                                        >>пидор
                                        >>сосет
                                        и т.п. в этом роде, ибо настоебало читать непотребности, которые регулярно сеет чей-то приголубленный мозг.
                                        Ответить
                                        • Я, кстати, был вынужден сам составить аналогичную программу, когда писал анти-спам для нашего сайта, потому, что какой-то урод спамит форум, рекламируя алмазные буры, бумажные пакеты, резиновые фаллосы, средства для потенции и прочую гадость. Программа анализирует текст и ищет в нем ключевые слова, пытаясь понять суть их использования, ведь тема может быть спамом, а может участники просто обсуждают, что какой-то урод спамит, и приводят цитаты из его рассылок. Программа получилась настолько удачной, что я только подрихтовал некоторые места, без изменения самого алгоритма.
                                          Ответить
                                          • показать все, что скрыто> пытаясь понять суть их использования
                                            Уважаю.

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

                                            Особенно порадовал разброс для моего комментария с советом зарегистрировать десяток ботов. Первая группа минуснула, вторая поняла юмор и плюсанула, третья ставила рандомно.
                                            Сам плюсанул понравившиеся комментарии про драйвер на html, когда у него ещё не было столько плюсов, и про 12 стульев. Вторая и третья группы со мной согласились, комментарии в плюсе.

                                            По-моему, наличие свитков надо проверять не по постам троллей.
                                            Ответить
                                            • Кстати, я ради смеха подал на вход парсера текст с текст с этой страницы - нашел спам )
                                              Ответить
                                          • показать все, что скрытоПопробуй взять готовые фильтры для email.
                                            Ответить
                                          • показать все, что скрыто> Я, кстати, был вынужден сам составить аналогичную программу
                                            > когда писал анти-спам для нашего сайта потому, что какой-то урод спамит форум
                                            > рекламируя алмазные буры, бумажные пакеты, резиновые фаллосы, средства для потенции и прочую гадость

                                            Известный борец со спамом, Доктор Смегма.
                                            Ответить
                    • показать все, что скрыто> ...
                      ... тырил пароли и сливал их на багминот
                      Ответить
    • показать все, что скрытоОТСОСУ У КАВКАЗЦА, ДАМ В ЖОПУ ТАДЖИКУ, ВЫЛИЖУ АНУС УЗБЕКУ vk.com/id29482‎
      Ответить

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