Сайт о телевидении

Сайт о телевидении

» » Введение в паттерны проектирования. Паттерны ооп в метафорах

Введение в паттерны проектирования. Паттерны ооп в метафорах

Что такое паттерн программирования?

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

Должен ли я пользоваться шаблонами проектирования?

Ну, если вы хотите стать профессиональным Java-разработчиком, то вам следует знать по крайней мере популярные решения встречающихся проблем. Эти решения были отточены и улучшены опытными программистами. Как только вы освоите их, вы начнете получать от них пользу и сделаете огромный скачок на пути становления мастером проектирования и разработки. Более того, вы сможете использовать эти термины для более эффективного общения с вашими коллегами.

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

Помните - изучение паттернов изменит ваш стиль написания кода; вы не только будете образованнее, вы также будете выглядеть более образованными.

Сколько всего шаблонов программирования?

Много. Всего насчитывается по крайней мере 250 паттернов, используемых в мире ООП, включая Спагетти, который относится к небольшим привычкам. Широко известны 23 паттерна программирования, и еще больше станет известно по пути.

Заметьте, что паттерны - это не идиомы и алгоритмы и не компоненты.

Каковы взаимосвязи между этими паттернами?

Вообще, чтобы построить систему, вам может понадобиться совместить много паттернов вместе. Разные разработчики могут решать одну и ту же проблему используя разные паттерны. Обычно:

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

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

1. Тепляков С. - Паттерны проектирования на платформе.NET

В книге каждый паттерн «разжевывается», демонстрируются несколько способов реализации от классического до более подходящих для платформы.NET. Много ссылок на статьи и книги других авторов, в том числе по другим темам. Книга изначально заточена под C#, дает лучшие варианты реализаций паттернов на нём и примеры, в каких местах.NET framework они используются. В отличие от заумных талмудов архитектурных астронавтов прошлого тут всего 300 страниц. Знания даются исключительно компактно и всегда по делу.

2. Эрик Фримен, Элизабет Фримен, Кэтти Сьерра, Берт Бейтс - Паттерны проектирования

В отличие от книги «Банды четырех», которая написана очень тяжело для начинающего, книга более подходит для новичка. Всё расписано, разжёвано, с примерами. Язык книги очень простой, первые 100 страниц читаются на одном дыхании. Очень своеобразный стиль изложения материала, характерный для книг серии Head First. Книга представляет собой новый подход к написанию технической литературы, которая теперь сочетает в себе элементы художественной.

3. Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. - Приемы объектно-ориентированного проектирования. Паттерны проектирования

4. Дастин Босуэлл, Тревор Фаучер - Читаемый код, или Программирование как искусство

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

Приложения Laravel, нам неплохо было бы понять архитектуру каркаса приложения . Некоторые могут спросить: Зачем это нужно? Смысл забивать себе голову разной теоретической чепухой?
Постараюсь ответить на этот вопрос примером из жизни:

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

Я думаю, не стоит описывать, что у вас получится в итоге, ясно только одно - ничего хорошего.

Ну и более приближенный к теме Laravel 4 ответ: Понимание архитектуры приложения , знание основ паттернов (шаблонов) проектирования , помогут вам понять, почему следует использовать именно этот каркас web-приложения, оценить его слабые и сильные стороны. Так же вы получите ответ, почему так сильно изменился Laravel 4 по сравнению с Laravel 3.

Для тех, кто все же решил изучить теорию, прежде чем приступить к практике, советую: запаситесь терпением.

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

Определения

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

Паттерны это не так сложно как кажется

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

На самом деле паттерны не так сложны для понимания, как кажется на первый взгляд. Давайте проиллюстрируем их примерами, все сразу станет намного понятнее.

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

  1. Вася и Петя встретились.
  2. Вася протянул Пете руку.
  3. Петя сказал «Здравствуй Вася» .
  4. Вася ответил «Здравствуй Петя» .
  5. Вася спросил «Ты принес мне диск с курсовой?» .
  6. Петя ответил «Да, принес» .
  7. Вася полез в карман и достал деньги.
  8. Вася отсчитал 100$.
  9. Вася передал деньги Пете.
  10. Петя принял деньги от Васи.
  11. Петя пересчитал деньги.
  12. Петя кивнул головой - подтверждая, что сумма соответствует цене за диск.
  13. Петя положил деньги в карман.
  14. Петя достал диск.
  15. Петя передал диск Васе.
  16. Вася принял диск от Пети.
  17. Вася положил диск в карман.

