Си диез / Говнокод #9855 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
double fact(int value)
        {
            switch (value)
            {
                case 0:
                    return 1;
                    break;
                case 1:
                    return 1;
                    break;
                default:
                    return value * fact(value - 1);
                    break;
            }
        }

Вычисление факториала

Запостил: zzANDREYzz zzANDREYzz, (Updated )

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

    • Видимо, в том, что case 1: не нужен... (ну а в реальном приложении еще нужно было бы проверить аргумент и бросить исключение, если < 0)
      Ответить
        • Никто не никого тгавит.
          Просто поциенты считают, что Linq - панацея от всего. В том числе от отсутствия головного мозга.
          И пихают оный где нужно и где не нужно.

          Циклы, например - не нужны. Есть where и лямбды.
          Треды не нужны - есть asParallel. Алгоритмы - не нужны, есть Linq. Мозг не нужен - пусть за меня думает Microsoft.

          >ЛИНКВ удобная тема.
          Правильно. А факториалы нужно считать рекурсивно через switch.
          Ведь умный конпелятор сам сделает из кейсов конфетку.
          Ответить
          • А что, я считаю, что .foreach - это красивее, чем императивное полотно с циклом. Мне нравится стиль ЛИНКВА.
            Ответить
            • То есть порождение анонимной функции, верней делегата, который потом вызывается в цикле тебе кажется однозначно красивей, чем обычный foreach - C#, for ~ in - js итд.

              То есть паттерн Стратегия с динамическим связыванием и вызовом разных функций с идентичными сигнатурами, однозначно красивей, чем императивный оператор switch?

              А функция-предикат однозначно красивей, чем императивный if?

              >Мне нравится стиль ЛИНКВА.
              И сахар в виде extension-методов тебе тоже нравится, когда вызывается как бы метод объекта, а на самом деле это какой-то левый статический метод.
              Это тоже красиво?!
              Ответить
                • Но позвольте, у меня все ходы записаны.
                  http://www.gamedev.ru/flame/forum/?id=147021&page=7

                  Или надо написать тривиальный case (оператор множественного выбора).
                  Нормальный человек пишет case.
                  Поциент, больной оопиозом головного мозга, напишет по одному классу на каждую ветку этого case, а сам case заменит на вызов виртуального метода.
                  Для каждого case - свой набор классов.
                  Кол-во классов у такого поциента может быть астрономическим, код сам по себе пухнет из-за тормозных абстракций на ровном месте.
                  Ответить
                  • Да ты же меня подловил.
                    Для полноты слива мне осталось только добавить "я всё это учудил для того, чтобы потроллить".

                    На самом деле я сторонник KISS. Но .where и .foreach таки красивее чем цикл.

                    А .AsParallel ВАЩЕ ОХУЕННО!!!
                    Ответить
          • Идеи filter, map, reduce и многих других функций высшего порядка настолько естественны и элегантны, что критиковать их у меня язык не поворачивается.
            В 90% кода приложений, с которыми я работаю, разница в производительности цикла и функции высшего порядка не имеет значения (вызов веб-сервиса порой занимает пару секунд, какой смысл экономить на спичках?), и я скорее отдам предпочтение функциям высшего порядка.
            Функции высшего порядка не отменяют необходимости анализа алгоритмов, и уж сложности они точно не прибавляют (немного меняют константы, но не порядок).
            Преподносить LINQ как какую-то уникальную технологию - смешно, ведь все идеи, лежащие в его основе, известны уже десятки лет (всё это довольно детально описано в SICP). Но и ничего плохого в нём я не вижу.
            Ответить
            • >Преподносить LINQ как какую-то уникальную технологию - смешно
              Именно.

              >и я скорее отдам предпочтение функциям высшего порядка.
              Но это совсем не повод совать функциональщину где попало. Даже в тех местах где обычный цикл короче и эффективней.

              И не нужно забывать про оверхед (в жабе вовсе чудовищен, но и в более продвинутом шарпе его хватает), когда для написания кастомной логики нужно создавать дополнительные объекты типа делегатов, extension-методов и других вспомогательных сущностей.
              Ответить
              • Да, в java оверхед слишком часто перевешивает преимущества. Тем не менее, иногда встречаются места, где очень много однотипных, лишь немного отличающихся операций. И тут я имплеменчу несколько com.google.common.base.{Predicate, Function}, оформляю их в виде синглтонов и использую Lists и Iterables. Так циклы на восемь - десять строк превращаются в одну строку, реюзабилити повышается, и смысл кода становится гораздо более очевидным.
                Ответить
                • >Тем не менее, иногда встречаются места, где очень много однотипных, лишь немного отличающихся операций.
                  Тут, безусловно, такой подход легитимен. Собственно для увеличения энтропии кода он и создан.
                  Но и злоупотреблять не стоит, ибо функциональный код иногда читается хуже, чем императивный.
                  Ответить
                  • > ибо функциональный код иногда читается хуже, чем императивный
                    С этим я и не спорю. Хотя компактность, как правило, повышается. Здесь, как обычно, на помощь приходит чувство меры.
                    Ответить
                      • И мне обычно тоже. Но ведь я не один в проекте работаю, ещё примерно 80 человек. Сколько из них вообще слышали о FP? единицы. А сколько чувствуют себя уверенно с этой парадигмой?.. Кто будет править код, когда я перестану работать в этом проекте? В итоге никто ведь не будет разбираться, допишут кривых императивных костылей и пойдут пить пиво.
                        Ответить
                        • Верно. Про то я как раз хотел написать, что функциональное очевидно не всем.
                          И про меру тоже правильно сказано.

                          Короче, новомодная функциональщина как и когда-то ооп, полезны не всегда.
                          Как я уже говорил выше: считать linq серебрянной пулей - нельзя.
                          Да и вообще зря они в изначально сбалансированный структурно ооп-шный язык вносят спорные улучшения.

                          Как по мне, то шарп теряет свою стройность, которая была в версии 2.0 и потихоньку превращается в эзотерику подобную С++, где напихано всего и помногу.
                          Адептам пейсать всё на linq порекомендовал бы пересесть на какой-то функциональный язычок, где императивно кодить попросту нельзя.
                          Ответить
                            • Собственно на няго я намякал.
                              Но мне больше по нраву православный Nemerle.
                              Ответить
  • 1)Лишние брейки.
    2)Нет проверки аргуентов (уже назвали).
    4)Нужно объединить кейсы 1 и 0 (уже назвали).
    5)Лучшеб не выпендривался и написал не рекурсивный алгоритм.
    6)Добавил бы мемоизацию аля массив.
    Ответить
  • и еще момент: double не придает ли коду очарования потери точности? 🙂
    Ответить
  • е,D$O?W,MM:R?G)R!L!Z.N"N!S$Q.C.U$G D(S!BZ?J$I!W NW"F.U Q,Z,I A,V$U,S)B!LK,I.Y?L,J!T!C:X(G$L$T:T)G!D?X.X F)G K)L C?V,L$D?H,B!F:E)M"P(T?J"V:N:T$T$Q?E(M:N.H$L"V.J:S:T:G:J:P?Z!AT.P)R.X(N!V.T?W.X:B,J:X,F(I,O!R)S!B R$N(SQ:Z$F(E(F?H!L.Y"U!N.W$X,M(D$I!W)U?F.K?P!C(TD:J Q:Q"Y$V:IT?G?T"S(M)Y(B$L:M"F(I,T"M,E C)O(K?G)I!V.EJO.K.L?BO!I"O,P X(W:E!P$WD(T!V$I$E(B"X?AH?G$S(N"P P:X(Y.PU)R R C)E$C,SQAM.J$R(P(B(G)H)N,Q:Y"BB?E!G.W U!Q Z.M.I G:L(W(E"J!V,K!S(E?U)W?F"M.N(G(F$D$H"C)J!Y.Z.I.G?M"C.S:T!Z.W(I.EO.C)R G)D$S:H(C X?P(E"E!J!F)Z(HS?U E!W C(S$H.O X(LH"D,C"C(N$V E"Y,G"Q?I:ZF)UN$Q"MHL:O"Y)K"M"X?B I!N,N:Z"VS L:V?G(M!I(Q)K.V"D!Y F)X.S?F K$J$IQ(EV(R?I D!S"W"Z(V?O!J:A$F!N:M)A)U)B)OZ,U?M$Z,O W:F)R?S,S?A I$L.X!D)X?P(M!T J R B$F:W"V S,I$MU:U.V$E$VX)CI)O.B?Z$W?Y C)B)P)E H!J,N(B Q.R(G J:T J(TN!K:Q(E$I$S.I)Y$KH,I)D(B.H,S:E,D:D)F(A)Q"GБNLBBBAUPTUUULNLZAGTQROHSEYWUUDDIOUOWYKUDVLJASFILBAAWMUTTHTQZOQEXAKCVEXXFHLUXUBTWQSDCIZPVOJKFDSMRYXJIJHAUHSMYIYZYIFZYPKFOBSRRHUBPNOAAOJRPGHSFBHEAGYXYEPKIHWEVZTIFNOADKLNJXUURJVYTESNAQHKDZCVBKFCDXWJHGBPOZYFJZZUADXNECLNWYOYPOIFRGROERJZEFJNEXWUXEZIWHHZRQADCIYSQYHMKGINLCXOVBRVDVPTEWEHMYFXHKEIMYG
    Ответить

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8