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

    +121

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    private static bool ProductGT10(Point p)
        {
            if (p.X * p.Y > 100000)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

    Классический пример из MSDN
    http://msdn.microsoft.com/ru-ru/library/bfcke1bz.aspx

    Запостил: kegdan, 10 Июля 2013

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

    • Для примера - самое оно. Т.к. конструкцию:
      return p.X * p.Y > 100000;

      придётся разжовывать.
      Примеры по класическому ASP.NET'у тоже включают в себя код используя SqlDataSource, а не Entity или LINQ to SQL.
      Ответить
      • Что в этом плохого?
        Ответить
        • Плохого в разжовывании или в не интрепрайз примерах?
          Разжовывать - оба кода имеют место быть. Мало-ли какие идеалы используются в отдельных компаниях.

          А SqlDataSource написать можно быстрее:
          <asp:SqlDataSource ID="ds" SelectCommand="SELECT * FROM Table1" runat="server" />
          <asp:GridView DataSourceID="ds" runat="server"/>

          Да и использование в качестве примера DAO/DAL только породит лишние вопросы.
          Ответить
          • Простите, спрашивал про разжевывание. Ведь, понимание того, какие инструкции будут выполнены, мне кажется важным.
            Ответить
            • Простите, спрашивал про разжевывание.
              Код:
              if(p.X * p.Y > 100 000) return true;
              else return false;

              Можно прочитать даже не зная языка, но зная школьную программу математики:
              Если Х умножить на У больше 100 000, то вернуть true. Иначе вернуть false.
              А вот код:
              return p.X * p.Y > 100000;

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

      PS по ссылке у меня открывается статься "Predicate(T) Delegate" где нет этого примера
      Ответить
      • показать все, что скрытоУпоролся - это говно, тотальное говно.

        Это над минимум так писать:
        private static bool ProductGT10(Point p) {
          if((p.X * p.Y) > 100000)
            return true;
          return false;
        }


        А вообще, если твои ученики животные, которое не осилили примитивный Си-синтаксис, то они животные - и твоя ЦА животные, ибо этот код питуш, как в примере выше:

        return ((p.X * p.Y) < 100000);
        Ответить
        • Было б круто если:

          return if((p.X * p.Y) < 100000);
          Ответить
          • Синтаксический сахар Синтаксическое говно. Зачем там этот if? Результат сравнения - бул, вернуть нужно бул, зачем писать лишнюю херню?
            Ответить
          • P.S. В perl'е такая штука сработает как
            if (p.x * p.y < 100000) {
               return;
            }
            Ответить
        • > return ((p.X * p.Y) < 100000);
          Зачем скобки вокруг выражения?
          Ответить
          • Крамольная мысль: возможно, царь с идеальным знанием сишечки сомневается по поводу приоритетов операторов.
            Ответить
            • Легко запутаться
              return (p.X * (p.Y < 100000));
              Ответить
              • IDE подскажет, что Int32 с Boolean не перемножаются. Это не сишечка.
                Ответить
              • Насчет приоритетов:
                a = 7;
                b = 2;
                x = a + b<<3;
                Чему равен х? Только честно, без компиляции ;)
                Ответить
                • Я точно знаю. Когда первый проект на С писать очень долго этот баг ловил. Все перепроверил, но заподозрить что приоритет << отличается от логичного, принятого в том же паскале не мог.
                  Ответить
            • Да не, я не про внутренние скобки, которые вокруг p.x * p.y. Я про внешние, которые вокруг возвращаемого выражения. Просто часто в сишном коде попадаются эти return (42).
              Ответить
              • Судя по гуглу:
                http://dev.fyicenter.com/Interview-Questions/C/Are_the_outer_parentheses_in_return_stat ements_r.html
                http://stackoverflow.com/questions/161879/parenthesis-surrounding-return-values
                раньше скобки были нужны.
                Ответить
              • А, это я тоже часто замечал. Например, у Скиены в его книжке по алгоритмам. В своём проекте тоже частенько нахожу. Подозреваю, это пришло от мелкософта с его любовью к макросам, содержащим return. Типа чтобы не думать, надо ли писать скобки или нет.
                Другой вариант - чтобы стейтмент был больше похож на другие управляющие структуры вроде if и for.
                Ответить
              • показать все, что скрытоЯ привык записывать то, что возвращает результат выражения в скобочках. return 42; Я никогда не пишу.

                return a + b + c + d; - питушня.
                Ответить
                • Дак ты и есть главпитух, ты не понял еще, питух?
                  Ответить
                • Не, я еще понимаю ежели обьекты складываешь - ибо аглем говорит нам, что ассоциативность, коммутативность и аддитивность - частные случаи, но тут налицо сишная шизофрения
                  Ответить
                  • а я всегда ставлю скобки. я не доверяю приоритету операторов после опыта с Б3-21
                    Ответить
                    • Так Б3-21 — это же стековый калькулятор для царей, боящихся анскильных реализаций со скобочками. После него только постскрипт учить...
                      Ответить
                      • сомневаюсь, что радужная пони осилила обратную польскую запись
                        Ответить
                        • Царь все что нужно профессионалу знает. Не сомневайся, обратная польская запись не нужна никому кроме анскильных питушков. Я напишу свой ЯП без этой питушни.
                          Ответить
                          • > Не сомневайся, обратная польская запись не нужна никому кроме анскильных питушков.
                            А оно так и есть. Польская запись она для стековых машин. А таких сейчас мало, почти все машины регистровые. На том же x86 польская запись пригодится разве что при работе с FPU.
                            Ответить
                            • IL, JVM?
                              Ответить
                              • Насчет MSIL ничего не скажу, вообще не в курсях ;)

                                LLVM'овский IR - регистровый.

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

                                P.S. Ну и я так думаю, что Царь не будет связываться с .net или jvm, а все-таки будет генерить нативный код.
                                Ответить
                                • Цитата из FAQ DotGNU:
                                  Why don't you use gcc as the basis for your C# compiler?

                                  ...

                                  The hard part is RTL (Register Transfer Language). This part of gcc is hard-wired to generate code for register-based CPU's such as i386, PPC, Sparc, etc. RTL is not designed for generating code for stack-based abstract machines such as IL.

                                  Also, RTL loses a lot of the type and code structure information that IL needs in the final output file. By the time RTL gets the code, information about whether a value is an integer or an object reference is mostly lost. Information about the class structure of the code is lost. This information is critical for correct compilation of C# to IL.
                                  Ответить
                                  • именно по этому я за LLVM/шляк
                                    Ответить
                                    • (set (reg:SI 140)
                                           (plus:SI (reg:SI 138)
                                                    (reg:SI 139)))
                                      Ответить
                                    • LLVM тоже под регистровые хуйни заточен. Например, есть процессор Мультиклет, на который этот LLVM плохо ложиться:
                                      https://habr.com/ru/post/209732/comments/#comment_8710245

                                      > LCC был выбран, потому что в кодогенератор он передаёт кусочки графа программы, что идеально подходит для архитектуры Multiclet. При этом, в каждом линейном блоке графа нет ссылок на узлы из других блоков. Это соответствует концепции параграфов.

                                      > «Монстры» же ориентированы на генерацию кода для чисто регистровых машин, к которым наши процессоры не относятся в полной мере: внутри параграфов у нас стоит потоковое (dataflow) описание вычисления. Поэтому мы не можем автоматически использовать оптимизации, которые есть в LLVM и GCC. При помощи абстракций, используемых в них для описания архитектуры целевой машины, такие потоковые машины не выражаются (по крайней мере, штатными API). Например, LLVM при оптимизации спокойно выносит общие выражения в линейные блоки за циклы, а в линейных блоках циклов ставит на этот результат ссылку, подразумевая, что она соответствует абстрактному регистру, который не меняется. Для нас разрешение такой ситуации — совсем не тривиальная задача.

                                      > Поэтому нам приходится изобретать свой компилирующий велосипед. Надеемся, что в нём будет достаточно интересных фишек, чтобы привлечь к оптимизациям и разработке нормальных API сообщество.

                                      т.е. в этом отношении он нихуя не лучше GCC
                                      Ответить
                                      • какой багор
                                        какой багор

                                        а почему? Потому что железные процы обычно регистровые а виртуальные мащины типа йажа дотминьет -- стековые но всем похуй?
                                        Ответить
                                        • Именно поэтому я за Dalvik, она регистровая.
                                          Ответить
                                          • Привет, коллега! Если ты не уёбок, конечно. Тоже не нравится Путин?
                                            Ответить
                                            • Гамарджоба!

                                              1. Как определить, уёбок я или нет?

                                              2. Я мужик, поэтому мне не нравится Путин. Я же не ослоёб, чтобы мне нравилось всё, что движется.
                                              Ответить
                                              • > Как определить, уёбок я или нет?

                                                > Я же не ослоёб

                                                Сам спросил - сам ответил
                                                Ответить
                                • (продолжение)

                                  But hang on a second! Gcj, the Java back-end for gcc, does stack machines! Why not do something like that?

                                  Err ... no it doesn't. The Java bytecode stuff in gcj is not organised as an RTL back-end.

                                  When gcj compiles Java, it performs parsing and semantic analysis in the front-end, like the other supported languages. Then the parse tree is sent in one of two different directions.

                                  If gcj is compiling to native, the parse tree is handed to the RTL core of the compiler, and it takes over.

                                  If gcj is compiling to bytecode, the parse tree is handed to a completely separate code generator that knows about Java bytecode.

                                  Because gcj does NOT implement a bytecode RTL back-end for gcc, it cannot compile C, C++, etc down to bytecode. Java bytecode is a special case that only works for the Java front-end.

                                  But what about egcs-jvm? Doesn't it compile C to Java bytecode?

                                  It's a hack. The code that it generates is horrible, and does not conform to the usual conventions that the JVM requires. If one compiled Java code using this back-end, it wouldn't work with normal Java code due to the differences in calling conventions and what-not.

                                  The biggest problem that the author of egcs-jvm he had was trying to work around the register machine assumptions in the code. The result wasn't pretty. He has said that it would be easier to throw the JVM away and invent a register-based abstract machine than try to make gcc generate efficient stack machine code.
                                  Ответить
                                • (окончание)

                                  Isn't there a gcc port to the Transputer, which is stack-based?

                                  Yes there is, for an older version of gcc (2.7.2). The source can be found here.

                                  ...

                                  Realistically, someone with a great deal of gcc knowledge needs to go into the gcc core, rip RTL completely out, throw it away, and replace it with something that knows about both register machines and stack machines.

                                  Alternatively, someone could create a STL (Stack Transfer Language), that passes all languages through a separate code generator that knows about stack machines. Then we can write STL back-ends for IL and JVM bytecode. Both gcj and DotGNU would benefit from this.
                                  Ответить
                          • Я напишу свой шарпик! С сканнером! И парсером!
                            Ответить
                    • именно потому я за польскую нотацию
                      Ответить
                • Ебать дебил.
                  Ответить
          • Мало скобок. Надо было так писать:
            return (((p).X * (p).Y) < 100000);
            А вдруг p — это макрос?
            Ответить
            • > вдруг p — это макрос
              Вдруг p это макрос, написанный ниасилятором макросов.
              fxd.
              Ответить
            • В сисярпе???
              Ответить
              • Кто ему мешает запустить cpp над сисярповским исходником...
                Ответить
            • А вдруг X — это макрос?
              Ответить
              • А вдруг return это макрос?

                UPD: а ну да, для того и внешние скобки.
                Ответить
                • P.S. Кстати, замакрив return можно замутить сишкодеструкторы, срабатывающие при выходе из функции.
                  Ответить
                  • #define return (x) exit(0)
                    так?
                    Ответить
                    • Ну это уж совсем жестоко ;) Я все-таки имел в виду совсем другой пиздец cleanup handler'ы, которые набиваются в некий стек, а потом по return'у вызываются. Очень приблизительный код с раскрытыми макро:
                      // BEGIN_FRAME;
                      dtor_frame *dtor_last = NULL;
                      
                      char *s = malloc(...);
                      // CLEANUP(s, free);
                      dtor_frame dtor_r1 = { s, free, dtor_last };
                      dtor_last = &dtor_r1;
                      
                      int fd = open(...);
                      // CLEANUP(p, close);
                      dtor_frame dtor_r4 = { p, close, dtor_last };
                      dtor_last = &dtor_r4;
                      
                      // return (42);
                      return call_dtors(dtor_last), (42);
                      Ответить
        • Если они уже осилили то какие они нах ученики?
          И да, согласен что ЦА msdn.microsoft.com - жывотные :)
          Ответить
    • Как я понял, основной гк тут в if() return true else return false.
      Ответить
    • показать все, что скрытоОБСЛУЖУ В ЖЕНСКОМ БЕЛЬЕ КАВКАЗЦЕВ ТАДЖИКОВ УЗБЕКОВ НА СТРОЙКАХ РЫНКАХ СМС 89119017975 ИЩУ СУТЕНЕРА КАВКАЗЦА АЗИАТА МОЖНО ВЛАСТНУЮ ЖЕНЩИНУ 89119017975
      Ответить
    • Что за пиздёж?
      msdn.microsoft.com/ru-ru/library/bfcke1bz.aspx

      Где здесь сабж, kegdan?
      Ответить
      • Действительно, там сейчас в комментариях пример:
        private static bool FindPoints(Point obj)
           {
              return obj.X * obj.Y > 100000;
           }


        Неужели они заглянули в Говнокод и исправили?

        P.S. Действительно, раньше там был пример, процитированный Кегданом:
        http://web.archive.org/web/20091013032219/msdn.microsoft.com/ru-ru/library/bfcke1bz.aspx
        Ответить
      • фоменок ты засрал говнокод
        Ответить

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