1. C++ / Говнокод #3572

    +169

    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
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    97. 97
    98. 98
    99. 99
    struct IText{
     
    	typedef boost::shared_ptr<IText> SPtr;
     
    	virtual void draw() = 0;
     
    	virtual void add(const SPtr&) {
    		throw std::runtime_error("IText: Can't add to a leaf");
    	}
     
    	virtual void remove(const SPtr&){
    		throw std::runtime_error("IText: Can't remove from a leaf");
    	}
    };
     
    struct CompositeText: public IText{
     
    	void add(const SPtr& sptr){
    		children_.push_back(sptr);
    	}
     
    	void remove(const SPtr& sptr){
    		children_.remove(sptr);
    	}
     
    	void replace(const SPtr& oldValue, const SPtr& newValue){
    		std::replace(children_.begin(), children_.end(), oldValue, newValue);
    	}
     
    	virtual void draw(){
    		BOOST_FOREACH(SPtr& sptr, children_){
    			sptr->draw();
    		}
    	}
     
    private:
    	std::list<SPtr> children_;
    };
     
    struct Letter: public IText{
     
    	Letter(char c):c_(c) {}
     
    	virtual void draw(){
    		std::cout<<c_;
    	}
     
    private:
    	char c_;
    };
     
     
    int main(){
     
    	CompositeText sentence;
     
    	IText::SPtr lSpace(new Letter(' '));
    	IText::SPtr lExcl(new Letter('!'));
    	IText::SPtr lComma(new Letter(','));
    	IText::SPtr lNewLine(new Letter('\n'));
    	IText::SPtr lH(new Letter('H')); // letter 'H'
    	IText::SPtr le(new Letter('e')); // letter 'e'
    	IText::SPtr ll(new Letter('l')); // letter 'l'
    	IText::SPtr lo(new Letter('o')); // letter 'o'
    	IText::SPtr lW(new Letter('W')); // letter 'W'
    	IText::SPtr lr(new Letter('r')); // letter 'r'
    	IText::SPtr ld(new Letter('d')); // letter 'd'
    	IText::SPtr li(new Letter('i')); // letter 'i'
     
    	IText::SPtr wHello(new CompositeText);
    	wHello->add(lH);
    	wHello->add(le);
    	wHello->add(ll);
    	wHello->add(ll);
    	wHello->add(lo);
     
    	IText::SPtr wWorld(new CompositeText); // word "World"
    	wWorld->add(lW);
    	wWorld->add(lo);
    	wWorld->add(lr);
    	wWorld->add(ll);
    	wWorld->add(ld);
     
    	sentence.add(wHello);
    	sentence.add(lComma);
    	sentence.add(lSpace);
    	sentence.add(wWorld);
    	sentence.add(lExcl);
    	sentence.add(lNewLine);
     	sentence.draw();  // ptrints "Hello, World!\n"
     	IText::SPtr wHi(new CompositeText); // word "Hi"
    	wHi->add(lH);
    	wHi->add(li);
     	sentence.replace(wHello, wHi);
    	sentence.draw();  // ptrints "Hi, World!\n"
     	sentence.remove(wWorld);
                 sentence.remove(lSpace);
    	sentence.remove(lComma);
    	sentence.draw();  // ptrints "Hi!\n"

    Hi, World! Психологическая зависимость от надуманного ООП убивает проекты и их создателей. Всё хорошо в меру. (Найдено на просторах интернета).

    Запостил: Говногость, 25 Июня 2010

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

    • Это синтетический пример, так не бывает
      Ответить
    • показать все, что скрытоговнокод превращается в сборник мемов и баянов интернета...
      Ответить
      • > и баянов интернета...

        Если уже видел - проходи мимо. Некоторые не видели. Какой смысл ходить и кричать "фу! я это уже видел!"? Ну молодец, что видел. Возьми с полки пирожок.

        Хотя пример да, синчический. Куда прикольнее есть пример вычисления факториала на хаскеле в несколько страниц, с использованием жуткого матана. ООП-то ещё фигня.
        Ответить
        • -- explicit type recursion with functors and catamorphisms
          
          newtype Mu f = In (f (Mu f))
          
          unIn (In x) = x
          
          cata phi = phi . fmap (cata phi) . unIn
          
          
          -- base functor and data type for natural numbers,
          -- using locally-defined "eliminators"
          
          data N c = Z | S c
          
          instance Functor N where
            fmap g  Z    = Z
            fmap g (S x) = S (g x)
          
          type Nat = Mu N
          
          zero   = In  Z
          suck n = In (S n)
          
          add m = cata phi where
            phi  Z    = m
            phi (S f) = suck f
          
          mult m = cata phi where
            phi  Z    = zero
            phi (S f) = add m f
          
          
          -- explicit products and their functorial action
          
          data Prod e c = Pair c e
          
          outl (Pair x y) = x
          outr (Pair x y) = y
          
          fork f g x = Pair (f x) (g x)
          
          instance Functor (Prod e) where
            fmap g = fork (g . outl) outr
          
          
          -- comonads, the categorical "opposite" of monads
          
          class Functor n => Comonad n where
            extr :: n a -> a
            dupl :: n a -> n (n a)
          
          instance Comonad (Prod e) where
            extr = outl
            dupl = fork id outr
          
          
          -- generalized catamorphisms, zygomorphisms and paramorphisms
          
          gcata :: (Functor f, Comonad n) =>
                     (forall a. f (n a) -> n (f a))
                       -> (f (n c) -> c) -> Mu f -> c
          
          gcata dist phi = extr . cata (fmap phi . dist . fmap dupl)
          
          zygo chi = gcata (fork (fmap outl) (chi . fmap outr))
          
          para :: Functor f => (f (Prod (Mu f) c) -> c) -> Mu f -> c
          para = zygo In
          
          
          -- factorial, the *hard* way!
          
          fac = para phi where
            phi  Z             = suck zero
            phi (S (Pair f n)) = mult f (suck n)
            
          
          -- for convenience and testing
          
          int = cata phi where
            phi  Z    = 0
            phi (S f) = 1 + f
          
          instance Show (Mu N) where
            show = show . int
          Ответить
          • Если я правильно понял, здесь сложение целых чисел определяется, как рекурсивный инкремент, а умножение, как рекурсивное сложение? Такую программу только на многопроцессорных системах запускать! Жду программу для деления, а также для дробных чисел.
            Ответить
          • Где обещанный жуткий матан?)))))
            Ответить
            • Катаморфизмы, зигоформизмы, параморфизмы, монады, комонады, функторы - недостаточно слов? )
              Ответить
              • Матан это несколько другое... Создателю С++ функциональные плюшки кажутся матаном? :D
                Ответить
                • И что такое матан?)

                  Это, кстати, не функциональные плюшки - типизация/монады и проч. это отдельная от функциональщина штука, просто в ФЯ часто встречаемая.
                  Ответить
                  • Матан... О-о-о, брат.
                    http://www.mmonline.ru/forum/read/5/6012/
                    Так вот, в учебнике Камынина — матан концентрированный.
                    А если в дополнение к лектору Камынину семинаристом Штерн, то это просто какая-то квинтэссенция матана получается...
                    Кто не верит, может первым бросить в меня Фихтенгольцем.
                    Ответить
              • &gt; Катаморфизмы, зигоформизмы, параморфизмы, монады, комонады, функторы


                как короче сделать чтобы "&gt;" в "&gt;" не преврщался?
                Ответить
            • Скорее всего человек любую математику называет "матан"
              Ответить
              • http://lurkmore.ru/%D0%9C%D0%B0%D1%82%D0%B0%D0%BD

                Формально математический анализ — «часть математики, в котором математические объекты изучаются методом пределов (методом бесконечно малых)» <...>. Но, поскольку сферическое быдло в вакууме понятий не имеет, чем диффуры отличаются от теории графов, то матаном обзывается вообще вся высшая математика, а то и просто любые записи со «страшными» формулами.

                :)
                Ответить
                • да-да, и квадратные уравнения тоже матан.
                  и XOR сделать
                  Ответить
                  • Квадратные уравнения — это, наверное, все-таки линейка.
                    Ответить
            • Кстати, да. Если бы вычистение было по формуле Стирлинга или по формуле Ланцоша или через какие-нибудь ряды, то это был бы матан.
              Матан-наци негодует!
              Ответить
              • Это был бы матанический матан! Матан, извиняюсь, в квадрате!
                Ответить
          • А почему у нас восемь разных вебкилов? 1431, 1752, и чем они все отличаются?
            Ответить
          • Здесь всё относительно прозрачно, если уже сталкивался с бананами, линзами и колючей проволкой (Эрик Мейер сотоварищи).
            Ответить
            • Не дай бог сталкнуться. Банан размажется по лицу. Линзы в осколки, а колючая проволка в кровь.
              Ответить
            • http://www.willamette.edu/~fruehr/haskell/evolution.html
              Ответить
        • большая часть пепепостов интернета идет с сайтов, в которых рядом подписано, что так делать глупо и это говнокод, либо синтетические примеры, как в данном случае...
          Ответить
          • Да. Это пример с википедии. Пример реализации паттерна. Считаю плохим тоном, приводить примеры в которых применение данного паттерна не целесообразно (говокод).

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


      Я наконец признаю себя говном и сливаюсь.
      Я клянусь обожествлять и почитать xXx_totalwar. Он всегда прав! Тому, кто скажет обратное, я надаю по морде!
      Ответить
      • Так вот кто от имени геста про сантехника стишок написал! Гестов забанили, теперь под своим логином писа́ть приходится...
        Ответить
      • Прошу забанить этого фейка.
        Ответить
        • показать все, что скрытоФейк просит забанить фейка?
          Ответить
        • показать все, что скрытоТолько не говори, что ты истинный уёбкил!
          Ответить
        • http://govnokod.ru/user/1431 и http://govnokod.ru/user/1752 с одинаковым отображаемым именем?
          Теперь у каждого юзера ID проверять придётся!
          Ответить
          • Мне почему-то кажется, что это xXx_totalwar
            Видимо, я его-таки задел..)

            p.s.

            > с одинаковым отображаемым именем?

            возможно, буквы другие: прописная L и заглавная i в латинице пишутся одинаково... lI

            или вставил "нулевой" символ, который говнокодерский говнокод.ру проглотил) ФФ немного по-разному отображает имена (разное расстояние между W и e)
            Ответить
            • У второго буква «е» русская, поэтому кернинг между «W» и «e» выключается.
              Ответить
              • русские буквы вроде запрещены.
                Ответить
                • В логине, но не в отображаемом имени, которое может с ним не совпадать. Как же Говногость и Анонимус?
                  (только заметил, что 22 минуты назад Webkill об этом уже написал)
                  Ответить
            • >Мне почему-то кажется, что это xXx_totalwar
              Нихуя.
              Это не я.
              Ответить
              • Ололо, спалился!
                Ответить
                • xXx_totalwar пока свой номер паспорта не назвал, так что нет.

                  Мне почему-то кажется, что это просто стишок в рифму. :-[
                  Ответить
                • Это пока ещё не доказательство. Может быть, Вебкилл Второй преднамеренно подставил Тоталвара?
                  Ответить
                  • Ага. Интернет остаётся анонимным инкубатором троллей и эльфов.
                    Ответить
            • в Safari под MacOS ники выглядят абсолютно одинаково...
              Ответить
            • >говнокодерский говнокод.ру проглотил
              Сам ты говнокодерский. Сам ты сейчас у меня будешь проглатывать! Ты свои убивающие веб сайты видел?
              Ответить
          • показать все, что скрытоЯ основной, если что. Второй - отражение моего подсознательного.
            Ответить
          • > Теперь у каждого юзера ID проверять придётся!

            Ну никому верить нельзя!)
            Ответить
          • Ай-ай-ай, страйкер! стыдно такое доспускать.
            у одного небось e русская, а у другого -- латинсая
            Ответить
            • Хм, а ведь действительно: Анонимус, Говногость. Странно, вроде я недавно регался, и мне сказали, что кириллица запрещена... Это он мне про пароль значит говорил... Что ж я постоянно не так всё читаю.
              Ответить
            • Именно буквой «е» они и различаются. Придётся теперь страйкеру ID после имён выводить!
              Ответить
              • а чо, можно под аватарой небольшим шрифтом и серым цветом делать, вроде ок смотреться будет.
                Ответить
              • Да, а поскольку тут вообще юникод, то можно набрать больше 9000 клонов!
                Помимо уже упомянутых, i украинского и е русского, если не присматриваться (в моем стандартном линуксовом фонте) (ⅼΙӀӏIןا) вместо l, ⅰ вместо i, Ԝ вместо W.
                Ответить
                • F А еще в нашем любимом девангари есть ।.
                  Правда, с кернингом беда.
                  Ответить
                • Для чего-то в юникоде есть ещё полуширинные/полноширинные и «математические» варианты, так что подобрать легко. Но есть буквы в кружочках:
                  ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂ
                  ⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏ
                  Слабо такое зафейкать?
                  Ответить
                  • У меня в Опере все левые символы выглядят как что-то среднее между Т и Ъ.
                    А почему твой ник упорно читается как ikarus-gay?
                    Ответить
                    • Про ник: инерция мышления, индуцированная средствами массовой информации. Кому-то и твой ник не понравится.

                      Про символы: зависит не столько от браузера, сколько от комплекта шрифтов. Ни один шрифт не содержит полного Unicode (такие проекты были, правда шрифт сильно жрёт память). Так что, увлекаясь Unicode, можно нарваться на то, что у кого-нибудь нужный шрифт отсутствует, и ник нечитаем.
                      Ответить
                      • Нет, просто после одной очень холодной зимы я очень не люблю Икарусы.
                        Ответить
                    • Потому что это TЪ, как меня обязывает любить говорить мой ник!
                      Ответить
                  • Не, их не зафейкать, но юзернейм можно интересный набрать:)
                    Ответить
                  • Я принципиально новый вебкилл!
                    Вебкилл 2.0!

                    Черт, набрал букв в скобочках сослепу:)
                    Ответить
          • А-а-а!
            Классно!
            ВоруйУбивай!
            Анархия!
            Ответить
          • скоро тут зарегается вся его команда
            Ответить
            • cheef в рид-онли режиме (немного-немало) =\
              Ответить
            • Да.
              Тимур и его команда.
              Они не испугались прихода фашистов и продолжили рисовать красные звезды на домах красноармейцев.
              Ответить
      • САМОЗВАНЕЦ!
        Ответить
    • Напоминает Master programmer из замшелого бояна
      Ответить
    • показать все, что скрытоВ вашем С++ всё через задницу. Даже паттерны.
      Ответить
    • Короче, пацанчики, юзера с id 1752 не кормим и сообщений его не замечаем. Спасибо за понимание.
      Ответить
    • показать все, что скрытоПора устроить конкурс эпичных личностей:
      Яъ
      pushkoff
      хХх_totalwar
      cfdev
      TarasB
      nil
      Все личности расположены в порядке эпичности. Хотя последний просто прикольно шутит и на эпичность, в моём понимании, не катит.
      Ответить
      • я бы разместил cfdev выше чем хХх_totalwar, так как он эпичнее...
        Ответить
      • Чего? Я тут два дня не был, а уже стал эпичным?
        Ответить
      • Спасибо на добром слове.
        Мне тоже есть чего сказать про C++. Но только я скажу, как меня сразу обосрут и заминусуют, а меня это смущает. Тем не менее, я являюь крутейшим специалистом по скриптовому программированию под юниксом! Суровые мужики из 3547 не могут сдержать рыданий и скрежета зубовного, когда созерцают мой код — эталон краткости, читабельности и элегантности, искрометно использующего тонкие моменты стандарта!
        Кстати, давеча с Эриком Блейком по поводу find срался тоже я, и счел, что он мудак, потому что, во-первых, он мудак, во-вторых, не умеет вести дискуссию, и в-третьих, не умеет трактовать стандарт. Да и вообще, кто такой Эрик Блейк?

        Поэтому я завел себе клона, под которым буду резать правду-матку! Но вот сменю я ник и аватарку, чтобы не выкупили, а умище, умище-то куда девать?

        Кстати, %username%, ты уже завел себе Webkill-а?
        Ответить
        • >ты уже завел Webkill-а?
          Меня заводить не нужно. Я сам завожусь. Вот я со вчерашнего дня пишу мега прогу. WEBKILLOS. На PHP уже написал обработку прерываний. Сборщик мусора, встроенный в систему. Уже есть драйвер для мышки. Для клавиатуры пока не успел написать. Но это впринципе не нужно. У меня будет RAD система быстрой разработки программ, встроенная в систему. Она делает прорыв в искустве программирования мышкой. Для начала эта великая операционная система будет стоить 347 $. Потом я подниму цену раза в 4, когда появится демо версия.
          Ответить
    • показать все, что скрытоАфтору говнокода нужно научится пользоватся итераторами.
      Ответить
    • показать все, что скрытоАфтору говнокода нужно научится пользоватся ядом.
      Ответить
    • А вообще - полный ООПиоз головного мозга.
      А может, такое задание было. Знаете, дают такие изучащим ООП.
      Ответить
    • да, ГК уже не торт...
      Ответить
      • угу, любимый с++ обосрали - уже не торт сразу.
        Ответить
        • Если автор конкретного текста -- сферический дебил в вакууме -- это вовсе не значит, что язык -- говно.

          IMHO: на свете есть только один говноязык -- это PHP. Остальные вполне могут сущестовать -- даже basic и даже java script.
          Ответить
          • Я бы бейсик причислил к говноязыкам. (опять же, ИМХО)
            Ответить
            • Старый бейсик - да, новый под дотнет - наполовниу. За то что оставили конструкции типа On Error Resume, при том что введя нормальные исключения.
              Ответить
            • Бейсик для того, чтобы любая домохозяйка могла написать себе макрос в икселе.
              Я сам — мне стыдно в этом признаться — пару лет назад отошел от системного программирования на юниксе и год программировал на VB и VBS. Ну вообще ничего знать не надо, настолько все очевидно и сопряжено — строить какие-то отчеты по выборкам из БД делается на раз! За это микрософту респект.
              Но шаг влево или шаг вправо уже чреваты неиллюзорной еблей и борьбой против очевидности. Вторая сторона медали...
              Ответить
          • Фортран?
            Ответить
    • показать все, что скрытоОго, уже Эриха Гамму зачислили в говнокодеры. Далеко пойдёте ребята... в дворники, например, или в армию, или ещё куда...
      Ответить
    • Автор, ты бы сначала удосужился прочитать что это за пример и для чего он был приведен, по нему сразу все становится понятно, а тебе советую читать мат. часть. Если не лень, можешь почитать, тут совсем кратко http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0% BE%D0%B2%D1%89%D0%B8%D0%BA_(%D1%88%D0%B0 %D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0 %BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE% D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)
      Ответить
      • Тебе же сказали, что это пример неуместного применения паттерна.
        Ответить
        • Вообще-то, это как раз пример применения паттерна из основной книги по патернам. Понятное дело, что это пример, поэтому он максимально упрощён, что бы не отвлекать от сути.
          Ответить
          • Да книги пишут только долбоёбы, что сами писать проги не могут...

            ЗЫ: Хочу написать свою книжку по PHP. У меня уже много идей есть.
            Ответить
            • >>Да книги пишут только долбоёбы, что сами писать проги не могут...
              >>Хочу написать свою книжку
              эталол.
              Ответить
            • Ну как, написал?
              Ответить
    • Особенно меня убивает BOOST_FOREACH.
      Ответить

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