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

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
namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static int WordCount(this String str)
        {
            return str.Split(new char[] { ' ', '.', '?' }, 
                             StringSplitOptions.RemoveEmptyEntries).Length;
        }
    }   
}
....
string s = "Hello Extension Methods";
int i = s.WordCount();

http://msdn.microsoft.com/en-us/library/bb383977.aspx

In your code you invoke the extension method with instance method syntax. However, the intermediate language (IL) generated by the compiler translates your code into a call on the static method. Therefore, the principle of encapsulation is not really being violated. In fact, extension methods cannot access private variables in the type they are extending.

Синтаксический сахар. Бессмысленный и беспощадный.
Ждк, когда шарпоблядки уже начнут дохнуть от диабета.

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

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

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

      Или это априорное утверждение, что MSDN полон говна?
      Ответить
  • что характерно, каждый до-диезный пост собирает сотни баттхерта тех, кто ничего другого не осилил
    Ответить
          • Между прочим, в дельфе под IL partial classes продвигали как killer-фичу. Суровые люди: у меня из-за такого сахара знакомство с новыми библиотеками виджетов проходит как "отрыл доку-припух от количества методов-пошел дальше писать на винапи".
            Ответить
            • так это ж хорошо, когда методов много, главное, чтобы по иерархии распиханы были
              Ответить
                  • При этом документированы они - вот так, всем скопом, без разбиения на классы в иерархии. К какой абстракции какой метод/свойство относится, отследить сложно уже сейчас.
                    Ответить
                    • кэп подсказывает что такой хелп генерит тулза. и она дублирует описания методов их базового класа в наследники. и то что оно так выглядит - проблема мсдн-а, а не .net-а.
                      Ответить
                      • это проблема быдлокодерского .NET, который в свою очередь является проблемой клиентуры MSDN
                        Ответить
  • > Ждк, когда шарпоблядки уже начнут дохнуть от диабета.

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

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

        да и в темноте просто веселее.
        Ответить
        • Ты хочешь сказать, что на светлой стороне нет всех этих структур данных? Они все есть и даже больше.
          Ответить
    • > все что это экономит время, без потери производительности, как по мне чистый плюс.
      А все, что без особой надобности усложняет язык и понимание кода. Так что становится неясно - принадлежит ли этот метод классу или это extesion откуда-то из недр проекта.
      Тоже хорошо?
      >чистый плюс.
      Два плюса. В тред приглашается Тарас
      Ответить
      • мужик. открой студию. расширкния видны невооруженным глазом
        Ответить
  • Код говно, микрософт мудак. Плюсую.

    Сам метод нормальный, но подозреваю, что код, использующий этод метод говнище то ещё.

    А если взглянуть на список разделителей слов, то он явно не полный.
    Ответить
      • А вот школота учится по таким примерам, и потом думает, что это нормально и я вижу такой код в своих проектах. А у меня от этого потом батхерт. И я прихожу, злой на говнокод, на говнокод.ру.
        Ответить
        • Они же не обдумывая порой копипастят в чистом виде примеры такого вида в проект. Как тут можно сдерживать свой батхерт после этого?
          Ответить
    • Говно или нет, но и junior'ы и даже senior'ы туда лазят исправно. И лично мое мнение, что стоит сказать огромное спасибо мелкомягким за то, что такое пособие имеется, и там во многом расписано все очень подробно и понятно, не смотря на встречающиеся там ляпы и банальные примеры.
      Ответить
      • Очень жаль, что многие из тех, кому это необходимо, туда не лазят.
        Ответить
        • А это уже типичная ошибка новичков, которые считают что мануалы и faq это только для неудачников.
          Ответить
          • Новичкам сложно читать MSDN. Даже если они знают Английский.
            Это справочная информация, а новичку полезней гайд читать(книжку) о том, как правильно реализовывать тот или иной сценарий.
            Ответить
            • Думать им тоже вредно. Нужно посмотреть в книжке "300 готовых рецептов на <Somelang-here>".
              Ответить
      • Спорить не стану. Документация у MS всегда была получше, чем у конкурентов.
        Искать говнокод в учебных примерах и на геймдеве - "I am a wimp" сложность.
        Ответить
        • По сабжу: сахар или нет, но дает возможность каждый раз не писать тонны кода создавая обертку.
          Ответить
          • Допустим у нас есть extension-class
            public static class ExtClass
            {
            public static void extFoo(Bar bar,P1 p1,P2 p2)
                {
                   ....
               }
            }

            И мы вызываем метод
            bar.extFoo(p1,p2)                 //фича
            ExtClass.extFoo(bar,p1,p2) //нормальный вызов
            
            //кстати в яве есть import static методов и там можно написать так (после импорта метода конечно)
            extFoo(bar,p1,p2)

            Мне неясно в чем профит? О каких тоннах кода речь?
            Ответить
            • >//кстати в яве есть import static методов и там можно написать так (после импорта метода конечно)
              Выглядит приятнее обоих методов, но в этом случае нет автодополнения, специфического для данного интерфейса, и списка методов, которые есть в случае "bar.*".
              Ответить
              • >но в этом случае нет автодополнения ... списка методов, которые есть в случае "bar.*

                c чего ты взял?
                import static ...ExtClass.* //импортит тебе все статик методы
                Ответить
                    • Прикольная либа, только отзывы о ней не очень. Сам уже начал писать что-то похожее, только не для работы с коллекциями, а для хитрого маппинга, типа
                      // trivial example, just for demo
                      ruleSet(
                          greaterOrEqual(0).mapTo("positive"),
                          every(Integer.class).mapTo("negative")
                      ).apply(5); // "positive"
                      . В своём проекте заюзал, хочу как OpenSource либу оформить.
                      Ответить
                      • Мне тоже не особо понравилась, как разобрался. Только одна фича сделанная через cglib заинтересовала.
                        select(sales, having(on(Sale.class).getValue(), greaterThan(50000)))
                        getValue() - каждый раз выдает разные значения из списка.

                        Ну и структура проекта (для общего развития).

                        Как говорит автор: если можете - юзайте Scalу.
                        Ответить
                        • Да, фича с on тоже сразу в глаза бросилась. Давно не видел ничего столь выразительного. Сразу полез в сорцы: смотреть, как сделано.
                          Ответить
                    • Нащупайте на спине у женщины позвоночник и ведите по нему вниз. Пупок будет по счёту третьей дырочкой.
                      Ответить
                      • непонятно при чем тут плоская шутка про женский пупок, но все же
                        если найти программиста-женщину
                        то можно обрадоваться умению считать лишь до двух
                        начиная и с живота тоже
                        Ответить
            • Я написал не про тонны кода во время вызова, и я, кстати, не сильно понял при чем тут java.
              Кстати о вызовах, представь как будет смотрется какой-то хитрый linq запрос через методы без этого сахара.
              Ответить
              • >при чем тут java
                Расскажу страшную тайну: Шарп изначально скраден с Жабы, чуть менее чем полностью.

                >представь как будет смотрется какой-то хитрый linq запрос
                Вот! Собственно о чем я и говорил позавчера:
                >http://www.govnokod.ru/8652#comment122393

                Выходит, что MS добавила в язык extensionы ради всего-то одной новой технологии - LINQ, и частного случая - флуент-интерфейса.
                Ответить
                • >Расскажу страшную тайну: Шарп изначально скраден с Жабы, чуть менее чем полностью.
                  И что тут такого? Все у всех все тырят, и жаба тут тоже не исключение.

                  >Выходит, что MS добавила в язык extensionы ради всего-то одной новой технологии - LINQ, и частного случая - флуент-интерфейса.
                  Зато очень полезная и удобная технология. Мне кажется, что оно того стоило.
                  Ответить
                  • А еще они на основе экстеншинов HtmlHelper советуют реализовывать. В ASP.NET MVC
                    Ответить
              • Кстати вспоминил старую фичу VB - оператор With. Тоже сахар, но идея здравая тем, что для компонентов можно было структурировать сетящих св-ва говнокод, а-ля:
                With Form1
                	.Width=1000
                	.Height=200
                	.Left=(Screen.Width-.Width)/2
                	.Top = 100
                	.Caption="Очередная говноформа"
                	.Autoredraw=true
                
                	.foo()
                	итд...
                	Form2.Style=.Style
                End With

                Так вот безо всяких флуентов можно было писать подобный код, причем даже гибче.
                Нет ограничений - метод возвращает this, нет ограничений на порядок: Form2.Style=.StyleНо и в бейсике оно довольно убого, а вот в языках с хорошими препроцессорами или макросами можно творить чудеса не захламляя язык ненужными дерьмом.
                Ответить
                      • Твоё мнение не особо нужно.
                        Интересней было бы послушать Тараса.

                        >Clojure есть макрос doto:
                        как я и сказал в спойлере: макросы - рулят.
                        Ответить
                        • Да, в этом особая прелесть лиспа: если тебе нехватает синтаксической конструкции - напиши макрос. Это до сих пор является основной killer-фичей лиспа, всё остальное уже проникло в другие функциональные языки (Nemerle тоже предоставляет отличные макросы, но лисповые вроде пока круче). В новую версию Scala думают тоже засунуть макросы (только ещё пока не могут решить, нахрена они там нужны).
                          Ответить
                          • > Nemerle тоже предоставляет отличные макросы, но лисповые вроде пока круче

                            Сложно сравнивать макросы языков с динамической и статической типизацией.
                            Немерловые макры не менее круты, но их запись несколько сложнее (более громоздкая) именно из-за статической типизации.
                            Ответить
                            • А макросы Nemerle позволяют, например, писать код в обратном порядке:
                              ;; hypothetical lisp macro
                              (code-back (0 x (0 x >) if))
                              ?
                              Ответить
                              • Странно. Клянусь Немерлом, вчера с делал здесь коммент, но сейчас его почему-то нету.

                                Повторю.

                                Насколько мне известно, в макрах Немерла нельзя так писать. Но зачем?

                                Вообще, в Nemerle2 макросистема будет кардинально переработана. Авторы обещают блэкджек и прочее.

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

                          тарас подтвердит: хорошо сосет
                          Ответить
                        • with в Дельфи есть.
                          Я даже один раз нарвался на баг, когда with перекрыл внутренним именем внешнее. Но такие вещи надо на уровне компилятора пресекать или хотя бы предупреждение выдавать.
                          Ответить
                          • 1)Пробовал with использовать, как using namespace?
                            2)Анонимные объекты на основе with использовал когда-нибудь?
                            Ответить
                            • 1. Да, это там обломчик случился.
                              2. Да, и это шикарно.
                              with TBitmap.Create do...
                              Ответить
                      • правильна тебе лучше сосати чем ебло раскрывать и гавкать
                        Ответить
                    • Он есть в Паскале, Пайтоне, JS, VB и роде бы есть есть что похожее в лиспах
                      Ответить
                • Такая же фишка есть в JS, её раньше часть использовали для имитации namespace'ов, но теперь её не советуют использовать из-за проблем со scope.

                  В Clojure есть макрос doto:
                  (doto (java.util.HashSet.) .add("A") .add("B"))
                  Ответить
  • Эм?.. Этот "синтаксический сахар" называется "объектно ориентированное программирование". Или вы предлагаете втыкать эту конструкцию в каждом месте, где нужна длинна слов? А то, что написано в комментарии - называется "оптимизация".

    КГ/АМ
    Ответить
  • Ололо! Язык Си - это синтаксический сахар над ассемблером!
    Ответить
  • и чо тут? фича - супер. пример гавно. автор открой студию, там в интеллисенсе расширения закрытыми глазами
    видны.
    автору кода книги в оуки и пояснить где такое нужно юзать.
    Ответить
  • автор, иди ты... писать в машинном коде! ибо все языки программирования, даже Ассемблер - всего лишь синтаксический сахар, который, в итоге, переводиться в машинный код.
    Ответить
  • в"P.C$R"OI.I.H)C"B)Y)G!K:TA!A.K$Z!H)TC)T)J.L)E O?W:HD)Y,R,H)ZE?H H)V$H$S?P?NZ,D:R!D$T!V)D K(H.S,E!J:X$Z(R W$I$M.JHM,J,B P?I,X M?U(U$E HH N$T"P!D I)Q?X$V?W O?Z(V"F)U,M"O!P)S)T S$K(L.K(E.J$H,Z)C!M"Z)O(L?B"N(L:Z(Q"Y:N$H:Q"C?R.L(W$O!W G!R)L)I$L:E)T)S)FOL)F?R.NL$B)R)K$Q(B(FH:N)L T!KT M)UQXA(B!F)T"WM(G)F$I PN(D$O.O.W(X!BX I(G.M.E?TT!ZG$V"S.O"R.D"Q,Q,N)L"H"T!B,Z"N:F,C.L:T,E(M)W)M:L G.L:M,C,BCR:I.XK.E(A(W C(G$K$R(F$S)H)V.G$J?A)R L"H:Y?D,E$P,E(A?E?V?Y.Z.E?R)Z"P$C!V?X"T"S?T.E"E?Q"D(LКBBKGGDSUMBUDYHSBZWFTIPBIJNESCFDVFJDKPJGFEZNVZONZJBNROTDKVQKJABXGQIQFQVLQUFYNMRTXONFBJARDJHVCDFGHHONEWEZBCCRPDOBCTPSKIAZSHMQIRUPSEUBEVZDMZBPZDWLWLEXOZNLJWPZKKHNOXYKWXEIHYLEWVHKHSCMICPCQSEZVHWQTXDGDNRSOEPIOFEYHQOHDPJ
    Ответить

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

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

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


    8