LINUX.ORG.RU

Паттерны.

 


3

3

Народ, откуда столько НЕНАВИСТИ к паттернам в программировании?

Пробежался тут по последним темам.

For example, in the OO world you hear a good deal about «patterns». I wonder if these patterns are not sometimes evidence of case (c), the human compiler, at work. When I see patterns in my programs, I consider it a sign of trouble. The shape of a program should reflect only the problem it needs to solve. Any other regularity in the code is a sign, to me at least, that I'm using abstractions that aren't powerful enough — often that I'm generating by hand the expansions of some macro that I need to write. — P. Graham

'Patterns mean «I have run out of language.»' — Rich Hickey

Ну и там хор подпевал, как обычно, и всё в таком духе. Вообще, сколько себя помню, на ЛОРе термин «паттерны проектирования» всегда был синонимом какого-то вселенского зла.

Но ведь если разобраться, то «паттерны» так или иначе присутствуют просто ВЕЗДЕ. В градостроительстве, архитектуре, механике, инженерии, электронике, транспорте, аэрокосмосе, музыке, спорте, кулинарии, литературе, поэзии, живописи, медицине, физике, математике, геологии, географии, добыче ископаемых, сельском хозяйстве, военном деле, государственном управлении, экономике, финансах, социологии, в людских взаимоотношениях, наконец! Человечество повсеместно использует стандартные подходы/сценарии/решения, проверенные годами. И к ним мы относимся совершенно нормально. Почему мы, например, услышав секвенцию II-V-I в «Лунной сонате», не говорим Бетховену: «Чувак, you've run out of harmony!» Почему, увидев четырёхстопный ямб у Пушкина, не предъявляем: «Чувак, да у тебя же a sign of trouble в стихах!»

Почему только будучи применёнными к программированию паттерны вызывают столь лютую ненависть?


Ответ на: комментарий от anonymous

