Pull to refresh

Comments 64

Отлично! Захотелось сразу даже блокнотик сделать со шпаргалками. Спасибо вам, очень полезно!
Прочитал только после этого комментария. А так никогда не читаю. :)
А они и не нужны для того, чтобы их читали вместе со статьей. По ним надо искать, вводя в строку ввода "[тег]".
Сейчас будет крик души.

Когда уже основная масса хабраавторов поймёт, что теги не для того, чтобы их читали, а для того, чтобы нужный материал было легче найти по заданному тегу как в общем поиске, так и в избранном. Поэтому нужно указывать четкие однозначные метки, а не писать сочинение в стиле «теги никто не читает, потому напишу сюда какую-нибудь лабуду».
Постоянно приходится дописывать свои теги к постам при добавлении в избранное, но проблему общего поиска по тегам это не решает.
Сейчас у меня в избранном полно информационного мусора в тегах: «никто не читает теги», «тег который никто не читает», «зачем я пишу такие подробные теги?» и пр. А по тегу «всё равно никто не читает теги» на хабре аж 43 топика.
И наверняка в каждом из них есть комментарий о том, что кто-то их всё таки читает)

Но ладно, убедили, пора завязывать с этой традицией…
А ещё, не секрет, по ним строится колонка «похожие публикации», которую многие смотрят
Попытки использовать какую-то ужасную нотацию, то ли куски UML, то ли сами что-то напридумывали. Где-то типы указаны, где-то нет, где то вообще поля какие-то берутся, а то вот, пустые прямоугольники. Не вижу шпаргалки тут, вижу набор субъективных представлений выраженных в плохих рисунках.
Да и вообще, в виде схем воспринимается сложнее — привычнее такое видеть в виде кода на любом распространенном языке с Си-образным синтаксисом.
А это как?

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

Хотелось бы увидеть практическое применение в пределах одного проекта с объяснением бывалых почему для конкретного случая было выбрано применение определенного паттерна, потому как суть некоторых основываясь лишь на теории самому не очень ясна.
Так в оригинальной книге GoF как раз с примерами, как по отдельным паттернам, так и в пределах проекта «Текстовый редактор». Эта шпаргалка — выжимка из той книги.
Структурные паттерны на питоне? Ну-ну :)
Нет, я не спорю, написать то можно что угодно, только вот показывать плохие примеры для языка это не правильно…
У меня там freehabr.ru/blog/designpatterns/2565.html приведены следующие паттерны.
Behavioral: interpreter, iterator;
Creational: abstractfactory, builder, singleton;
Structural: facade, flyweight.
А так, примеры есть на все из «книги четырех» я их просто не выкладывал.
А Вы уж определитесь какие из «плохие примеры для языка». Плохо иметь единый пример, чтобы четко различать и чувствовать разницу в реализации, или надо было их делать не на Python, а на PHP, а лучше на Pascal/Delphi, которые Вы типа знаете, но испортили ими в молодости своей неокрепший разум.
После изучения Ваших примеров я просто признаю что нам с Вами нечего обсуждать.
в описании у каждого патерна указан тип 'поведенческий'. А судя по списку в начале должны ещё быть порождающие и структурные.
Всё же очевидно, они по цвету различаются. Легенда цветов в начале. Я на неё посмотрел и дальше не читал подписи.

Ах, у кого-то проблемы с цветовосприятием? Так это их проблемы, и вообще их всего несколько процентов. Зачем ещё придумывать, как продублировать цветовую информацию?

В общем, это надо не в хаб «Паттерны», а в хаб «Анти-Accessibility». Точно будет популярным.
Это точно ко мне вопросы? Для меня очевидно какой паттерн куда относится вообще без цветов и подписей. Да и без этой статьи тоже :-)
Но если автор делает шпаргалку по теме, то информация должна быть либо верной либо отсутствовать вообще.
Там есть ещё файлы для скачки и печати, в которых тот же косяк. после их распечатки цветовая маркировка уже сильно не поможет
Обновил пост: поменял типы паттернов, обновил ссылки на файлы.
А ссылку на исходник на английском добавьте плз
А как их предлагается использовать?

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

