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

Содержание

Слайд 2

Паттерн

Описания паттернов обычно очень формальны и чаще всего состоят из таких пунктов:
проблемы,

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

это часто встречаемое решение определённой проблемы при проектировании архитектуры программ.

Концепцию паттернов впервые описал Кристофер Александер в книге «Язык шаблонов. Города. Здания. Строительство».
Идея показалась заманчивой четвёрке авторов: Эриху Гамме, Ричарду Хелму, Ральфу Джонсону, Джону Влиссидесу. В 1995 году они написали книгу «Design Patterns: Elements of Reusable Object-Oriented Software»

Слайд 3

Паттерны нужны потому что

Проверенные решения

Стандартизация кода

Общий программистский словарь

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

Слайд 4

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

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

Низкоуровневые

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

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

Порождающие паттерны беспокоятся о гибком создании объектов без внесения в программу лишних зависимостей (удобное и безопасное создание новых объектов или даже целых семейств объектов)

Структурные паттерны показывают различные способы построения связей между объектами (построение удобных в поддержке иерархий классов)

Поведенческие паттерны заботятся об эффективной коммуникации между объектами (решают задачи эффективного и безопасного взаимодействия между объектами программы)

Слайд 5

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

Определяет общий интерфейс для создания объектов в суперклассе, позволяет изменять тип

Порождающие паттерны Определяет общий интерфейс для создания объектов в суперклассе, позволяет изменять
создаваемых объектов

Позволяет создавать семейства связанных объектов, не привязываясь к конкретным классам создаваемых объектов

Позволяет создавать сложные объекты пошагово. Один и тот же код используется для получения разных объектов

Позволяет копировать объекты не вдаваясь в подробности их реализации

Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа

Слайд 6

Структурные паттерны

Позволяет объектом с несовместимыми интерфейсами работать вместе

Разделяет один или несколько классов

Структурные паттерны Позволяет объектом с несовместимыми интерфейсами работать вместе Разделяет один или
на две отдельные иерархии – абстракцию и реализацию, позволяя изменять их независимо друг от друга

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

Позволяет динамически добавлять объектам новую функциональность, оборачивая их в полезные «обёртки»

Предоставляет простой интерфейс к сложной системе классов, библиотеке.

Слайд 7

Поведенческие паттерны

Определяет семейство схожих алгоритмов и помещает каждый из них в собственный

Поведенческие паттерны Определяет семейство схожих алгоритмов и помещает каждый из них в
класс. После чего, алгоритмы можно заменять прямо во время исполнения программы.

Позволяет делать снимки состояния объектов, не раскрывая подробностей их реализации. Затем снимок можно использовать.

Даёт возможность последовательно обходить элементы составных объектов, не раскрывая их внутреннего представления

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

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

Слайд 8

Паттерны - назначение

Определяет общий интерфейс для создания объектов в суперклассе, позволяет изменять

Паттерны - назначение Определяет общий интерфейс для создания объектов в суперклассе, позволяет изменять тип создаваемых объектов
тип создаваемых объектов

Слайд 9

Паттерны – из чего состоит (блоки/части/участники)

Продукт определяет общий интерфейс объектов, которые может

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

Слайд 10

Паттерны – когда нужно и можно использовать

Когда необходимо отделить код производства продуктов

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

Слайд 11

Паттерны – разновидность шаблона

Порождающие паттерны беспокоятся о гибком создании объектов без внесения

Паттерны – разновидность шаблона Порождающие паттерны беспокоятся о гибком создании объектов без
в программу лишних зависимостей (удобное и безопасное создание новых объектов или даже целых семейств объектов)

Слайд 12

Паттерны – последовательность реализации

Приведите все создаваемые продукты к общему интерфейсу.
В классе, который

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

Слайд 13

Паттерны – контрольные точки успешного применения

Мы можем добавлять новые продукты не меняя

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

Слайд 14

Паттерны – плюсы минусы

Избавляет класс от привязки к конкретным классам продуктов.
Выделяет код

Паттерны – плюсы минусы Избавляет класс от привязки к конкретным классам продуктов.
производства продуктов в одно место, упрощая поддержку кода.
Упрощает добавление новых продуктов в программу.
Реализует принцип открытости/закрытости.

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

Слайд 15

Паттерны – возможность применения в 1с

Программисты 1с, могут пользоваться созданием различных объектов,

Паттерны – возможность применения в 1с Программисты 1с, могут пользоваться созданием различных
у которых уже установлены основные моменты поведения и при этом есть возможность доработать.

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

(практические примеры)

Слайд 16

Паттерны - назначение

Позволяет объектом с несовместимыми интерфейсами работать вместе

Паттерны - назначение Позволяет объектом с несовместимыми интерфейсами работать вместе

Слайд 17

Паттерны – из чего состоит (блоки/части/участники)

Клиент — это класс, который содержит существующую

Паттерны – из чего состоит (блоки/части/участники) Клиент — это класс, который содержит
бизнес-логику программы.
Клиентский интерфейс описывает протокол, через который клиент может работать с другими классами.
Сервис – это какой-то полезный класс, обычно сторонний. Клиент не может использовать этот класс напрямую, так как сервис имеет непонятный ему интерфейс.
Адаптер — это класс, который может одновременно работать и с клиентом, и с сервисом.
Работая с адаптером через интерфейс, клиент не привязываться к конкретному классу адаптера. Благодаря этому, вы можете добавлять в программу новые виды адаптеров, независимо от клиентского кода.

Слайд 18

Паттерны – когда нужно и можно использовать

Когда мы хотим использовать сторонний класс,

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

Слайд 19

Паттерны – разновидность шаблона

