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

    +111

    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
    [WebMethod]
    public PackageHoldResult RegisterHold(
        string login,
        string password,
        PackageHoldRequest holdRequest)
    {
        PackageHoldResult result = new PackageHoldResult();
        result.ResultCode = 0;
    
        try
        {
            // ...
        }
        catch
        {
            result.ResultCode = (int) PackageHoldRequestResultCode.InternalError;
        }
    
        return result;
    }

    Логирование?... что это?

    Запостил: svkandroid, 23 Июля 2010

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

    • Это int Login(string username, string password);

      Злое наследие WinAPI, сломавшее мозги многим поколениям программистов. Коды возврата.
      Ответить
      • И продолжает ломать. Да и не столько винапи.
        Ответить
      • не winapi а c.

        можно подумать, в позиксовых api эксепшены кидают)))))
        Ответить
        • Позикс - такое же столетнее говно, как и винапи, что должно умереть умереть умереть.
          Ответить
          • всмысле --- умереть? а что вместо него то?

            Вы предлагаете выкинуть весь существующий софт под posix и win32api, и написать с ноля?
            Ответить
            • Я предлагаю объявить все винапи как депрекейтед и поддерживать его только с целью виртуализации окружения для старых программ.

              В конце концов, сейчас винапи это прокси для нативапи, и никто не умер. Предоставить новые, удобные интерфейсы и нарисовать ими слой абстракции для недопрограмм прошлого. Программисты только спасибо скажут.
              Ответить
              • А на каком языке? Если на C, то чем оно будет лучше? Там как был error_code, так и будет -- структуру что ли возвращать?

                Если на C++, то например есть MFC же, и еще куча всего
                Ответить
                • А насчет хранения, например, id состояния в объекте, который его имеет?
                  Ответить
                • Си тоже объявить депрекатед :)
                  Ответить
                • На C++ хотя бы.

                  Там есть std::exception.
                  Ответить
                  • Тоесть Вам хочется C++ обертки вокруг win32api, верно? Так разве mfc это не делает?
                    Ответить
                    • Мне хочется, чтобы winapi был нормальным, а не сишным трехсотлетней давности.

                      Мне не нужна обертка над винапи.
                      Ответить
                      • тоесть Вы предлагаете:
                        сделать C++ обертку прямо вокруг nativeApi, а win32api объявить депрекейтед? Вот драйверописатели-то обрадуются.

                        Или вы хотите nativeApi тоже сделать на C++?
                        Ответить
                        • Еще раз.

                          Я предлагаю написать нормальный апи и реализовать нативапи на нем, как уже сделали для винапи, реализовав его на нативапи.
                          Ответить
                          • тогда исчезнет возможность писать под винду на сях, не находите?
                            Ответить
                            • Давайте еще фортран с коболом потянем в новый век, это ведь такие клевые языки! И турбо паскаль!
                              Ответить
                              • )))Вы примерно представляете себе процесс написания драйвера на С++?
                                Ответить
                                • Я даже писал драйвер на С++. Эти богомерзкие структуры и коды возврата, которые приходилось использовать вместо нормальных исключений и классов, тошнота, убивать-убивать.

                                  Писать на С++ проще, чем на чистом С. Никаких тебе __try __except и прочих низкоуровневых вещей, если хочешь - пишешь __asm и выворачиваешься.
                                  Ответить
                                  • Исключения это трудоёмкий захват контекста (сохранение регистров, сигналов + восстановление) - было бы маразмом всем этим заниматься на уровне драйвера, когда есть более быстрые способы. Тем более что драйвер messes up с хардваром так, что не гарантируется нормальный exception handling в некоторых случаях.

                                    Драйверы это single points of failure, поэтому их нужно писать как можно более производительным.

                                    Ящитаю, главное - это удобство пользователя (т.е. мучения кодера, зато скорость драйвера), и только на втором месте - удобство программиста (отсутствие мучений, зато тормоза, ага).

                                    Не ленитесь.
                                    Ответить
                                    • Экономите на спичках?
                                      Ответить
                                      • На каких спичках? Всё, конечно, зависит от компилятора и платформы, реализующей исключения, однако для драйвера там получается давно большой оверхед, из-за чего возможности хардвара используются не в полную меру.

                                        И я вообще не понимаю, зачем нужны исключения на таком уровне. Исключения это больше энтерпрайз, чтобы можно было получать красивую, развёрнутую ошибку. А в драйверах этого ничего не надо. Там чёрная работа, копоть.
                                        Ответить
                                        • Вас послушать, так все без исключения драйвера пишут мега-гуру, которые способны даже думать в машинных командах.

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

                                      Пользователю будет крайне неудобно, если комп будет тормозить из-за ошибок в драйвере. Лучше использовать более строгий язык для их избегания.
                                      Ответить
                                      • Вы действительно считаете, что ошибки в драйверах, приводящие к тормознутости связаны с отсутствием try/catch в языках, на которых эти драйверы написаны?
                                        Ответить
                                        • Си менее строгий язык, чем некоторые. Про try/catch я ничего не говорил, хотя ошибки из-за неиспользования try/catch действительно появляются. Можно легко забыть проверить успешность выполнения тех или иных операций. Огород из ифов никого до добра ещё не доводил.
                                          Ответить
                              • Однако, у C API простой и универсальный интерфейс, и он легко подключается к любому языку.

                                С другой стороны, у C++ на каждый компилятор свой хитро вы*банный mangling, и очень сложно делать биндинги к другим языкам.

                                А ограничивать апи платформы возможностью использовать только один конкретный язык - гнилой шаг.

                                Таким образом, АПИ на си, пусть си и устарел, -- лучшее на сегодняшний день решение.

                                Вообще же сейчас редко кто пишет на винапи, в основном используют обёртки (которые созданы легко и непринуждённо благодаря универсальности C API), и проблемы реально никакой нет.
                                Ответить
                                • Проклятые ретрограды... Неужели непонятно, что при желании можно и ежика в папирус завернуть? Нет, мы будем гордиться универсальностью. Классы не нужны. Аспекты не нужны. Метаинформация не нужна. Голый си. Может на ассемблере все будем писать? Зато какая интероперабельность!
                                  Ответить
                                  • > Классы не нужны. Аспекты не нужны. Метаинформация не нужна. Голый си. Может на ассемблере все будем писать? Зато какая интероперабельность!

                                    Вы троллите?

                                    Интерфейс операционной системы должен быть по своему призванию как можно более универсальным.

                                    Так вот, не каждый язык объектный. Не каждый язык аспектный. Более того, в разных объектных языках может быть разная, несовместимая меж собой "объектность". Попытка скрестить между собой разные платформы привела бы к костылям, тормозам. И это отнюдь не спички. В нативном АПИ обычно никто не пишет, используются разные фреймворки (legacy ли, кросс-платформенности ради ли). Поверх этих фреймворков обычно пишутся ещё свои какие-то минифреймворки. В совр. приложениях множество слоёв абстракции, которые замедляют выполнение. Так зачем же изначально прибавлять ещё один ненужный слой абстракции, без которого можно обойтись?

                                    А чего вам не хватает в ВинАпи, собственно говоря? Там есть объекты. Они эмулируются семантически. Там есть метаинформация.

                                    "Голый си" это ведь на деле просто синтаксис. В винапи есть и объекты, и методы этих объектов, и полиморфизм (мы можем вызывать функцию на хендлы разных типов), и инкапсуляция (мы не можем прочесть внутреннюю структуру, использующуюся ОС), и своего рода классы (напр., классы окон). Наследование эмулируется аггрегацией, обёртками.

                                    Проблема высосана из пальца.
                                    Ответить
                                    • Проблема будет высосана из пальца тогда, когда умрет GetLastError - убогое наследие однопоточности.
                                      Ответить
                                      • > Проблема будет высосана из пальца тогда, когда умрет GetLastError - убогое наследие однопоточности.

                                        И чё? В совр. ВИНАПИ, как и errno в совр. POSIX'ах, потокобезопасны
                                        Ответить
                                    • >> В винапи есть и объекты
                                      Вы об objectManager и хэндлерах?:)

                                      На самом деле ООП это ведь просто следующий шаг развития модульного программирования на чистых сях. Концепции в нем заложены те же самые. Просто вместо object->method() там method(link_to_object), вместо приватных методов -- статические итд..

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

                                      Так что мнения некоторых товарищей, дескать "винда глючная потому что на с, а если переписать на с++ -- станет стабильной и быстрой" напоминают мне маркетинговые статьи про .net от microsoft о том, что до появления гарбич коллекторов -- все программы текли памятью, и написать рабочий код на языке без автоматического управления кучей -- невозможно.
                                      Ответить
                                      • >написать рабочий код на языке без автоматического управления кучей -- невозможно.

                                        Рабочий? Легко. Надёжный? Сложнее.
                                        Ответить
                                        • Да и не намного сложнее. Придерживаешься определенных собой же правил и, при условии хотя бы среднего проектирования в уме, получается надежно. За кучей кстати следить прекрасно можно опять же (тривиально debug_new в студии и какой-нибудь valgrind в gcc). Не намного в общем сложнее.
                                          Ответить
                                  • кстати, это вы зря. когда идет речь о программировании низкоуровневых вещей, такие, как драйвера, которые должны работать быстро - вполне можно использовать "голый" С без исключений, ооп и прочих плюшек. а, если нужно, то и ассемблер.
                                    да, не так удобно, как привычно, но задача того требует.

                                    и наоборот, писать юзеро-интерфейс с кнопачками и проч, на ассемблере - тоже точно такой идиотизм. Нет, то есть, никто не запрещает, но тут вряд ли достоинства низкоуровневого языка оправдают его недостатки

                                    как то так

                                    п.с. надеюсь, не будете кричать, что, мол, сегодня компы такие мощные, что можно за производительностью не гоняться?
                                    Ответить
                                    • Я считаю, что не следует экономить на спичках.

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

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

                                            поэтому, с одной стороны, нельзя при написании кода городить хитровыебанные непонятные конструкции, а с другой, нельзя его писать левой ногой, оставляя приведение его в человеческий вид на самое "потом"
                                            Ответить
                                            • У меня нет никаких гарантий, что нормально написанная программа на С++ будет хоты бы на 10% медленнее своего аналога на С.
                                              Ответить
                                        • В драйверах кстати есть SEH, на секундочку.
                                          Ответить
                                  • объекты, аспекты, dependency injection и иже с ними нужны что бы побороть возростающую сложность софта. Когда Вы пишете приложение, метафора которого не способна уложится целиком в голове, в котором тысячи понятий и сотни бизнес-правил -- объектно-ориентированный подход помогает разложить все по полочкам.

                                    Но когда Ваш алгоритм прост и очевиден -- врядли Вы будете использовать ООП. Врядли Вы будете юзать объекты что бы считать данные в буфер и там их отсортировать, например.


                                    Большинство драйверов (именно драйверов, а не приложений вообще) это именно такие, четкие и понятные алгоритмы.
                                    Опросил устройство. Если оно готово -- считал через IO какие-то данные, положил в определенное место.


                                    Так что профит даже от ООП тут будет не велик.

                                    Это конечно не касается обычных десктопных приложений, которые под час сложнее энтерпрайза.

                                    Что же касается ассемблера, то аналогия не вполне удачна. Во-первых я очень сомневаюсь, что мы с Вами напишем более оптимизированную программу на ассемблере, чем на сях. Потому что мы в любом случае писать будем что бы было читаемо, а не что бы оптимально. А компилятор генерит нечитаемый, но оптимизированный код.

                                    Во-вторых на каждом уровне -- свои абстракции.
                                    Если мне надо вызвать прерывание -- я напишу на асме: это быстрее и проще. Если мне надо оперировать массивами байт -- я напишу на си, потому что я не хочу думать о регистрах. Если мне надо оперировать понятием "пользователь" и "его покупки" -- я лучше напишу на java (например), потому что мои понятия ложаться в объекты, а не в массивы и не в прерывания или регистры.

                                    Ничто не мешает мне сделать C++ обертку вокруг кода, вызывающего прерывание, и получить в итоге объект, и вызывать у него метод -- но это оверхед.

                                    Так вот драйверы работают на уровне массивов байт (чаще всего, не всегда конечно). Потому си для них ближе и роднее в большинстве случаев.

                                    Мне трудно представить себе драйвер, где во всю юзаются паттерны Observer или Visitor например.
                                    Ответить
                                    • Конечно.
                                      Глупость вместо DrawPixel писать driver->DrawPixel, лишь бы вот чтобы для галочки был ООП.
                                      Ответить
            • >всмысле --- умереть? а что вместо него то?
              Вы не знаете? Ну как пример, дотнетовские классы даже кидают исключения, хотя экспортируются из длл'ок.

              Управляемые классы (что-то типа дотнетовскх) уже используются для написания большинства частей сверх надёжных, но пока эксперементальных ос и их драйверов. Такая система с трудом способна упасть при падении драйвера. Счастье админам. Сейчас падающий или зависший драйвер крашит систему. Пример тому эксперементальная ось Microsoft Singularity. Некоторые ей пророчат замену Win 7ки через 5ку лет. Сингулярити - не единственный подобный проект, развиваемый в данный момент.
              Ответить
              • >>Такая система с трудом способна упасть при падении драйвера.

                И что будет например, если драйвер обратится к выгруженной памяти?
                Ответить
                • Почитайте доки, если Вам интересно. Я не создатель. Просто привёл факты из статей.
                  Возможно, подгрузит, если в данном контексте это допустимо или нагенерит исключений. Это уже все равно не важно, если уже не остановить. Драйвер упадёт, система останется стоять, а не ляжет в бсод.
                  А вот обращение к указателю на мусор - там принципиально практически не возможно написать.
                  Единственная проблема - DMA. Только с её помошью можно испортить память. Хотя и это частично там обезопасили.
                  Ответить
                  • >>Просто привёл факты из статей.
                    а можно пруфлинки?

                    >>Возможно, подгрузит, если в данном контексте это допустимо или нагенерит исключений.
                    Обычно подгружать нельзя, ибо на этом interrupt level не разрешена смена конктекста...

                    >>Драйвер упадёт, система останется стоять, а не ляжет в бсод.
                    вообще-то bsod запускается специально, потому что считается что упавший драйвер может натворить дел (например заглючил драйвер ntfs и снес пол диска). Винда специально врубает bsod (ф-я есть в nativeapi), так что это никак не связано с тем, написан код на C или на Vb.NET :)

                    >>А вот обращение к указателю на мусор - там принципиально практически не возможно написать.
                    да, я вкурсе как работает CLR. Но повторюсь: bsod бывает не только от указателя на мусор (хотя gpe конечно может случится), а еще от запрещенных действий кого-то на нулевом кольце защиты, приведших например к исключению (со стороны процессора).

                    Так что посыл "переписали с С на C# и сделали систему без бсодов, переживающую падение любого драйвера" звучит как маркетинговое ляля для меня)
                    Ответить
                  • а, понял о чем Вы. Судя по википедии -- в ней не используется хардварное разделение процессов, все работают на одном кольце, и разделены средой выполнения (SIP).

                    И потому один конкретный драйвер не может испортить память другого драйвера.
                    Таким образом ошибки, связанные с загаживанием чужой памяти (которая общая на все kernel-mode процессы -- от ядра до драйверов) в ней отсутствуют.

                    Но это не убирает проблему упавшего драйвера жесткого диска, при котором система просто по правилам безопастности должна будет лечь в бсод, например
                    Ответить
                    • хардварное? в сингулярити?

                      тоесть для этой ос надо разработать новый хардвер с прошитым туда CLR? какой версии?
                      Ответить
                      • _не_ используется) читайте внимательнее
                        Ответить
                        • прошу пардону. у меня была очень длинная пятница.
                          получается, что безопасность системы определяется реализацией менеджера среды выполнения. интересно, много ли его кода можно отправить в тутошний раздел си шарп? )
                          Ответить
                          • Немного не в тему. Я таки согласен, что всякие механизмы у меня лично в шарпе (!) вызывают сомнение. Однако в любой органике можно найти форму говна.
                            Ответить
                            • >всякие механизмы у меня в шарпе (!) вызывают сомнение
                              Всякие - это все?
                              Ответить
                              • Нет, что ты. Я в шарпе далеко не профи. Просто как-то... Ну короче ты понел. Даже без доказательств.
                                Ответить
                                • >Я в шарпе далеко не профи. Просто как-то...

                                  Вы в шарпе не профи, потому что слишком просто?
                                  Ответить
                                  • Не, просто мне показался не интересным. Но давно это было, а щаз питон как-то предавать не хочется)
                                    Ответить

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