Еще неплохо в ситуации, когда тебе коллега говорит «Вкратце, то, что я здесь реализовал похоже на паттерн N», а ты подзабыл который из паттернов называется N, но, быстро взглянув на шпаргалку, вспомнил.
Честно говоря, вообще никак не воспринимаю картинки-схемы, для меня это пустое место. Вот код — другое дело.
Я такую своим ребятам раздал, пользы от нее никакой правда )
Найти бы подобную по TDD: 5 правил TDD (типа NO PRODUCTION CODE BEFORE RED TEST), паттерны и операции рефакторинга применяемые при этом и т.п.
Т.е. 3 часть «Экстремального программирования» Кента Бека но на одну страничку :)
Тоже как-то не понял в чем смысл поста. Схемки? Так особого плюса от них нет. Они ничего фактически не объясняют. Кажется очередным популистским постом, которых сейчас в интернете много из серии 10 штук, чтобы ваши штуки выглядели штуками.
UFO landed and left these words here
Мне кажется это бесполезным. Ну будет у вас сниппет, например, на фабричный метод? Его цена равна нулю если не знать когда и зачем его применять. Это же самое главное.
Если постоянно их проглядывать, то быстро научишься узнавать признаки паттернов в своём коде и подгонять их под стандарт.
После прочтения фразы про «цветовую дифференциацию штанов» (конечно же, из многими любимого фильма «Кин-дза-дза») вспомнил лекции по мат. логике, где были задачки с этой фразой… Ностальгия.
Как это в плюсах нет функций высших порядков? Есть std::function, есть std::bind, есть std::mem_fn, есть лямбды, есть функциональные объекты. По коду будет длиннее, чем в JS, но работать код будет заметно шустрее, особенно если функцию можно заинлайнить.
А вообще для меня эта шпаргалка скорее нужна чтобы давать более менее устоявшиеся названия сущностям в коде чтобы другие понимали, а сама по себе она не учит ничему.
Для того, чтобы научиться видеть и применять шаблоны нужен цикл задач на применения того или иного шаблона проектирования, есть ли в интернете именно задачники причем желательно с какой-нибудь возможностью тестирования эффективности полученного решения?
Как это в плюсах нет функций высших порядков? Есть std::function, есть std::bind, есть std::mem_fn, есть лямбды, есть функциональные объекты.

Да функция, принимающая в качестве аргумента указатель на другую функцию (или возвращающая его), уже есть функция высшего порядка. Это даже в простом Си работает.
Подозреваю, что имелось в виду всё-таки first class citizen, таким свойством в С++ только некоторые функции обладают.
UFO landed and left these words here
Лямбды страшноватые из за статической типизации, да и не слишком это страшнее, чем
var result = foo(a, function(a, b, c) {… });
Хотя конечно это не функциональные языки и ленивые вычисления не поддерживаются а из за отсутствия сборки мусора за временем жизни захваченных переменных нужно самому следить, но зато работают они очень быстро.

Вот раз сборника задач и нет, то, как мне кажется, он бы имел весьма большой успех. Хорошо бы их сделать вместе с тестировщиком, но я ума не приложу как тестировать архитектуру кода, это не входные и выходные данные через stdio подсовывать и забирать.
Выберите короче свой любимый язык и постарайтесь сделать шпаргалку именно по паттернам для него.
Естественно, ведь по сути фраза «я использовал паттерн X» — это «выразительных возможностей используемого мной языка не хватает, чтобы записать X очевидным образом». Даже сами GoF говорят о том, что их книга с паттернами направлена на языки с выразительностью уровня Java. Возможности языков различаются, так что паттерны не имеют смысла без привязки к языку. Где-то есть поддержка функций высшего порядка — там нет Strategy, там просто создаётся и передаётся функция. Где-то сигналы-слоты заменяют велосипедные Observers. Где-то есть поддержка мультметодов — и там не нужен Visitor. Где-то есть встроенные синглтоны. Где-то классы являются являются объектами и Factory сводится к простому вызову функции make.
Такие вещи полезны, что бы вставлять их в слайды лекций.
Вот к примеру, очень хорошо рассматриваются паттерны на dofactory.com в разделе ".NET Design Patterns". Там есть и простые и из реального мира примеры на каждый паттерн :). Я пользуюсь этим ресурсом.
Было бы также не менее интересно посмотреть частотность использования тех или иных паттернов программистами. Ведь часто бывает так, что программист знаком с паттерном, но решить проблему он пытается «в лоб», т.е не в обход с помощью паттернов.
В статье можно бы добавить ясности, если придерживаться группировки шаблонов как в книге. Так будет проще и быстрее найти то что нужно. В идеале, и той же последовательности паттернов лучше придерживаться. В книге они группировались на 3 раздела Creational, Structural и Behavioral patterns. Здесь же идут в перемешку… например Visitor -> Adapter -> Proxy…
Шпаргалки — это прекрасно. Они структурируют все, что лежит у тебя в голове.
Большое спасибо!
Пожалуйста, если у Вас будет возможность, продолжайте!
Получается, что агрегация вообще нигде не используется, но зачем-то описана.
UFO landed and left these words here
Жаль, что шаблоны не обозначены в языке. То есть пока коментарий не напишешь
/* это шаблон мост */, остается догадываться что там за шаблон.
Было бы что-то типа «implements template Bridge» — было бы понятнее

Шаблоны как раз применяются для преодоления недостатков языка. Скажем, в языках с сильно развитой функциональной парадигмой нет нужды во многих ООП-шаблонах. А там где их используют обычно просто добавляют название шаблона к имени: Bridge, Factory, Adapter, (прости господи)Singleton

У меня обычно с ними ассоциируется цитата Толстого «гладко было на бумаге, да забыли про овраги». :):):)
Only those users with full accounts are able to leave comments. Log in, please.