Через «Parse Tree Manipulation» можно определить любую предметную область. То же самое можно сделать через «Function Sequence» и т.д.. (я про это: http://martinfowler.com/dslCatalog/ ). Так что это очередной «высер» абстракционистов, зацикленных на навешивании ярлыков на ту или иную программную конструкцию (которую они рассматривают теперь через разные стёклышки). :)

iZEN ★★★★★
()
Ответ на: комментарий от anonymous

Дошло?

Для классических паттернов свойственны несвязные между собой «DSL» (в кавычках, так как я не согласен с этим определением в отношении паттернов программирования), применяемые тут и там, без какой-либо связи друг с другом.

Настоящий DSL связный и лаконичный, его сфера действия распространяется на всё приложение, а не отдельные части. Этим DSL отличается от нагромождения программных абстракций классических паттернов программирования.

iZEN ★★★★★
()
Последнее исправление: iZEN (всего исправлений: 3)

Потому что нужно искать в своем коде паттерны, а не генерировать его, руководствуясь паттернами

buddhist ★★★★★
()
Ответ на: комментарий от iZEN

Через «Parse Tree Manipulation» можно определить любую предметную область.

Глупости. Parse tree manipulation - очень конкретный паттерн. Встречается только в реализации языков, где собственно есть parse tree, и где нужно его как-то преобразовать прежде чем непосредственно генерить код или интерпретировать.

То же самое можно сделать через «Function Sequence»

А это уже совсем другая техника. И когда ты видишь то или иное в коде, ты сразу можешь сказать, что это за паттерн. Опять же, это сильно сокращает время разговора в курилке, вместо того, чтобы водить руками, бекать и мекать ты сразу скажешь, что твоя реализация DSL использует recursive descent parsing на parsing combinators, после чего ты в несколько этапов делаешь parse tree manipulation до плоского кода stack machine, которую и интерпретируешь с помощью function sequence. И всем сразу все понятно, поскольку конкретные детали на таком уровне абстракции не нужны. А если бы у тебя не было бы такой терминологии, то все бы опухли тебя слушать и потеряли бы нить рассуждений задолго до того, как ты бы кончил выкуривать вторую пачку.

anonymous
()
Ответ на: комментарий от iZEN

Я и вижу, что не дошло до тебя. Я уж и не знаю, как еще проще объяснить, опыта работы с учениками интерната для У/О у меня, увы, нет.

anonymous
()
Ответ на: комментарий от anonymous

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

Я не собираюсь ни с кем говорить о DSL своей задачи. Зачем вытаскивать это наружу, если протокол взаимодействия с чужими модулями и так определён через внешние интерфейсы и спецификации?

iZEN ★★★★★
()
Ответ на: комментарий от iZEN

Я не собираюсь ни с кем говорить о DSL своей задачи.

И что? Думаешь, если не говорить о DSL, то DSL от этого перестанет быть паттерном?

anonymous
()
Ответ на: комментарий от iZEN

Я не собираюсь ни с кем говорить о DSL своей задачи.

Я заметил. Для твоих факториалов, чисел фибоначчи и hello, world-ов тебе это не нужно. Но, представь себе, в мире взрослых, серьезных дядек принят коллективный труд, и задачи в этом мире такие, что одному человеку там делать нечего, как бы ты их на под-задачи не разбивал.

Кроме того, в реальном мире, прежде чем ты чего-то начнешь быдлокодить, тебе придется свою идею обосновать и объяснить твоему архитектору или PM-у, а после того, как ты набыдлокодишь, ты будешь это же объяснять тому, кто будет твой быдлокод-review делать. И для разговора со всеми этими гражданами и гражданками тебе все равно придется выучить общую для всех терминологию. Даже если ты дислексик, и со словами не дружишь. Или выучишь, или вон из профессии. Все еще не дошло?

anonymous
()
Ответ на: комментарий от anonymous

А еще до этого ты дал ему имя: «DSL». Так вот, все остальные паттерны точно такие же. Кто-то подмечает общий для многих задач метод, дает ему краткую формулировку и дает ему простое и запоминающееся имя.

DSL отличается от паттерна тем, что это ни разу не «общий для многих задач метод», а, наоборот, ЧАСТНЫЙ. Специфицированный под конкретную задачу метод решения. Он не может быть повторён где-то ещё, так как его задача уникальна, он делается под неё, ни под какую другую.

«Каталоги», так популярные у выявлятелей паттернов программирвоания, для DSL неприменимы к новым задачам в принципе.

По ссылке даётся список паттернов для элементов абстрактного множества DSL. Это — метаязык, терминология DSL, из каких элементов может быть построен конкретный DSL. Но это не значит, что он будет построен из них, а не из чего-то другого.

iZEN ★★★★★
()
Последнее исправление: iZEN (всего исправлений: 1)
Ответ на: комментарий от anonymous

Ты чо, он же лиспер.

Какие еще коллективы, ПМы, архитекторы, ревьюверы? «Творчество» лиспера всегда есть сугубо индивидуальный, личный и интимный акт, который не принято разделять с кем бы то ни было.

Примерно как мастурбация.

anonymous
()
Ответ на: комментарий от iZEN

DSL отличается от паттерна тем, что это ни разу не «общий для многих задач метод», а, наоборот, ЧАСТНЫЙ.

У тебя в детстве травм головы не было? Лобная доля мозга не пострадала? А то, похоже, у тебя начисто отбита способность к абстрактному мышлению.

DSL это и есть общий паттерн: в общем случае, когда формулировка предметной области достаточно компактна, чтобы представлять из себя язык, мы переписываем эту формулировку в виде языка программирования, и решаем задачу из предметной области в терминах этого языка. Заметь - никакой конкретики в этой формулировке нет, самые общие, абстрактные слова. Именно это и называется паттерном.

«Каталоги», так популярные у выявлятелей паттернов программирвоания, для DSL неприменимы к новым задачам в принципе.

Выше я тебе показал, как любая твоя реализация любого DSL будет неизбежно состоять из паттернов. Вот хоть ты тресни, а что бы ты ни написал, это будут паттерны, причем, паттерны давно всем известные, каталогизированные, пронумерованные и обозванные.

anonymous
()
Ответ на: комментарий от iZEN

Но это не значит, что он будет построен из них, а не из чего-то другого.

Если два разных DSL будут построены из «чего-то другого», отсутствующего в этом каталоге, то это «что-то другое» станет паттерном и будет добавлено в каталог. Чтобы следующий дурак, который будет формулировать архитектуру своего DSL, смог назвать это «что-то другое» понятным для всех термином.

anonymous
()
Ответ на: комментарий от anonymous

Но, представь себе, в мире взрослых, серьезных дядек принят коллективный труд, и задачи в этом мире такие, что одному человеку там делать нечего, как бы ты их на под-задачи не разбивал.

Вот из-за таких, как ты, мы всё время получаем Linux с SystemD и GNOME с циклическими зависимостями между библиотеками. Из-за того, что люди не понимают, где конкретно нужна требуемая функциональность, городят огороды и лишние зависимости кода.

iZEN ★★★★★
()
Ответ на: комментарий от anonymous

Если два разных DSL будут построены из «чего-то другого», отсутствующего в этом каталоге, то это «что-то другое» станет паттерном и будет добавлено в каталог.

+100500 за находчивость.

Но сам DSL будет оставаться частным и не сможет повторно использоваться вне предметной области. А значит DSL нельзя считать паттерном и помещать в «каталог».

iZEN ★★★★★
()
Последнее исправление: iZEN (всего исправлений: 1)
Ответ на: комментарий от iZEN

До тебя до сих пор не доходит? Все паттерны отсюда и появились - люди проанализировали, систематизировали свой опыт, и начали договариваться об общих названиях для часто повтояющихся в работе практик. Именно это и называется паттернами. Ты же явно под паттернами понимаешь что-то свое. Какая ирония! Терминологический спор с противником терминологии вообще.

anonymous
()
Ответ на: комментарий от anonymous

А то, похоже, у тебя начисто отбита способность к абстрактному мышлению.

Именно. От абстрактному к частному я и ухожу с помощью DSL. А вам желаю удачи в полёте в космос на абстрактном звездолёте.

iZEN ★★★★★
()
Последнее исправление: iZEN (всего исправлений: 2)
Ответ на: комментарий от iZEN

А значит DSL нельзя считать паттерном и помещать в «каталог».

Паттерном является сама методология разработки с применением DSL-ей. Каждый конкретный DSL неизбежно состоит из нескольких типичных паттернов. Это, естественно, паттерны разного уровня абстракции. DSL вообще - высокоабстрактный паттерн, а recursive descent parser - более конкретный паттерн.

anonymous
()
Ответ на: комментарий от anonymous

До тебя до сих пор не доходит? Все паттерны отсюда и появились - люди проанализировали, систематизировали свой опыт, и начали договариваться об общих названиях для часто повтояющихся в работе практик.

Так появился первый алфавит и письменность. Что дальше?

iZEN ★★★★★
()
Ответ на: комментарий от iZEN

От абстрактному к частному я и ухожу с помощью DSL.

Неверно. Любой DSL - это абстракция предметной области.

anonymous
()
Ответ на: комментарий от iZEN

Бинго! Неужели наш у/о начинает прозревать? Паттерны - это и есть ЯЗЫК. Средство КОММУНИКАЦИИ.

anonymous
()
Ответ на: комментарий от iZEN

Смешались в кучу: кони, люди...

Все-таки теория про травму кажется мне наиболее вероятной.

Ответь для себя на несколько простых вопросов:

1) Что такое язык?