Теперь разобьём эту программу на отдельные части:

  1. Начало программы.
  2. Встреча.
  3. Обмен приветствиями.
  4. Проверка наличия «данных» .
  5. Передача данных «деньги» .
  6. Списание данных «деньги» .
  7. Проверка данных «деньги» .
  8. Запись данных «деньги» .
  9. Передача данных «диск» .
  10. Списание данных «диск» .
  11. Запись данных «диск» .
  12. Конец программы.

У нас получился алгоритм действий для встречи и обмена диска на деньги между двумя индивидуумами.

Теперь разбиваем алгоритм на составляющие так:

  1. Общение.
  2. Обмен данными.
  3. Проверка условий.
  4. Действия.

У нас как раз и получился набор паттернов (правда очень абстрактный). Зато этот архитектурный паттерн или программная парадигма описывает обмен данными практически любого вида и любой сложности. По сути это аналог всем известного MVC .

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

Давайте попробуем составить схему таких паттернов самостоятельно:

  1. Общение
    1. Установление контакта
    2. Передача запросов между пользователем и системой
  2. Обмен данными
    1. Передача данных запроса в направлении в систему
    2. Передача данных запроса в направлении из системы
    3. Передача команд на проверку условий
    4. Передача команд на передачу данных
  3. Проверка условий
    1. Проверка условий передачи данных
    2. Подтверждение проверки условий
  4. Действия
    1. Извлечение данных из хранилища «А»
    2. Передача данных в хранилище «А»

В итоге у нас получилась своя схема паттернов.

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

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

Паттерны бывают разными

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

  • Классификация по масштабу
  • Классификация по стилю
  • Классификация по применению

Классификация по масштабу

Самая часто используемая классификация - это классификация по масштабу. Чаще всего она применяется для паттернов проектирования и делится на три слоя по детализации:

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

Классификация по стилю

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

Классификация по применению

Программистам редко приходится сталкиваться с данным классом паттернов, но все же стоит о нем упомянуть, чтобы иметь хотя бы общее представление. Это самый высокоуровневый класс паттернов. В него входят целые классы паттернов. Например:

  • Паттерны тестирования
  • Паттерны документирования
  • Паттерны организации производственных процессов
  • Паттерны организации рабочих мест

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

Заключение

Какие преимущества дают нам паттерны? Отвечу на этот вопрос, цитируя John Vlissides ( Влиссидес):

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

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

Для тех, кого заинтересовали паттерны, советую найти и почитать книги:

  • Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес: Приемы ООП. проектирования .
  • Джон Влиссидес: шаблонов проектирования . Дополнительные штрихи.

Последнее обновление: 31.10.2015

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

Хотя идея паттернов как способ описания решения распространенных проблем в области проектирования появилась довольно давно, но их популярность стала расти во многом благодаря известной работе четырех авторов Эриха Гаммы, Ричарда Хелма, Ральфа Джонсона, Джона Влиссидеса, которая называлась "Design Patterns: Elements of Reusable Object-Oriented Software" (на русском языке известна как "Приемы объектно-ориентированного проектирования. Паттерны проектирования") и которая вышла в свет в 1994 году. А сам коллектив авторов нередко называют "Банда четырёх" или Gang of Four или сокращенно GoF. Данная книга по сути являлась первой масштабной попыткой описать распространенные способы проектирования программ. И со временем применение паттернов стало считаться хорошей практикой программирования.

Что же дает нам применение паттернов? При написании программ мы можем формализовать проблему в виде классов и объектов и связей между ними. И применить один из существующих паттернов для ее решения. В итоге нам не надо ничего придумывать. У нас уже есть готовый шаблон, и нам только надо его применить в конкретной программе.

Причем паттерны, как правило, не зависят от языка программирования. Их принципы применения будут аналогичны и в C#, и в Jave, и в других языках. Хотя в рамках данного руководства мы будем говорить о паттернах в контексте языка C#.

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

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

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

Порождающие паттерны

Порождающие паттерны - это паттерны, которые абстрагируют процесс инстанцирования или, иными словами, процесс порождения классов и объектов. Среди них выделяются следующие:

    Строитель (Builder)

    Прототип (Prototype)

    Одиночка (Singleton)

