1. C++ / Говнокод #2367

    +65.2

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    case WM_DESTROY:
        // Microsoft, you MORONS! Don't destroy stuff I create!
        // Oh well, try to handle this as gracefully as possible so we
        // don't send any commands to the now non-existent window:
        tablet_close(hWnd);
        if (window) window->destroy();
        fl_prune_deferred_calls(hWnd);
        break;

    FLTK. В свое время заставило похихикать.

    Запостил: Altravert, 04 Января 2010

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

    • Где сдесь С++?
      Ответить
      • Вот window->destroy();
        Ответить
        • Эка невидаль, указатель на функцию, в C такое тоже есть.
          Ответить
    • А что не так? Комментарий?
      Ответить
    • Мне кажеться здесь частично внешняя и частично внутренняя обработка сообщений относительно класса Window. Тоесть нужно было или внутрь этого класса её заносить или наружу. Типичное не верное проектирование.
      Тут даже не проверяеться, а вдруг сообщение пришло для другого hWnd, а не для того, что относиться к классу Window. Тоесть это типичное не верное смешение Си и Си++ логики программы.
      Ответить
      • Проверяется. В начале обработчика по hWnd выбирается Window * window из списка существующих. Я имел ввиду коммент.
        Ответить
        • Все равно говнокод из-за перемешивания устаревших и новых методов. Нарушаеться главный принцип - инкапсуляция. Ничто не должно, способное нарушить логику работы объекта, выходить за его приделы...
          Ответить
          • Во-1, где здесь устаревшие и новые?
            Во-2, что здесь выходит за объект, или хотя бы нарушает логику?
            Ответить
            • Здесь смешиваеться старый WinAPI метод обработки сообщений и новый объектный метод работы с окнами. Обработка сообщений хоть и должна быть, но по крайней мере внутри объекта.
              Ответить
              • А, вот про что. Но здесь не работа с окнами объектная, класс только обертка.
                Я вот, честно говоря, патылся в свое время запихнуть обработчик внутрь класса, но у меня не получилось. В итоге согласился, что эта реализация вполне сносна. Позже мне показали один из вариантов, как это можно сделать, однако это больше походило на секс с мозгом, причем он в этой фантазии оказался мужиком -- то есть ничего приятного. Это было очень криво, извращенно и уродливо.
                Но мне до сих пор в принципе интересно, поделись если знаешь как можно.
                Ответить
                • А ты взгляни на дельфи, WPF, QT и прочие визуальные библиотеки. Там-то все в классы спрятали. ;) Точно. Взгляни на QT. Он бесплатен и с открытыми исходниками. В своё время тоже делал обертку для окон. Все очень красиво получилось и без brainfuck. Банально закрепляешь указатель на обьект окна с hWnd при помощи SetWindowLong например. Дальше каждый раз его извлекаешь через GetWindowLong и вызываешь функцию обьекта для обработки сообщений, например CurrentWindow->MessageHandler( hWnd, uMsg, wParam, lParam);. И всё. Вся обработка внутри обьекта. QT конечно интереснее, но в 100 раз больше. Так что нужно разбираться. За сим всё.
                  Ответить
                  • Хм. Я честно не вижу особой разницы.. Извлекать и вызывать-то тоже внешний обработчик должен? Или как?
                    Ответить
                  • Вобщем, эти умные дяди видимо не осилили,или не посчитали нужным.
                    Ответить

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