2) Что такое предметная область?

3) Как определяется наличие языка в формулировке предметной области?

4) Какими способами можно сформулировать ту или иную предметную область?

5) Как из формулировки сущности предметной области вывести формально определение языка?

6) Как доказать эквивалентность языка программирования семантике выбранной предметной области?

Если затупишь слишком сильно над этими элементарными вопросами - возвращайся за списком литературы.

anonymous
()
Ответ на: комментарий от anonymous

больше связи с реальностью и делом. Так поступают лисперы.
больше связи с реальностью и делом. Так поступают лисперы.
больше связи с реальностью и делом. Так поступают лисперы.
больше связи с реальностью и делом. Так поступают лисперы.

А причина одна - /0.

slackwarrior ★★★★★
()

Но ведь если разобраться, то «паттерны» так или иначе присутствуют просто ВЕЗДЕ.

Это уже терминальная стадия ООП головного мозга. Вселенная состоит из объектов, а объекты состоят из паттернов. Просветление достигнуто.

anonymous
()
Ответ на: комментарий от anonymous

А при чем тут вообще ООП? Паттерны есть везде, в том числе и в ОО-дизайне. Или тут еще один пациент с гематомой лобной доли, который из «A=>B» делает вывод, что и «B=>A»?

anonymous
()
Ответ на: комментарий от anonymous