Другая группа паттернов - структурные паттерны - рассматривает, как классы и объекты образуют более крупные структуры - более сложные по характеру классы и объекты. К таким шаблонам относятся:

    Адаптер (Adapter)

    Мост (Bridge)

    Компоновщик (Composite)

    Декоратор (Decorator)

    Фасад (Facade)

    Приспособленец (Flyweight)

    Заместитель (Proxy)

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

    Команда (Command)

    Интерпретатор (Interpreter)

    Итератор (Iterator)

    Посредник (Mediator)

    Хранитель (Memento)

    Наблюдатель (Observer)

    Состояние (State)

    Стратегия (Strategy)

    Шаблонный метод (Template method)

    Посетитель (Visitor)

Существуют и другие классификации паттернов в зависимости от того, относится паттерн к классам или объектам.

Паттерны классов описывают отношения между классами посредством наследования. Отношения между классами определяются на стадии компиляции. К таким паттернам относятся:

    Фабричный метод (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)

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

И в данном руководстве мы рассмотрим наиболее основные и распространенные паттерны и принципы их использования применительно к языку C#.

Как выбрать нужный паттерн?

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

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

И в конечном счете надо придерживаться принципа KISS (Keep It Simple, Stupid) - сохранять код программы по возможности простым и ясным. Ведь смысл паттернов не в усложнении кода программы, а наоборот в его упрощении.

Шаблон проектирования или паттерн (англ. design pattern ) в разработке программного обеспечения - повторимая архитектурная конструкция, представляющая собой решение проблемы проектирования в рамках некоторого часто возникающего контекста.

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

Классификация паттернов

В настоящее время наиболее популярными паттернами являются паттерны проектирования. Одной из распространенных классификаций таких паттернов является классификация по степени детализации и уровню абстракции рассматриваемых систем. Паттерны проектирования программных систем делятся на следующие категории:

    Архитектурные паттерны

    Паттерны проектирования

Архитектурные паттерны , являясь наиболее высокоуровневыми паттернами, описывают структурную схему программной системы в целом. В данной схеме указываются отдельные функциональные составляющие системы, называемые подсистемами, а также взаимоотношения между ними. Примером архитектурного паттерна является хорошо известная программная парадигма "модель-представление-контроллер" (model-view-controller - MVC).

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

Идиомы , являясь низкоуровневыми паттернами, имеют дело с вопросами реализации какой-либо проблемы с учетом особенностей данного языка программирования. При этом часто одни и те же идиомы для разных языков программирования выглядят по-разному или не имеют смысла вовсе. Например, в C++ для устранения возможных утечек памяти могут использоваться интеллектуальные указатели. Интеллектуальный указатель содержит указатель на участок динамически выделенной памяти, который будет автоматически освобожден при выходе из зоны видимости. В среде Java такой проблемы просто не существует, так как там используется автоматическая сборка мусора. Обычно, для использования идиом нужно глубоко знать особенности применяемого языка программирования.

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

Описание паттернов

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

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

    Решаемая задача. Здесь дается понимание того, почему решаемая проблема действительно является таковой, четко описывает ее границы.

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

    Результаты использования паттерна. Обычно приводятся достоинства, недостатки и компромиссы.

Результаты применения паттернов

    Они (паттерны) позволяют суммировать опыт экспертов и сделать его доступным рядовым разработчикам.

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

    Если в документации системы указано, какие паттерны в ней используются, это позволяет читателю быстрее понять систему.

    Паттерны упрощают реструктуризацию системы независимо от того, использовались ли паттерны при ее проектировании.

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

http://citforum.ru/SE/project/pattern/#3

Типы шаблонов проектирования

Основные

Шаблон делегирования

Порождающие шаблоны (Creational ) - шаблоны проектирования, которые абстрагируют процесс инстанцирования. Они позволяют сделать систему независимой от способа создания, композиции и представления объектов. Шаблон, порождающий классы, использует наследование, чтобы изменять инстанцируемый класс, а шаблон, порождающий объекты, делегирует инстанцирование другому объекту.

Абстрактная фабрика, Прототип, Строитель

Структурные шаблоны (Structural ) определяют различные сложные структуры, которые изменяют интерфейс уже существующих объектов или его реализацию, позволяя облегчить разработку и оптимизировать программу.

Адаптер, Мост, Приспособленец, Заместитель

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

Стратегия, Состояние

Concurrency - Параллелизм

Частные

Шаблоны параллельного программирования (Concurrency)

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