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

    +96

    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
    if (IsPostBack)
                {
                    string PostBackerID = Request.Form.Get("__EVENTTARGET");
                    string PostBackerArg = Request.Form.Get("__EVENTARGUMENT");
    
                    if (PostBackerID == "ctl00$cphMainContent$pagerID")
                    {
                        CurrentReviewPage = int.Parse(PostBackerArg);
                        FillReviews();
                    }
                    else if (PostBackerID == "ctl00$cphMainContent$Like")
                    {
                        FillLike();
                    }
                    else if (PostBackerID == "ctl00$cphMainContent$review")
                    {
                        AddReview(PostBackerArg);
                    }
                    else if (PostBackerID == "ctl00$cphMainContent$Follow")
                    {
                        FillFollow();
                    }
                    else if (PostBackerID == "ctl00$cphMainContent$WebResultpagerID")
                    {
                        CurrentWebResultPage = int.Parse(PostBackerArg);
                        FillWebResults();
                    }
                    else if (PostBackerID == "ctl00$cphMainContent$WebResultCluster" || PostBackerID == "ctl00$cphMainContent$HiddenButton")
                    {
                        CurrentWebResultPage = 0;
                        int SelectedClusterID = int.Parse(PostBackerArg);
                        if (AllClusters != null && AllClusters.ContainsKey(SelectedClusterID))
                        {
                            SelectedClusterName = AllClusters[SelectedClusterID];
                            FillWebResults();
                        }
                    }
                }

    компактная логика всей страницы...

    Запостил: mangyst, 17 Мая 2012

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

    • switch? не, не слышал
      Ответить
      • В шарпике можно по строкам?
        Ответить
        • можно
          Ответить
          • в седьмой джаве тоже добавили эту киллер фичу
            Ответить
            • меня до сих пор мучает вопрос: зачем???
              имхо, если вам понадобился switch-case в java, то вы что-то делаете неправильно (есть же ооп)
              Ответить
              • зы: лучше бы замыкания добавили, бесят анонимные классы.
                Ответить
              • >если вам понадобился switch-case в java, то вы что-то делаете неправильно (есть же ооп)
                Тарас где-то хорошо про это написал, назвав это "ооп-измом головного мозга."

                А вот в js точно не нужен.
                Ответить
                • А в CL есть три кейса, ну или четыре, или семь - смотря как посмотреть, и можно еще своих написать... Но из готовых - по строкам ни один не может, ну или прийдется самому сравнивать.
                  Ответить
                  • (defmacro string-case (value &body body)
                      (do ((x body (cdr x))
                           (a) (b) (c))
                          ((null x))
                        (setf a (car x) b (car a) c (cadr a))
                        (if (consp b)
                    	(when (some #'(lambda (y) (equal y value)) b)
                    	  (return (eval c)))
                    	(when (or (equal b value) (eq b 'otherwise))
                    	  (return (eval c))))))
                    
                    (string-case "foo"
                      ("bar" (princ "bar"))
                      (("bar" "foo") (princ "foo"))
                      (otherwise (princ "otherwise")))
                    
                    (string-case "meh"
                      ("bar" (princ "bar"))
                      (("bar" "foo") (princ "foo"))
                      (otherwise (princ "otherwise")))
                    например.
                    Ответить
                    • Это какой-то неправильный макрос
                      Ответить
                    • Мой очень черновой вариант:
                      http://ideone.com/DWtka
                      Не делает важных проверок, не поддерживает динамические списки строк, но для наброска сойдёт
                      Ответить
                      • Сгенерить одним макросом другой макрос? Нам же всего навсего нужно избежать вычисления аргументов. Кстати, (listp nil) => t так что лучше все-таки consp. И зачем проверять, что там только строки? Наоборот лучше, если он будет работать и для других векторов и вообще всего, что equal может сравнить.
                        Можно было, конечно добавить предупреждение, если otherwise не в конце, или если его нету, и ничего не совпало - но это ж для примера сделано.
                        Ответить
                        • Ваш макрос принципиально неправилен, поскольку вычисляет свитч на этапе компиляции, следовательно, может работать только с константами. Зачем это нужно, если программист сам знает, что на входе у макроса?
                          Макрос довольно редко должен выполнять переданный ему код, ведь задача макросов - конструировать выражения.
                          Ответить
                          • А почему это не правильно? Это то, что я и хотел... Мне как-то совсем не мешает, что значения в свитче не вычисляются во время его выполнения. Родной, между прочим, работает так же:
                            (case 100
                              ((+ 50 50) (format t "100~&"))
                              (otherwise (format t "something else~&"))) ; something else


                            С какой стати "задача макросов конструировать выражения"? Нет, макрос это в первую очередь процедура которая не вычисляет аргументы, но вычисляет результат. То, что можно ее использовать для того, чтобы что-то конструировать - это вторично.
                            Ответить
                            • > Родной, между прочим, работает так же
                              Лолчто
                              * (macroexpand-1 '(case 100
                                ((+ 50 50) (format t "100~&"))
                                (otherwise (format t "something else~&"))))
                              
                              (LET ((#:G597 100))
                                (DECLARE (IGNORABLE #:G597))
                                (COND
                                 ((OR (EQL #:G597 '+) (EQL #:G597 '50) (EQL #:G597 '50)) NIL
                                  (FORMAT T "100~&"))
                                 (T NIL (FORMAT T "something else~&"))))
                              Ответить
                          • А... я понял, претензия к тому, что value не вычисляется? Ну так это ж для примера сделано, ну да, если по-чесному, то его тоже имеет смысл сначала eval :) Но это ж иллюстрация.
                            Ответить
                            • Снова не угадали. Проблема в том, что вы неправильно используете макросы. Они нужны, чтобы преобразовать одни формы в другие (дописать всякий скучный бойлерплейт). Компилятор вызывает макрос, передавая ему набор форм, макрос возвращает формы, которые нужно скомпилировать, компилятор заменяет этими формами вызов макроса, полученный код компилирует дальше (там могут быть другие макросы, и т.д.). Если использовать макрос в теле функции, то он раскроется только один раз, т.е. не будет вычисляться каждый раз при вызове функции.

                              Да, бывает, что макросы вычисляют всё сразу, например, если они выполняют упрощения и переданный им код не зависит от входных параметров и свободных переменных. Но это скорее частный случай.

                              В вашем же случае код в ветках выполнится на этапе компиляции, а не "в рантайме". Т.е. ваш макрос генерирует ответ, а не выражение, которое будет вычисляться для получение этого самого ответа. Следовательно, могут быть использованы только те данные, которые известны на этапе компиляции и не изменяются в процессе выполнения программы.

                              У вас всё работает только потому, что вы выполняете код в repl, где этапы компиляции и выполнения практически неразличимы.
                              Ответить
                              • Ну и где же он вычисляет значения с которыми сравнивать? Не вычисляет же. Не понял вообще сути аргумента :S
                                А кто сказал, что мне нужна эта подстановка в рантайме? Наоборот, я не хочу, чтобы это происходило - на то макросы и компилируются первыми.
                                Ответить
                                • http://ideone.com/WJcsC
                                  Код не работает как раз из-за тех проблем, которые я описал.

                                  Из этого могу заключить, что вы не можете в макросы. Кичитесь везде коммон-лиспом, а сами не осилили глубоких заложенных в нём идей. Пишите на нём какое-то императивное месиво. У меня кровавые слёзы текут от цикла с setf внутри макроса.

                                  Я даже стал понимать, почему вам CL нравится больше других языков, поддерживающих функциональный стиль. Видимо потому, что он настолько либерален, что позволяет писать программы в любом стиле, например, в стиле JS.
                                  Пора вылезти уже из своего уютненького жабаскриптового мирка, и не пытаться впихнуть в его рамки лиспы, эрланги и хаскеллы, называя всё, что не впихнулось, бесполезной ересью, а расширить свой ум и попробовать изменить методы, изменить способ мышления. Попробуйте, вам понравится.
                                  Ответить
                                  • А нафига, позвольте спросить вы его вовнутрь функции запихали? Я что-то подобное делал? Это вы решили его для этого использовать. Я ничего такого не предполагал.
                                    Ответить
                                    • ололо, нафига свитч в функцию запихали? ему же там не место!
                                      Ответить
                                      • Ну так это вы решили его так использовать - я так это даже не пытался делать. Как будто это единственный вариант :S

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

                          Написание оптимальной версии макроса - задача специфическая, нетривиальная и может потребовать пары дней для реализации.
                          Можно учитывать количество веток, и строить разные выражения в зависимости от числа. К примеру, если веток < n (где n регулируемый параметр), достаточно простого cond. Если веток много, то можно строить оптимальной таблицы переходов на основании хэш-кода строк в условиях.

                          Всё это хорошо и реализуемо, но, к счастью, нужно нечасто, и в большинстве случаев достаточно простого перебора условий по порядку.
                          Ответить
                    • рыбята...шо-то вы тут фоуд не по теме усторили)))
                      Ответить
      • Мне почему-то кажется, что тут проблемы скорее в архитектуре
        Ответить
      • показать все, что скрытоа то что тут hardcoded id Вас не волнует???? оО
        Ответить
    • В ASPX ничего не знаю, но есть предчувствие, что кто-то таким образом зачем-то сделал подписку на события (вместо обычных formEvent += eventHandler) или что-то такое.
      Ответить
      • именно)) и это только одна из многих подобных страниц)) я не стал уже скидывать else(т.е. есть еще логика, которая заполняет данные если не Postback) ;) я впал в дипрессию, когда увидел и понял что мне это надо саппортить)))
        Ответить
    • Простите за ламерский вопрос. Кто такие эти ctl00$cph...? Кто их породил? На нескольких сайтах видел подобные страшные идентификаторы.
      Ответить
      • Это ASP.NET генерит айдишники и имена элементов при рендеринге.
        Ответить
      • это ASP.NET генерит уникальные clientID для всех серверных контролов. ClientID составляется из ID родительских серверных контролов ну или как-то так...т.е. когда Вы обернете весь контент в какой-нить <asp:Panel/>, то все clientID указанных выше контролов изменятся. Выход - менять в коде проверки?)))
        Ответить
    • показать все, что скрытоThe toy company Amok Time has created the best The Day The Earth Stood Still collectible <a href="http://www.etcwatches.net/">replicas watches swiss</a> to date. The Gort and Klaatu Collectors Figure Set is an incredible sight and both come to life <a href="http://www.etcwatches.net/Iwc.html">fake iwc</a> in full color. So I'm not really sure that this changes anything. It's only forcing states to <a href="http://www.etcwatches.net/Omega.html">cheap omega seamaster watches</a> implement policies most of them already have, and the ones that haven't, should.
      Ответить
    • показать все, что скрытоIt will keep me warm at night <a href="http://www.etcwatches.net/">perfect replica watches</a> when Joss Whedon takes over Runaways. Firestorm The Nuclear Man #3$2.99 Fosters Statue Wilt And Coco <a href="http://www.etcwatches.net/">swiss replicas</a> <a href="http://www.etcwatches.net/">online replica watches</a> $125.00 Gen 13 #3 $2.99 Al: Okay, I'll say it: The entire Wildstorm relaunch has been a catastrophic failure. These earrings adorn round faces very well. Chandeliers are great for parties and red-carpet occasions.
      Ответить
    • показать все, что скрытоFake Omega timepieces will [url=http://www.etcwatches.net/]watches imitation[/url] not glow as brightly in the dark. Make [url=http://www.etcwatches.net/]watch fakes[/url] sure you assess the letters and numbers printed at the back and on the watch. But the truth is, pornography neuters a man. He becomes so wrapped up in this [url=http://www.etcwatches.net/Rolex-Datejusts.html]real vs fake rolex[/url] fantasy world that he is no longer capable of being excited by his own wife.
      Ответить
    • ему явно стоит пользоваться такими чудесными компанентами как DevExpress, там у контроллов есть булевой параметр IsCallBack. не совсем правда в тему, но у нас работало тело (человеком его трудно назвать), который сделал страницу, где на ~1500 строк кода 80% всего кода находилось Page_Init, и был ELSE IF, который перебирал все контроллы, которые назывались button1,button2,grid1,grid2, и т.п., для того, чтобы выяснить, какой контролл осуществил CallBack, и корректно отреагировать на это. и еще главное втирает мне "слушай, CallBack это такая хрень, когда ты можешь грид обновить!"... и этот человек с красным дипломом МГУ закончи :(
      p.s. сейчас его поделки достались мне в наследство, и они тупо не компилируются :(
      Ответить

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