Паттерны - это и есть ЯЗЫК. Средство КОММУНИКАЦИИ.

Ага, как быквы в словах — средство коммуникации. :D Не придуривайтесь!

Отдельные буквы ничего не значат для коммуникации, но их связь что-то решает. Классические паттерны программирования определяют отдельные «слова», «словосочетания», даже «предложения», но никак не законченный «рассказ». Законченный «рассказ» определяется DSL.

Пытаться «рассказать» одно и то же в различных обстоятельствах никак не получится — контекст и предметная область не вяжутся с ранее определённым DSL. (Невозможность повторного применения DSL вне его предметной области).

iZEN ★★★★★
()
Ответ на: комментарий от iZEN

Пытаться «рассказать» одно и то же в различных обстоятельствах никак не получится

man фигуры речи, теоретег. А еще сюжетов ограниченное количество - ты не знал? :)

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)
Ответ на: комментарий от iZEN

Нет, показалось. Не доходит-таки до у/о.

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

Покажи мне любой DSL, и я тебе расскажу, из каких паттернов он состоит, и какие паттерны применялись при его проектировании.

anonymous
()
Ответ на: комментарий от iZEN

Вот из-за таких, как ты, мы всё время получаем Linux с SystemD и GNOME
зубрят Java EE

А, погоди. Ты просто mainstream хейтер.

anonymous
()
Ответ на: комментарий от anonymous

Все-таки теория про травму кажется мне наиболее вероятной.
Если затупишь

В таком случае, не хочу больше терять времени на бесполезные разговоры с анонимом. Прощай. Пребывай дальше в своей стройной абстрактной Вселенной с «каталогом» надёжных паттернов для общения. :)

iZEN ★★★★★
()

Не возводи паттерны в ранг идола.

//тред не читал

Chaser_Andrey ★★★★★
()
Ответ на: комментарий от iZEN

То есть, обосрался разбирать любой DSL по твоему выбору на паттерны? Я этого и ожидал.

anonymous
()

Чем больше читаю такие треды, тем больше мне кажется, что паттерны это вообще всё. Зачем тогда ещё одно название для всего остаётся загадкой.

Deleted
()
Ответ на: комментарий от anonymous

Покажи мне любой DSL, и я тебе расскажу, из каких паттернов он состоит, и какие паттерны применялись при его проектировании.

Ты уже почти договорился, что «паттерн» == «херня какая-то». Т.е. вместо того, чтобы оперировать конкретными сущностями (методами обработки, способами реализации, представления и т.п.) ты любое «действие» обзываешь паттерном (любое действие используется более 1-го раза => паттерн), в терминальной стадии пытаешься дать ему имя (хорошо если название паттерна хоть как-то соотносится с самим действием - паттерн «бег») и сидишь довольный во всём этом говнище. Самому не смешно? Твоя речь начинает напоминать «общение» разнорабочих на стройке - не замечаешь?

yyk ★★★★★
()
Ответ на: комментарий от Deleted

что паттерны это вообще всё

Ну, как-то так, да. Паттерн - это такое «всё», которое встречается достаточно часто, чтобы был смысл дать ему имя. Например, паттерн «жопа», который применяется вместо более длинной конструкции «мягкие ткани вокруг отверстия для дефекации».

anonymous
()
Ответ на: комментарий от Deleted

Зачем тогда ещё одно название для всего остаётся загадкой.

Тогда более обоснованы возгласы «Не трожте паттерны - они наше всё!» )

yyk ★★★★★
()
Ответ на: комментарий от anonymous

Например, паттерн «жопа»

Жопа у тебя вместо головы. А есть сущности и понятия. Свои паттерны жуй сам тем самым местом...

yyk ★★★★★
()
Ответ на: комментарий от yyk

Т.е. вместо того, чтобы оперировать конкретными сущностями

