В этой статье поговорим о том, что такое паттерны проектирования, какие они бывают, для чего нужны. Материал будет полезен начинающим программистам.
Паттерны — это способ построения (структуризации) программного кода специальным образом. На практике они используются программистами для того, чтобы решить какую-нибудь проблему, устранить определенную «боль» разработчика. В этом случае предполагается, что существует некоторый перечень общих формализованных проблем (а это так и есть), причем данные проблемы встречаются относительно часто. И вот здесь-то на сцену и выходят паттерны, которые как раз таки и предоставляют способы решения этих проблем.
Немного истории
Сама по себе тема паттернов не является новой. Непосредственная идея по созданию принципов, описывающих решение распространенных в программировании/проектировании ПО проблем, появилась в далеком 1994 году. Именно в этом году в свет вышла известная книга «Design Patterns: Elements of Reusable Object-Oriented Software». Работа была создана целым авторским коллективом, который иногда называют «Gang of Four» (сокращенно GoF) — «Банда четырех». На деле это опытные инженеры-разработчики, вот их имена:
- Ральф Джонсон,
- Ричард Хелм,
- Эрих Гамма,
- Джон Влиссидес.
Книга, о которой идет речь, — это первая серьезная попытка описать наиболее распространенные способы проектирования программного обеспечения. Спустя некоторое время, использование паттернов стало не прихотью разработчика, а хорошей практикой программирования.
Паттерн, как стереотип мышления
Среди наших мыслей есть те, которые мы воспроизводим машинально, автоматически. Они называются стереотипами – как правило, это не очень полезные установки, прочно «вшитые» в мозг. Также их можно назвать и паттернами – привычкой думать определенным образом в конкретной ситуации.
Мысль-паттерн, с одной стороны, упрощает наше существование: не нужно тратить время и искать варианты действий, просто следуй имеющейся в голове схеме. С другой стороны, такая предсказуемость делает человека скучным и неинтересным даже для себя самого.
Примерами шаблонов мышления послужат следующие мыслеформы: меня оскорбили – я оскорбляю в ответ, сказали что-то приятное – радуюсь, не перезвонили – значит, я неинтересна, пьяница – плохой человек, толстые люди – добродушные и т.д.
Какова польза?
Но существует ли реальный профит от использования паттернов? При грамотном применении — безусловно. Когда вы пишете программный код, вы можете формализовать проблему в виде объектов, классов и соответствующих связей между ними. Когда проблема формализована, для ее решения останется задействовать один из существующих паттернов. Это экономит время программиста, ведь не надо изобретать велосипед и что-нибудь придумывать. Готовый pattern (способ решения) уже существует — нужно лишь правильно применить его в конкретной программе.
Важный момент — использование того либо иного паттерна практически не зависит от языка программирования, системы или интерфейса. То есть принципы применения паттернов проектирования в Java, С-шарп и прочих языках будут аналогичными.
Подведем некоторый промежуточный итог: активное использование паттернов упрощает разработку программ. Есть и другой плюс: если программист, который столкнется с чужим кодом, знает примененный паттерн проектирования и его принципы, ему будет проще понять реализацию и внести изменения в код в случае надобности.
Но у этой медали есть и другая сторона. Да, хорошая программа может подразумевать использование шаблонов проектирования. Но может и не подразумевать. А все потому, что не всегда они позволяют упрощать и улучшать программный код. То есть речь идет о том, что использовать паттерны везде и всюду, то есть применять паттерны ради самих паттернов — это явно плохая практика. Не стоит забывать, что неоправданное применение усложнит код, снизит его качество. Просто помните, что pattern ВСЕГДА должен быть оправданным — и лишь в этом случае он сможет эффективно решить проблему.
Сегодня существует очень много разных паттернов. Они решают различные вопросы, выполняют разные задачи. И действует они по-разному, поэтому их можно классифицировать по группам. В основе такой классификации и объединения в группы будут лежать поставленные цели и решаемые задачи.
Паттерн что это такое
Понятие паттерн имеет широкий спектр его применения. Так, например, оно встречается в таких науках, как психология, физика, информатика, также часто применяется в дизайне, музыке, творчестве. Такая схема поведения воспроизводится человеком автоматически в процессе взаимодействия с окружающим миром. Ежедневные паттерны поведения примеры: утренние умывания, приветствия, манера поведения за столом, способ отвечать на звонки.
В психологии паттерном называется парадигма поведения, свойственная человеку в каких-нибудь ситуациях и обстоятельствах.
В науке, в частности в математике и языкознании, можно выявлять паттерны, путем исследования. С помощью прямого наблюдения можно выявить, как формируются визуальные шаблоны в искусстве и в природе. В природе они чаще всего хаотичны, являются фрактальными и не способны к копированию друг друга, встречаются в виде спиралей, волн, пены или трещины, создаются с помощью явления симметрии и отражения.
Подобные шаблоны включают в себя математически очерчиваемую структуру, выражающуюся через формулы. Сама по себе математика является способом поиска регулярностей и каждый конечный продукт от использования функций и есть математическим паттерном.
Процесс исследования и прогнозирования научными теориями, одновременно существующих регулярностей в природе и обществе есть процессом выявления паттернов.
В архитектуре, дизайне и искусстве для того, чтобы получить определенное стабильное воздействие, декорации и разнообразные визуальные элементы могут сочетаться и повторяться, создавая образы и модели. Шаблоны проектирования в компьютерных науках являются часто употребляемым решением широкого спектра проблем программирования.
В медицинских науках паттерн воспринимается как устойчивая комбинация результатов исследования или иных признаков, симптомов при похожих жалобах больного или больных с одной нозологией. Так, паттерн состоит из нескольких симптомов, признаков. Синдром, в свою очередь, включает один или пару паттернов. Синдром или несколько синдромов составляют болезнь.
Паттерны имеют характерные свойства: они являются постоянной категорией, которую легко определить. Они всё время повторяются; являются бессознательно созданными алгоритмами, которые, как правило, очень сложно скорректировать. Они способны проявляться полностью или частично. Если он выявляется частично, то его называют кодом. Например, человек услышал отрывок из какой-то песни, и у него перед глазами сразу отображаются картины из определенной впечатляющей ситуации из прошлого, его захватывают эмоции и воспоминания, которые связанные с ней. Таким образом, мелодия была кодом, произношение которого запустило весь паттерн.
Врожденный паттерн является отправной точкой, первоначальным шаблоном, на который наслаиваются другие. Такие комбинации паттернов объединяются со стереотипами, привычками и ценностями человека, формируя его характер и образ жизни. Поэтому, такие шаблоны всегда взаимодействуют и не могут существовать по отдельности.
Личность все время находится в развитии, приобретает опыт, знания, самосовершенствуется. И вместе с развитием личности происходит трансформация её паттернов, они совершенствуются или изменяют форму выражения. Можно продемонстрировать пример такой модификации на опыте мужчины, который привык жить холостяцкой жизнью, но соображая, что нужно изменять такой образ жизни и обзавестись семьей, продолжает всё же выражать некоторые поведенческие шаблоны. Отдельные привычки, сохранившееся из холостяцкой жизни, могут преследовать человека еще некоторое время. Например, желание иметь собственное независимое личностное пространство, и проводить время одному или с друзьями, с чем, например, жена может не соглашаться. Спустя время это может пройти, действие такого паттерна ослабеет, и мужчина привыкнет к тому, что он теперь ни один и должен больше посвящать себя семье.
Структурные паттерны
В этой группе рассматривается, каким образом классы и объекты формируют более крупные структуры (речь идет о более сложных по характеру классах и создаваемых объектах). Перечень структурных шаблонов:
- Adapter — «Адаптер»;
- Bridge — «Мост»;
- Composite — «Компоновщик»;
- Decorator — «Декоратор»;
- Facade — «Фасад»;
- Flyweight — «Приспособленец»;
- Proxy — «Заместитель».
В архитектуре и дизайне
Повторяющиеся компоненты с целью украшения широко используются:
- в архитектуре паттерны проектирования можно увидеть на любом доме: балконы, окна, подъезды, колонны – все это шаблоны, которые воспроизводятся при планировке здания. Лучше всего они просматриваются в старинных строениях, когда различные вензеля, лепнина и другие изыски были особенно популярны;
- в дизайнерском деле: если вы посмотрите на свои обои с узорами, то, скорее всего, заметите, что рисунок на них постоянно повторяется. Паттерны также можно наблюдать на одежде, пледах, постельном белье, посуде, печатной продукции, тротуаре, кафельной плитке, паркете и т.д.
Поведенческие паттерны
Группа под номером 3 объединяет шаблоны, связанные с поведением. Они определяют алгоритмы взаимодействия между объектами и классами, то есть их поведение. Вот перечень наиболее популярных поведенческих паттернов:
- Chain of responsibility — «Цепочка обязанностей»;
- Command — «Команда»;
- Interpreter — «Интерпретатор»;
- Iterator — «Итератор»;
- Mediator — «Посредник»;
- Memento — «Хранитель»;
- Observer — «Наблюдатель»;
- State — «Состояние»;
- Strategy — «Стратегия»;
- Template method — «Шаблонный метод»;
- Visitor — «Посетитель».
Паттерн — это…
Слово «pattern» английского происхождения и в переводе на русский язык означает «форма», «шаблон», «пример».
То есть, паттерн — это некая повторяющаяся схема, элементы которой также являются образцами и находятся в предсказуемом взаимодействии.
Пример из жизни: каждое утро вы совершаете один и тот же поведенческий паттерн – моцион, который включает в себя туалет, душ, чистку зубов, причесывание, у женщин еще и макияж.
Вы повторяете эти действия каждый день, поэтому они становятся автоматическими и не требуют умственных усилий. Они как узор, рисунок, образец, согласно которому вы действуете.
В широком смысле вся наша жизнедеятельность пронизана паттернами: они окружают нас буквально повсюду.
Данный термин используется в психологии, математике, искусстве, проектировании и других сферах.
Узнать паттерн можно по следующим признакам:
- Он отличается постоянством – например, у большинства русских людей есть новогодний паттерн: наряженная елка, накрытый стол и пускание салютов сразу после боя курантов.
Никто даже не задумывается о том, зачем мы все это делаем, можно ли поступить как-то по-другому (например, купить не ель, а пальму)? Это привычка, передающаяся из поколения в поколение, и мало кто решается нарушить данную традицию; - Он постоянно повторяется – «Каждый год 31 декабря мы с мужиками ходим в баню» (из к/ф «Ирония судьбы, или С легким паром»);
- Он формируется неосознанно (вышеописанный новогодний паттерн. Мы просто стали повторять за родителями то, что делали они из года в год);
- С трудом поддается коррекции, так как является устойчивым явлением. Об этом отлично знают те, кто хоть раз решался изменить что-то в своей жизни, например, бросить курить или начать бегать по утрам.
Другие классификации
В зависимости от того, относится pattern к объектам или классам, существуют и другие классификации паттернов.
К примеру, паттерны классов описывают взаимодействие между классами с помощью наследования, причем эти отношения определяются на этапе компиляции. Вот примеры:
- Factory Method;
- Interpreter;
- Template Method;
- Adapter.
Следующая группа — это паттерны объектов, описывающие взаимодействие между объектами. Отношения такого характера возникают на стадии выполнения, следовательно, они более гибкие. Примеры:
- Abstract Factory;
- Builder;
- Prototype;
- Singleton;
- Bridge;
- Composite;
- Decorator;
- Facade;
- Flyweight;
- Proxy;
- Chain of responsibility;
- Command;
- Iterator;
- Mediator;
- Memento;
- Observer;
- State;
- Strategy;
- Visitor.
Мы перечислили лишь основные варианты, но в реальности их намного больше. Некоторые только начали использоваться, некоторые переживают пик популярности, а некоторые, наоборот, стали применяться реже.
Виды паттерного поведения.
Паттерное поведение – удобный механизм, который достался нам от предков. Оно объясняется принципом рациональности – если реакция выручила несколько раз, она выручит и в дальнейшем. Ведь намного проще пользоваться готовую модель, чем каждый раз придумывать новую.
В действительности мы используем намного больше паттернов, чем можем себе представить. Поэтому поведенческие модели имеют достаточно разветвленную классификацию:
- Социальные и индивидуальные. Социальные шаблоны – это рукопожатие, взмах рукой или поклон при встрече, привычка придерживать за собой двери или пропускать другого человека. Можно назвать это культурой. Индивидуальные шаблоны – это личные привычки человека: манера еды или вождения, последовательность действий во время утренних сборов на работу.
- Врожденные и приобретенные. Врожденные шаблоны – это наша генетика на уровне инстинктов: крик как реакция на боль, отдых после активности, улыбка при виде родного человека. Приобретенные шаблоны появляются в результате воспитания, под влиянием родителей и окружения.
- Позитивные и негативные. Позитивные шаблоны помогают нам гармонично общаться, развиваться, следить за своим здоровьем, преодолевать препятствия. Это все полезные привычки от чистки зубов до улыбки при встрече. Негативные мешают жить, накапливают болезненный опыт, но решаются после визита к психотерапевту.
Различают паттерны:
- Коммуникативные или социальные: мимика, жесты, голос и интонации, которые человек использует при знакомстве, встрече или общении.
- Мышления: мысли, заключения, обобщения, логические выводы в результате действий окружающих людей или после событий.
- Двигательные: защитные реакции в случае опасности, позы, мимика и жесты во время общения, передвижение в пространстве.
- Эмоциональные: диапазон реакций на раздражение, обиду, юмор, комплименты, чужую агрессию.
- Языковые или лингвистические: определенные словосочетания, речевые формы, диалоги, реплики или повторы, которые мы используем в повседневной речи.
- Культурные: культурные образцы, ценности, идеи, характерные для отдельного сообщества или племени.
Паттерны в природе
Что такое паттерн, можно также понять, наблюдая за природными явлениями, например:
- пузырьки на воде, морская пена;
- песчаные дюны в пустыне;
- волны на воде;
- симметричный рисунок снежинки;
- паутина;
- фракталы на листьях (например, лист папоротника состоит из одинаковых «листиков» разного размера;
- спираль на ракушках;
Паттерн в контексте психологии
Психологический паттерн представляет собой стабильную модель поведения, которой придерживаются люди. Подобные паттерны можно выявить, когда мы наблюдает за нашим окружением. Все способны проявлять разное поведение в одинаковых обстоятельствах, но нельзя с уверенностью предсказать реакцию отдельного индивида. Данный аспект служит предметом исследования именно специалистов в сфере социальной психологии.
Можно отследить определенные закономерности поведения, чтобы намного легче взаимодействовать с другими людьми. При изучении поведенческих паттернов, человек осознает, что именно ожидать от своих партнеров по общению, чтобы действовать в соответствии с теми или иными особенностями.
К примеру, если новый знакомый отличается замкнутостью (см. Интроверт любит уединение), нежеланием посещать увеселительные заведения, глупо приглашать его на шумную вечеринку. Человек может попросту обидеться (см. Как простить обиды), полностью прекратить общение. Он будет чувствовать себя крайне некомфортно, если окажется в обстоятельствах, которые его не устраивают.
Важно учитывать интересы своего окружения, чтобы понимать, какая именно реакция будет проявлена в тот или иной момент времени. Таким образом, удастся сохранить хорошие отношения, избежать конфликтных ситуаций. Не стоит удивляться, если человек проявил несвойственное ему поведение. Он просто оказался в новых условиях, в которых еще не успел адаптироваться в полной мере.
Можно говорить о наличии такого типа паттернов, как гипнотические (см. Гипноз и якори). Они представляют собой особые, словесные формулы, которые помогают добиться погружения человека в своего рода трансовое состояние. Человек при этом даже не догадается, что оказался жертвой манипулятора (см. Как манипулировать человеком), мошенника, который использует свои способности в корыстных целях.
Человек вполне может обратиться к психологу, если оказался в ситуации, связанной с проблемами при взаимодействии с внешним миром. Он может высказать специалисту все, что наболело. В этом случае придется пройти несколько тестов, следовать рекомендациям, чтобы изменить негативную модель своего поведения (см. Негативная мотивация). Спустя какое-то время пациенту будет назначен курс соответствующих психокоррекционных техник.
Значение слова паттерн
Чтобы понять, насколько емким является это слово, заглянем в словарь для уточнения перевода. И что же мы видим? Английское слово pattern переводится на наш родной язык, как:
- модель или шаблон;
- образец или пример;
- рисунок или узор;
- система или структура.
Вот сколько значений у данного понятия! Бывают паттерны в программировании, в психологии, в дизайне и, наконец, в самой природе. Вот в ней-то мы сейчас и будем искать образцы паттернов.