Структурные паттерны показывают различные способы построения связей между объектами

Паттерны – разновидность шаблона Структурные паттерны показывают различные способы построения связей между
(построение удобных в поддержке иерархий классов)

Слайд 20

Паттерны – последовательность реализации

Убедитесь, что у вас есть два класса с неудобными

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

Слайд 21

Паттерны – контрольные точки успешного применения

Два объекта, которые раньше не могли взаимодействовать

Паттерны – контрольные точки успешного применения Два объекта, которые раньше не могли
– теперь могут работать вместе

Слайд 22

Паттерны – плюсы минусы

Отделяет и скрывает от клиента подробности преобразования различных интерфейсов

Усложняет

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

Слайд 23

Паттерны – возможность применения в 1с

Однозначно возможно и переменяется

Паттерны – возможность применения в 1с Однозначно возможно и переменяется

Слайд 24

Паттерны – практические примеры

Отчет который может принимать и обрабатывать разные типы принимаемых

Паттерны – практические примеры Отчет который может принимать и обрабатывать разные типы
параметров.

Пакет XDTO, который фактически служит адаптером между двумя и более базами.

Слайд 25

Паттерны - назначение

Создаёт механизм подписки, позволяющий одним объектам следить и реагировать на

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

Слайд 26

Паттерны – из чего состоит (блоки/части/участники)

Издатель владеет внутренним состоянием, изменение которого интересно

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

Слайд 27

Паттерны – когда нужно и можно использовать

Когда нам что-то нужно делать при

Паттерны – когда нужно и можно использовать Когда нам что-то нужно делать
наступлении определенного состояния.
Когда одни объекты должны следить за состоянием других объектов.

Слайд 28

Паттерны – разновидность шаблона

Поведенческие паттерны заботятся об эффективной коммуникации между объектами (решают

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

Слайд 29

Паттерны – последовательность реализации

Разбейте вашу функциональность на две части: независимое ядро и

Паттерны – последовательность реализации Разбейте вашу функциональность на две части: независимое ядро
опциональные зависимые части. Независимое ядро станет издателем. Зависимые части станут подписчиками
Создайте интерфейс подписчиков. Обычно, в нём достаточно определить единственный метод оповещения.
Создайте интерфейс издателей и опишите в нём операции управления подпиской. Помните, что издатель должен работать только с общим интерфейсом подписчиков.
Создайте классы конкретных издателей. Реализуйте их так, чтобы при каждом изменении состояния, они слали оповещения всем своим подписчикам
Реализуйте метод оповещения в конкретных подписчиках. Издатель может отправлять какие-то данные вместе с оповещением (например, в параметрах). Возможен и другой вариант, когда подписчик, получив оповещение, сам берёт из объекта издателя нужные данные. Но при этом подписчик привяжет себя к конкретному классу издателя
Клиент должен создавать необходимое количество объектов подписчиков и подписывать их у издателей

Слайд 30

Паттерны – контрольные точки успешного применения

Происходит нужное действие при наступлении определенного события.
Одни

Паттерны – контрольные точки успешного применения Происходит нужное действие при наступлении определенного
объекты способны отслеживать состояние других объектов

Слайд 31

Паттерны – плюсы минусы

Издатель не зависит от конкретных классов подписчиков
Вы можете подписывать

Паттерны – плюсы минусы Издатель не зависит от конкретных классов подписчиков Вы
и отписывать получателей на лету
Реализует принцип открытости/закрытости

Наблюдатели оповещаются в случайном порядке

Слайд 32

Паттерны – возможность применения в 1с

Однозначно возможно и переменяется

Паттерны – возможность применения в 1с Однозначно возможно и переменяется

Слайд 33

Паттерны – практические примеры

Паттерны – практические примеры

Слайд 34

Паттерны - назначение

Позволяет создавать сложные объекты пошагово. Один и тот же код

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

Слайд 35

Паттерны – из чего состоит (блоки/части/участники)

Интерфейс строителя объявляет шаги конструирования продуктов, общие

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

Слайд 36

Паттерны – когда нужно и можно использовать

Когда нам нужно собирать объекты пошагово
Когда

Паттерны – когда нужно и можно использовать Когда нам нужно собирать объекты
нам нужные разные представления одного объекта (Железные и деревянные дома)
Когда нужно строить древовидные структуры

Слайд 37

Паттерны – разновидность шаблона

Порождающие паттерны беспокоятся о гибком создании объектов без внесения

Паттерны – разновидность шаблона Порождающие паттерны беспокоятся о гибком создании объектов без
в программу лишних зависимостей (удобное и безопасное создание новых объектов или даже целых семейств объектов)

Слайд 38

Паттерны – последовательность реализации

Убедитесь в том, что создание разных представлений объекта можно

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

Слайд 39

Паттерны – контрольные точки успешного применения

Мы можем создавать объекты пошагово
У нас могут

Паттерны – контрольные точки успешного применения Мы можем создавать объекты пошагово У
быть разные представления одного объекта

Слайд 40

Паттерны – плюсы минусы

Позволяет создавать продукты пошагово.
Позволяет использовать один и тот

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

Усложняет код программы за счёт дополнительных классов.
Клиент будет привязан к конкретным классам строителей, так как в интерфейсе строителя может не быть метода получения результата.

Слайд 41

Паттерны – возможность применения в 1с

Относительно возможное применение

Паттерны – возможность применения в 1с Относительно возможное применение

Слайд 42

Паттерны – практические примеры

Части документа как части строителя

Элемент справочника как объект, для

Паттерны – практические примеры Части документа как части строителя Элемент справочника как
которого задаются свои строители (Реквизиты и ТЧ)

Форма которая создается в зависимости от условий