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

    +135

    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
    private void Button2_Click(object sender, EventArgs e)
        {
          this.Label4.Text = new StreamReader("C:\\Program Files\\Microsoft Visual Studio 10.0\\VB\\VBProjects\\датаметр\\датаметр\\bin\\Release\\Key.txt").ReadLine();
          if (Operators.CompareString(this.Label4.Text, "vrc5rhhgyuuoxr45", false) == 0)
          {
            this.Button1.Visible = true;
            this.TextBox1.Visible = true;
            this.Label1.Visible = true;
            this.Label4.Visible = false;
            this.Button2.Visible = false;
            this.Label3.Visible = true;
            int num = (int) Interaction.MsgBox((object) "Ключ верный.\r\nНе сообщайте его никому !!\r\nИ не потеряйте.", MsgBoxStyle.OkOnly, (object) null);
          }
          else
            this.Label4.Text = "Ключ не верный !!\r\nПоменяйте его в файле \"Key\"";
        }

    Классное расположение файла. Причём в архиве лежит пустой файл Key.txt рядом с программой...
    Как надо было извратиться, чтобы в коде оказался не просто абсолютный путь, но и вот такой-вот с Program Files, ведь по умолчанию VS создаёт проекты в Моих документах

    http://www.cyberforum.ru/vb-net/thread971437.html

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

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

    • Потом он вырастет и будет писать говнософт, который требует админских прав и пишет конфиги с C:\Windows
      Одмины уже кастуют проклятье 80 левела на автора
      Ответить
    • > Не сообщайте его никому
      > vrc5rhhgyuuoxr45
      Ты нарушил условия, и ждет тебя страшная кара от автора!
      Ответить
      • И правда, зачем нам шифроваться? Гласность же)

        Путь доставляет. В идеале под каждый комп должен быть свой персональный путь. Жесткий как стальная балка
        Ответить
    • Господи! Изыде! Да это просто п****ц какой-то!
      Тут можно перечислять до бесконечности:

      1. Наименования события и контролов - говнокод
      2. Реализация - говнокод
      3. Расположения читаемого файла - говнокод. Есть же метод который возвращает путь кататола, откуда запущено приложение. А проверить, если файл в этой жопе не существует?
      4. Полностью непонятна реализация, почему "vrc5rhhgyuuoxr45" константа? Может приложение компилируется каждый раз с этим новым значением?
      5. Button1.Visible = TextBox1.Visible = Label1.Visible = Label3.Visible = true - так получше
      6. int num не исполуется
      7. Вместо "\r\n" - Environment.NewLine

      Наверника я ещё упустил пунктов 10
      Ответить
      • А ты злой
        Ответить
      • Не-не. Стоп. Такой список - это перебор.
        Во-первых, я немного не сказал, что код декомпилированный...
        1. Да, имена действительно такие.
        2. Нет, вполне нормальная.
        3. Да. Но меня больше удивило не то, что абсолютный путь (ну есть люди, которые не думают об этом), а именно что там Program Files причём в таком виде, что очевидно, что человек тупо все проекты хранит именно там - с какого перепуга??
        4. А мне непонятно, как скачавший приложение должен был её угадать... Да ещё и постоянно редактируя файл с ключом...
        5. VB.NET такие присваивания не поддерживает. К тому же, при компиляции оно всё равно развернётся.
        6. Возможно такой вызов MessageBox - последствия применения функции MsgBox. Точно сказать не могу, но не думаю, что там что-то плохое было...
        7. А смысл? vbCrLf - вполне нормально. Заодно и одной строкой записалось, а не конкатенацией при выполнении...
        Ответить
        • > должен был её угадать
          Ему должны были ее прислать, когда он купит прогу... Зачем он должен ее угадывать?
          Ответить
          • > Зачем он должен ее угадывать?
            Эм.. А ты открывал ссылку, написанную рядом с кодом? Это из той программы, которая там во вложении. Ни о какой покупке ничего не говорится, да и не может говориться ;)

            Кстати, даже в самом коде фраза "Ключ не верный !!\r\nПоменяйте его в файле \"Key\"" как бы намекает, что ключ надо именно подбирать.
            Ответить
            • > А ты открывал ссылку, написанную рядом с кодом?
              Нет конечно :) Мой девиз: "Ссылки не читай @ хуйню отвечай".
              Ответить
      • Забыл сказать. Естественно, эта штука падает при нажатии кнопки, поскольку нужного файла нет - никаких обработчиков ошибок там нет и в помине.
        Ответить
    • а я было подумал, что это VB
      Ответить
      • Это было написано на VB.NET и декомпилировано в C#.
        В принципе, по коду это видно: Operators.CompareString и странный Interaction.MsgBox.
        Ответить
        • вот она, многоязыковость. код, написанный на быдлоязыке, компилируется в такой же убогий байткод, по сравнению с тем, во что бы компилировалось написанное более мощным и гибким языком.
          меня мучают сомнения, а не компилируется ли вдруг, по причине совместимости, написанное лучше, в такой дикий ужас, как написанное на языке с более слабыми возможностями?
          Ответить
          • А если декомпильнуть его на F#, то код автоматом станет функциональщиной :)
            Ответить
            • а декомпиляется?
              Ответить
              • А кто бы знал. У меня нету вижуалки.
                Ответить
                • я почему-то думаю, что не любой код можно (а тем более алгоритмически) записать в процедурном стиле. кстати, монады так и появились на свет (что нарушают святые каноны ФП)
                  Ответить
                  • Еретическая монада в хаскеле вроде бы всего одна: IO. Все остальные либо вообще девственно чисты (например State), либо состоят с IO в заговоре (и тоже чисты, т.к. всю грязную работу за них делает IO) :)

                    А F# вроде бы и не борется за функциональную чистоту, так что скорее всего на нем можно спокойно писать любую императивщину...
                    Ответить
                    • > F# вроде бы и не борется за функциональную чистоту
                      Есть чистые контейнеры, но не более.
                      Ответить
                  • Можно. Это следует из архитектуры процессора.
                    Ответить
                    • не очень понял.... поясните мысль?
                      (по мне, ассемблер - чистая что ни есть императивщина)
                      Ответить
                      • Эм.. Императивный и процедурный - это одно и то же. Если процессор способен только на императивный код, то любой функциональный к нему приводится. В противном случае, процессор не смог бы его выполнить ;)

                        Разумеется, я подразумеваю доступность возможностей типа передачи указателей на функции для их последующего вызова, ну и всего остального. Т. е. без поверхностных языковых ограничений.
                        Ответить
                        • ну вот я том, что любой функциональный код приводится к императивному, в то время, когда обратная задача очень творческая, а иногда и невыполнимая - что-то сродни написанию стихов.
                          Ответить
                          • Не знаю. Думаю что можно...
                            И вообще, функциональные языки не на столько функциональные, чтобы в них не было циклов...
                            Правда на F# я не писал...
                            Ответить
                            • > функциональные языки не на столько функциональные, чтобы в них не было циклов
                              Вы не поверите...
                              Ответить
                            • Кстати, по поводу циклов мне очень понравилось вот это выступление
                              http://channel9.msdn.com/Events/GoingNative/2013/Cpp-Seasoning
                              Ответить
                              • Я думаю что выражу общее мнение, если скажу, что майкрософтский видеопроигрыватель дерьмо.

                                PS: Cколько не смотрю видяхи этого парня, то мне все кажется что он капитан.
                                Ответить
                                • Поднять уровень абстракции! Отбросить циклы! TURBO MODE, сухопутные крысы!
                                  Ответить
                                  • >Отбросить циклы!
                                    Да вроде я их никогда и не писал. Ну в школе ещё может. Он все правильно говорит. Просто для меня это очевидно. Если будете ещё постить видеолекции, то я буду ждать и обязательно посмотрю.
                                    Из этой его лекции я всё-таки узнал что-то новое, а именно групперовка в определенном месте контейнера через стейбл_партишан, а второе тупл в С++11 иногда почти такой-же короткий, как в хаски:
                                    tuple<int, string> f(int a){
                                      if(a>=0)
                                        return {a, "unsigned"};
                                      else
                                        return {a, "signed"};
                                    }
                                    Ответить
                            • Подмена теплого и мягкого. Главное, что бы F# давал возможность писать хороший функциональный код. А не только фунциональный код.
                              Ответить
                              • Напоминаю, что это было сказано в контексте декомпилации в него.
                                Ответить
                  • >я почему-то думаю, что не любой код можно (а тем более алгоритмически) записать в процедурном стиле
                    Тогда надо срочно идти читать про тьюринг-полноту.

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

                      тьфу-ты, я хотел написать - в функциональном. мои извинения.
                      Ответить
                      • > я хотел написать - в функциональном
                        Написание на хацкиле эмулятора брейнфака должно развеять и эти сомнения.
                        Ответить
                        • просто я не осилил ФП в виде даже какой-нибудь scala или clojure
                          это для меня слишком математический подход

                          для меня ФП пока ограничивается лямбдами. чистые функции высшего порядка я писать неспособен.
                          Ответить
                          • даже find?
                            Ответить
                            • что вы имеете ввиду?
                              Ответить
                              • find с предикатом (например как в ruby) - типичная чистая функция высшего порядка.
                                Ответить
                                • можно какую-нибудь ссылку на почитать и разобраться?
                                  я все еще лелею надежду осилить ФП, тем более, что саморазвитие меня туда упорно сталкивает со всех дорог.
                                  и тогда я, наверное, уйду в scala
                                  Ответить
                                  • Завтра ищешь в интернете книжку Categories for the Working Mathematician Изучай Haskell во имя добра!. Похуй если ничего не поймешь. Затем идешь на haskell.org и изучаешь стандартную библиотеку от корки до корки. Потом зубришь, именно, сука, вызубриваешь определения языка и стандартных библиотек - The Haskell 2010 Report, чтобы от зубов отскакивало. Когда напишешь свой первый катаморфизм, по пути изучив теорию типов на уровне TaPL-а, скачиваешь и изучаешь любую хаскеллевскую библиотеку с первоклассными функторами и морфизмами, рекомендую category-extras или recursion-schemes. Как переделаешь стандартную прелюдию, чтобы по крайней мере все рекурсивные схемы были выражены через комонады, можешь идти дальше - тебя ждет увлекательный мир теории категорий. Катаморфизмы, параморфизмы, зигоморфизмы, хистоморфизмы, препроморфизмы, анаморфизмы, апоморфизмы, футуморфизмы, постпроморфизмы, хиломорфизмы, крономорфизмы, синкрономорфизмы, экзоморфизмы, метаморфизмы, динаморфизмы алгебра и коалгебра Калвина Элгота наконец. Успех хиккующих выблядков / просто быдлокодеров типа рейфага или сисярп/джава-девелоперов, которые работают в Люксофте не будет тебя волновать и уже через пол года ты будешь получать такие гранты, что любой профессор будет теч при одном упоминании списка твоих публикаций.

                                    _______________
                                    На счет жирной книги, переведенной на русский я серьёзно. Написана с наркоманскими картинками для нубов типа тебя:
                                    http://www.knigograd.com.ua/images/detailed/978-5-94074-749-9_270_auto_jpg.jpg
                                    Ответить
                                    • Хах. На обложке голубой слоник.
                                      Ты и в реале так выглядишь?
                                      Ответить
                                      • >На обложке голубой слоник. Ты и в реале так выглядишь?
                                        Ты в реале думаешь, что авторы книги будут печатать на обложке книги фотографии неуловимого джо?
                                        Ответить
                                    • Да, книжка неплоха, очень легко читается (по сравнению с RWH). Мне она помогла понять зипперы.
                                      Ответить
                • Вижак не нужен, он не умеет декомпилировать.
                  Я использовал JetBrains dotPeek (он бесплатный, кстати).
                  Ответить
                  • > не умеет декомпилировать
                    Чтобы что-то декомпилировать нужно сначала это что-то скомпилировать... А компилятора у нас нет. И в винду перезагружаться влом.
                    Ответить
                    • > Чтобы что-то декомпилировать нужно сначала это что-то скомпилировать...
                      Ну во-первых, можно скачать, а не компилировать самому.
                      Во-вторых, вижак и чтобы скомпилировать не нужен. Компилятор входит в .NET Framework b компилировать можно на любом компе, где он установлен. http://bbs.vbstreets.ru/viewtopic.php?f=2&t=44609
                      Ответить
                    • > Чтобы что-то декомпилировать нужно сначала это что-то скомпилировать...
                      Чтобы декомпильнуть что-нибудь ненужное, нужно сначала скомпилировать что-нибудь ненужное...

                      P.S. Как будет правильно звучать совершенный вид для "декомпилировать"?

                      P.P.S. Случился бсод, а написанный до первого "P.S." комментарий остался. Мелочь, а приятно.
                      Ответить
                      • Ой, сорри, хотел поставить плюс, а попал в минус. Когда уже страйко их разнесет по разные стороны числа...
                        Ответить
              • Маловероятно, что кто-то написал подобный декомпилятор... Но теоретически, думаю, должен бы, если там ничего специфического нет...
                Ответить
          • Как же надоело, что все не любят VB.NET. Нормальный язык.
            Ответить
            • в нем отсутствуют очень многие хорошие возможности.
              ну и еще многословность, атавизм всех этих кубейсиков и паскалей.

              вот скажите, новичкам и вправду легче изучить программировать на бейсике или паскале, чем на сисярпе\жабе\жабаскрипте\фитоне\руби\и т.д.? потому что он "похож на естественный аенглийский"?
              по мне, это чисто "черепашья графика"
              Ответить
              • > в нем отсутствуют очень многие хорошие возможности.
                В том-то и дело, что ничего там не отсутствует из того, что доступно в шарпе без флага unsafe, ну и нескольких фич, которые не особо нужны...
                Просто все помнят другие бейсики и их репутация сказывается. VB.NET - совсем другой язык. Там есть всё необходимое. Все .NET-классы, наследование, интерфейсы, виртуальные и абстрактные методы и классы, перегрузка операторов, биртовые операции (в том числе сдвига), логические операции, условный оператор и ещё куча всего.

                > новичкам и вправду легче изучить программировать на бейсике или паскале
                Я не новичок, на паскале никогда не программировал. Начинал программирование с си и си++. Потом некоторое время писал на VB6. Затем перебрался на .NET, долго не мог разобраться с VB.NET - он реально другой. Примерно в то же время, но чуть позже на шарп. VB.NET лично мне приятнее, как-то более близок к духу си.

                http://bbs.vbstreets.ru/viewtopic.php?p=6756794#p6756794
                Ответить
                • я рад, если все в самом деле так неплохо, но "ложечки нашлись, а осадок остался"
                  Ответить
                • зы
                  > VB.NET лично мне приятнее, как-то более близок к духу си.
                  странно читать такое. мне казалось, что дистанция далека.
                  а вот Java\C# являются неким древним знаменем, каким должно быть программирование в стиле ООП. хоть сишарп я и недолюбливаю, но, тем не менее, уважаю за его синтаксический сахар по сравнению с жабой.
                  главное в языке, я считаю, отсутствие излишних низкоуровневых манипуляций там, где им не место, чем СиСи++ грешат-таки.
                  Ответить
                  • Ну так в плане таких манипуляций C# и VB.NET одинаковы. Ну если не шмякнуть шарпу ключ unsafe, чтобы залезть в указатели... Вопрос только, зачем? Вот мне ни разу не понадобилось.

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

                      вообще идеальным языком был бы D, будь у него сообщество, документация, поддержка IDE
                      Ответить
                    • >правда они появились в новой версии
                      Что, восьмерка уже вышла?
                      Ответить
                  • >> VB.NET лично мне приятнее, как-то более близок к духу си.
                    > странно читать такое. мне казалось, что дистанция далека.
                    Я имел в виду, в плане контроля за программистом. Он не будет заставлять меня явно приводить double во float, а decimal (которым представлено значение в NumericUpDown) в int (ну я же знаю, что там целое число от 1 до 100) - нафига мне шарпоконтроль, что у decimal более широкий диапазон значений? Ещё он нормально пишет предупреждение, а не ошибку на неинициализированные переменные и отсутствие return.
                    Ответить
                    • Краткое содержание предыдущего комментария: Шарп мешает мне ваять говно, он плохой. Обижусь на него, и уйду к Бейсику.
                      Ответить
                      • Не правда. Надо думать что пишешь. А говно можно писать на чём угодно. Почему в си неявные сужающие приведения разрешены? Да потому что реально уйма случаев, когда они нужны.

                        Вот работал на шарпе с библиотекой OpenXML - это штуковина для генерации docx-файлов. Так вот, там всё построено на типе uint, а в шарпе все индексы списков, массивов и всего остального - это просто int. Задолбался с явным приведением по несколько раз в каждой строчке!!!
                        Ответить
                        • Да я в основном не про приведения, а про отсутствие return и инициализации. Если компилятор начинает ругаться на это - это уже намек на то, что у кода довольно запутанный control flow, и что даже человек-читатель, скорее всего, будет материться читая этот код...

                          На простейшие случаи типа:
                          void test() {
                              int a; // здесь нет инициализации, но умный компилятор промолчит
                              if (b > 5) {
                                  a = foo(...);
                              } else {
                                  a = foo(...);
                              }
                              if (a < 10) {
                                  return 5;
                              } else {
                                  return 42;
                              }
                              // тут нет return, но компилятор знает, что он тут и не нужен
                          }
                          уже, наверное, ни один компилятор не ругается...
                          Ответить
                          • Если a - float, ругнулся бы, что новичка сбивает с ног.
                            Ответить
                          • Пример if-return-else-return - это как раз плохой стиль написания кода. Хотя да, компилятор понимает, что ещё один return не нужен.

                            А вот пример, когда не понимает:
                            static int test(int x)
                                {
                                  switch (x & 3)
                                  {
                                    case 0: return 17;
                                    case 1: return 32;
                                    case 2: return 45;
                                    case 3: return 11;
                                  }
                                }
                            Что, очень сложный?

                            А вот пример на неинициализированную переменную:
                            static int test(int x)
                                {
                                  int y;
                                  bool pos;
                            
                                  pos = x > 0;
                            
                                  if (pos)
                                    y = 12;
                            
                                  if (pos)
                                    return y;
                            
                                  return x;
                                }
                            Между одинаковыми проверками мог бы быть какой-то код, из-за которого их нельзя совместить.
                            Ответить
                          • > Если компилятор начинает ругаться на это - это уже намек на то, что у кода довольно запутанный control flow, и что даже человек-читатель, скорее всего, будет материться читая этот код...
                            А если посмотреть именно в контексте ошибка или предупреждение?
                            Хороший программист всё-таки предупреждения смотрит :)

                            Вот я привёл два куска кода. Предположим, что в нём понадобилось что-то изменить. Человек меняет и если он замечает относящееся к этому коду предупреждение, то он всё-таки задумывается, затрагивает ли каким-либо образом его код эту ситуацию. Например, меняет в switch'е 3 на 7. При наличии предупреждения, он поймёт, что оно его касается. Если же там в конце стоит throw, то остаётся надеяться, что оно упадёт у него, либо в скором времени при тестировании. А если там return 0, то всё это чудо может ещё неизвестно сколько работать неправильно...

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

                      з.ы. всегда проверяю код встроенными предупреждениями JetBrains Idea, а также FindBugs, и при их, грамотно настроенных, добиваюсь исчезновения всех предупреждений.
                      Ответить
                      • В том-то и дело, что я не хочу на каждый чих тыкать компилятор, что да, это именно то что я имел в виду.
                        На всякий случай скажу, что перечисленные мной возможности по приведению типов исчезнут, если написать Option Strict или включить соответсвующий флаг в свойствах проекта.
                        Про неинициализированную переменную предупреждение будет в любом случае. Нафига мне там ошибка? Я и предупреждения читаю, если они есть.
                        Ответить
                        • а по мне, лучше пусть компилятор мне 1000 раз проматерится, и я буду иметь ввиду что я дурак.
                          и потом при поиске багов я буду знать, где именно и в чем именно я дурак, и в нужных местах просто усложню читаемость кода в угоду компилятора, зная о последствиях.

                          а не то, что компилятор стерпит, а ты потом матери и его, и себя, и его создателей, и бога за то, что сегодня ночь с пятницы на субботу, когда все нажрались, а ты, трезвый и потому злой, ищещь этот несчастный баг, который нужно пофиксить ASAP, бо типа кто-то там может потерять миллионы или просто расстроиться и сменить ориентацию фирму.
                          Ответить
                          • Не забывай, что рантайм-проверка останется в любом случае, как в шарпе, так и в бейсике, если от неё специально не избавиться для целых чисел. И если оно упадёт с overflow exception, то ты увидишь где.
                            Ответить
                            • ну вот я и рад, когда падает экцепшон со всем стектрейсом, вместо сишного "seg fault at address 0xgggggggg"
                              и от этого не избавиться, иначе бы нам грозило светлое будущее совсем без багов
                              Ответить
                      • > и это не энергозатратно
                        Это увеличивает длину строк и снижает читабильность кода. Например, если в строку на 240 символов (примерно 260 - это ширина экрана) добавить охапку явных приведений, то её придётся скроллить...
                        Ответить
                        • для чего сущуствуют пробелы, табуляции, вынесение особо сложных выражений во временные выражения. комментарии наконец
                          несмотря на то, что я фанатик инлайна единожды использующихся выражений\методов и оформлению более чем одноразовых выражений в локальные переменные\методы, а также других сомнительных рефакторингов
                          Ответить
                          • > для чего сущуствуют пробелы, табуляции,
                            Хм.. Они тут при чём? Предлагаешь удалить полезные пробелы, чтобы впихнуть бесполезное (float)?

                            > вынесение особо сложных выражений во временные выражения
                            Лично мне проще прочитать длинную строку, чем охапку из 5 временных переменных, которые больше нигде не нужны. Даже если что-то выношу для отладки, потом загоняю обратно.

                            > комментарии наконец
                            И что с ними? Ну будет стоять коммент перед строчкой и что? Скроллить-то её всё равно придётся.
                            Или написать так:
                            // Я не виноват, что эту строку надо скроллить, просто компилятор требует явного указания сужающих приведений типов, все притензии в Майкросовт
                            Причём обязательно после строки, чтобы сделать её ещё длиннее :D
                            А ещё лучше инлайновым комментом перед первым приведением *ROFL*

                            > несмотря на то, что я фанатик ...
                            Я тоже, если только речь не о элементарных действиях типа
                            return (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2);
                            Ответить
                            • > Предлагаешь удалить полезные пробелы, чтобы впихнуть бесполезное (float)?
                              наоборот, добавить, для разграничения и читаемости.
                              Ответить
                              • От этого строка станет короче o_O
                                А деление одного оператора на строки обычно на читаемость влияет весьма отрицательно...
                                Ответить
                                • ну хотя бы исчезнет горизонтальный раздражающий скроллинг.
                                  и придет понимание, почему выражения сгруппированы именно так, и как они связаны.
                                  Ответить
          • > а не компилируется ли вдруг, по причине совместимости, написанное лучше, в такой дикий ужас, как написанное на языке с более слабыми возможностями?
            Нет. Компилируется в IL, возможности которого куда больше того же шарпа.
            Например, чтобы сделать экспортируемую функцию (видимую из нативного кода), надо (помимо прочего) декомпилировать dll, дописать команду и скомпилировать снова. На обоих языках.
            А ещё там есть модификатор видимости, неподдерживаемый шарпом. Да и ещё уйма всего.

            От VB.NET тут осталисть только те два момента, которые я указал. И чем больше программист будет использовать функций из VB-библиотеки, тем больше подобного будет вылазить...
            Ну ещё обёртка My и запуск приложения.
            Ответить
            • значит, и правда, IL не во все можно декомпильнуть.

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

              но надо отдать должное, VB с первых версий был легче, чем всякие СиСи++ с их жоглированием звездочками\амперсандами\уголками и грозным падением хз почему при невинной ошибке.
              Ответить
              • > а в VB вижу атавизмы еще с более древних версий
                Перечисли пожалуйста. Я не вижу. Более того, код аналогичный VB6 ведёт себя иначе в некоторых ситуациях...

                > вроде обязательное соглашение по наимнованиям
                Нет такого. Ну кроме последствий того, что он case insensitive.

                > отсуствие более гибких структур
                конкретнее

                > многословность
                Спорно... Есть тот же блок With, которого больше нигде нет.
                Многословность и заодно длиннословность я бы 100% приписал джаве.

                > некоторых обязательных бредовых требований
                Да, есть несколько. Типа цикла For...
                Ответить
                • > Есть тот же блок With, которого больше нигде нет.
                  В паскале? :)
                  Ответить
                  • Я не писал на паскале. К тому же, он там кривой. Точнее, кривая возможность запихать туда несколько переменных.
                    И с джаваскриптовым не надо сравнивать - тот вообще вредный и его крайне нежелательно использовать.
                    Я имел в виду шарп, си и джаву.
                    Ответить
                • сейчас всего не упомню, я несколько выпил, и дело давнее, но повторюсь в таких моментах:
                  почему каждому For надо писать Next, While - Wend, и т.д. т.к. в си-подобных языках хватает двух унифицированных для всех случаев (однобуквенных!) символов?

                  соглашения по именованиям - ну тех, типа Button1_OnClick

                  бредовых требований, типа - процедуры (это которые не возвращают значения) записываются ключевым словом Sub и не имеют скобок при вызове, а функции - должны засиываться как фукции Function, иметь скобки и возвращаемое значение.

                  --
                  итог: тем лучше язык, чем более он лаконичен при его простоте и понятности, и имеет наименее исключений.
                  Ответить
                  • > Next, While - Wend
                    Круче только bash с его case - esac.
                    Ответить
                  • > почему каждому For надо писать Next, While - Wend, и т.д.
                    Ну да, надо. Такой уж у него синтаксис.
                    Но отсюда можно и плюс вытянуть:
                    Do While X < 123
                    For Q As Integer = 0 To N-1
                    For W As Integer = 0 To N-1
                    For E as Integer = 0 To N-1
                    ' ....
                    If Smth Then Exit Do ' А попробуй-ка так сишный break применить :D
                    Next E
                    Next W
                    Next Q
                    Loop

                    > соглашения по именованиям - ну тех, типа Button1_OnClick
                    Были в VB6. В VB.NET их нет. Правда такое именование является принятым и для VB.NET и для C#.
                    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
                    Кстати, опять плюс бейсика, что этот handles написан в твоём коде, а не в коде дизайнера. А то в шарпе обработчик удалил (ну не нужен он тебе) и оно не компилится, т. к. в дизайнере ссылка на него осталась...

                    > Sub vs Function
                    Ну синстаксис такой... Можно же одно слово изменить, если надо.
                    Кстати, опять же, отсюда можно достать плюс в виде однострочной лямбда-процедуры, вызывающей нечто возвращающее значение.
                    Хотя это и в шарпе всего лишь парой фигурных скобок решаентся.

                    > и не имеют скобок при вызове
                    Сейчас у всего ставятся скобки. Вариант без скобок допустим только в случае отсутствия аргументов (как в паскале, да?), причём если это не внутри выражения, то вижак сам добавит скобочки.
                    Правда побочный эффект - можно ставить скобки при обращении к свойствам, а это оказывается плохо, если свойство возвращает делегат (указатель на функцию).
                    Ответить
                    • как хорошо, что послабления спустя 10 лет все же даны.
                      Ответить
                    • >А попробуй-ка так сишный break применить :D
                      break на метку?

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

                        > Упсь, и что теперь?
                        То что запись MyObj.SomeFunc() будет вместо вызова возвращённого делегата означать то же самое что MyObj.SomeFunc - обращение к свойству. Для вызова делегата понадобится написать либо (MyObj.SomeFunc)(), либо MyObj.SomeFunc()().
                        Ответить
                        • Уточнение. Имеется в виду случай, когда делегат не принимает аргументов. Если же аругументы есть, то лишняя пара скобок не нужна.
                          Ответить
                        • >break на метку есть только в джаве
                          >только в джаве
                          Херню сказал.
                          Ответить
                        • И что плохого в goto на метку из цикла?
                          Ответить
                          • В принципе, лично я ничего против не имею.

                            Но всё-таки при написании такого кода следует позаботиться, чтобы в циклах переменные не создавались, поскольку некоторые компиляторы могут при таком переходе пропустить вызов деструктора. А может даже и со стеком что-то не то сделать. Это про плюсы, естественно.

                            В общем, моё мнение: goto из цикла использовать можно и это намного лучше, чем использовать флаг, но при этом позаботиться об отсутствии переменных, область видимости которых ограничена циклом крайне желательно.
                            Ответить

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