Еще один лоботомированый. Паттерны сущетсвуют на разных уровнях абстракции. Чуешь разницу между паттерном «parsing combinator» и паттерном «recursive descent parser»?

Попробуй поговорить об архитектуре без паттернов - а мы посмеемся. Возьми любой DSL, раз уж тут про них разговор зашел, и опиши сначала его на абстрактном уровне, а потом и его конкретную реализацию. Причем так, чтобы в твоей речи не встречалось никаких обобщенных терминов для паттернов. Слабо?

anonymous
()
Ответ на: комментарий от yyk

Жопа у тебя вместо головы.

Нет, жопа - это полноценный паттерн проективроания, поскольку повторяется в разных ветвях эволюционного дерева, связанных между собой только лишь где-то в районе первичноротых. То есть, один и тот же метод в дизайне был применен много раз, с похожими результатами. Что это еще, если не шаблон?

anonymous
()
Ответ на: комментарий от anonymous

Чуешь разницу между паттерном «parsing combinator» и паттерном «recursive descent parser»?

Перестань обзывать паттернами совершенно другие сущности!

Хотя уговорил - паттерн «дебил» тебя характеризует полностью.

yyk ★★★★★
()
Ответ на: комментарий от iZEN

Треск разрывающихся пердаков слышен из соседних тредов, и даже из /job и /talks. Что, болезный, тяжко признать себя обосравшимся и слившим?

anonymous
()
Ответ на: комментарий от yyk

Перестань обзывать паттернами совершенно другие сущности!

Пойди, Мартину Фаулеру это расскажи. Одному из тех, кто вообще ввел понятие паттерна в массовую практику. Скажи, что мега-супер-пупер-экспертег yyk с лора считает, что все то, что Фаулер называет паттернами, на самом деле таковыми не является. А потом возвращайся и перескажи, как конкретно он тебя послал. Тут всем это будет очень интересно.

anonymous
()
Ответ на: комментарий от anonymous

полноценный паттерн проективроания, поскольку повторяется в разных ветвях эволюционного дерева

уж не себя ли ты считаешь архитектором?

Твоё новое всеобъемлющее понятие паттерн не даёт никакого профита. Но ты имеешь полное право использовать наедине с самим собой любые слова по своему усмотрению. Только не удивляйся, если другие люди перестанут тебя понимать.

yyk ★★★★★
()
Ответ на: комментарий от anonymous

Попробуй поговорить об архитектуре без паттернов - а мы посмеемся.

Корма, нос, киль, палуба, мачты, реи, гики, трюм, капитанский мостик, рулевое колесо, парус, руль, спасательный круг — конкретные термины в определении DSL для представления парусного судна.

Архитектура? Не, не слышал.

iZEN ★★★★★
()
Ответ на: комментарий от anonymous

Пойди, Мартину Фаулеру это расскажи. Одному из тех, кто вообще ввел понятие паттерна в массовую практику.

Кент Бек в 1987 году впервые в программной инженерии ввёл понятие «паттерн проектирования». Историю нужно знать не понаслышке, умник.

iZEN ★★★★★
()
Последнее исправление: iZEN (всего исправлений: 1)
Ответ на: комментарий от yyk

Твоё новое всеобъемлющее понятие паттерн не даёт никакого профита.

Нет, ты все-таки клинический идиот. Какой тебе нужен профит, кроме упрощения коммуникации? Паттерн = термин. Все. Не больше и не меньше. Все эти паттерны проектирования - это просто термины, которые выбраны большинством для обозначения наблюдаемых в архитектуре софта сущностей. Ты же хочешь, чтобы терминов не было, но предложить какой-либо свой, новый метод коммуникации, без терминов, без паттернов, ты не в состоянии. Отсюда вывод - ты - дебил.

Но ты имеешь полное право использовать наедине с самим собой любые слова по своему усмотрению. Только не удивляйся, если другие люди перестанут тебя понимать.

Идиот! Паттерны для того только и существуют, чтобы тебя понимали. Когда ты говоришь «интерпретатор», «recursive descent parser», «абстрактная фабрика» - всем понятно, о чем речь. И так и не ясно, что же ты предлагаешь использовать вместо этого.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.