SlideShare a Scribd company logo
1 of 34
Eugene S. Merkoulov
Aller Media Norge
2019
Christopher Alexander, 1979
Christopher Alexander
Origins & history
Kent & Ward, 1987
Kent Beck Howard Cunningham
Using Pattern Languages for
Object-Oriented Programs
OOPSLA-87
Origins & history
Gang of Four, 1995
Erich Gamma Richard Helm
Ralph Johnson John Vlissides
Origins & history
Вынесение семейства алгоритмов (аспектов, поведений) из
некоторого комплексного контекста в отдельные классы с целью
их взаимозаменяемости.
Также известен как Стратегия.
GoF Behavioral
Software design patterns
Вариативность некоторой части
комплексного поведения, как во время
сборки, так и во время выполнения.
Предпосылки Эффекты
Policy / strategy
Policy / strategy
Взаимодействия и варианты
Policy / strategy
Отношение к SOLID
Policy / strategy
Примеры использования
Policy / strategy
Определяет интерфейс для создания объектов, но предоставляет
подклассам принимать решение о типе создаваемого объекта.
Решает проблему зависимости клиентского кода от конкретных
типов создаваемых объектов.
GoF Creational
Software design patterns
Используем Фабрики когда
➔ контекст создаёт объекты
➔ разных (полиморфных) типов;
➔ возможно, сразу нескольких;
➔ у процесса создания есть зависимости, не
нужные в самом Контексте.
Предпосылки Эффекты
factory
Продукт
Объекты полиморфных типов, либо
их семейства, используемые в
Контексте.
factory
Взаимодействия и варианты
factory
S O L I D
factory
Примеры использования
factory
Скрывает детали логики создания объекта за абстракцией шагов, тем самым позволяет
изменять некоторые шаги создания, как и сам тип создаваемого объекта.
Разделяет процесс конструирования и внутреннее устройство объектов.
Удобен для создания Композитов.
GoF Creational
Software design patterns
Нанимаем Билдера когда
➔ конструируем Композиты;
➔ в Контексте есть лишние
зависимости от внутреннего
устройства Продукта;
➔ список аргументов конструктора
стал слишком длинным.
Предпосылки Эффекты
builder
builder
Контекст создает экземпляры Билдера и Директора, конфигурирует второго первым.
Директор реализует некоторый вариант процесса конструирования Продукта,
используя интерфейс Билдера для производства компонентов Продукта.
В простых случаях Контекст может брать на себя функции Директора.
Взаимодействия и варианты
builder
Фабрика обычно просто предоставляет готовый Продукт, тогда как Билдер позволяет
его конфигурировать и тоньше управлять процессом создания.
Фабрика отвечает на вопрос “Что?”, а Билдер — на вопрос “Как?”.
Фабрика самодостаточна, Билдеру нужен прораб (Директор).
Фабрики могут быть реализованы на основе Билдеров.
Как, впрочем, и наоборот.
Отличия от Фабрик
builder
S O L I D
builder
Примеры использования
builder
Позволяет убедиться, что всегда существует только один
экземпляр класса, и предоставить глобальную точку доступа к
нему.
GoF Creational
Software design patterns
Синглтон идёт в дело когда
➔ мы заблуждаемся на счёт того, что
нам всегда будет достаточно одного
экземпляра класса;
➔ необходимо подменять этот
экземпляр объектами производных
типов.
Предпосылки Эффекты
singleton
Точка доступа к телу Синглтона может быть как статическим методом в классической
реализации, так и отдельной функцией (make()/app() в Laravel).
В некоторых языках (Typescript) допустимо возвращать производные типы из
конструкторов базовых, что делает возможным сокрытие доступа за обычным
оператором new.
Взаимодействия и варианты
builder
Синглтон ригиден.
Решение: полиморфизм и Dependency Injection в том или ином виде.
Синглтоны иногда перестают быть синглтонами.
Там где было одно соединение с БД, может появиться ещё одно для параллельных
запросов.
Там где был один DOM, когда-нибудь появится Shadow DOM.
Где не было тестов, однажды они должны появиться, а вместе с ними и необходимость
реинициализации разных вещей, в т.ч. и синглтонов.
Решение: полумеры вроде Multiton, либо не использовать синглтоны вообще, а
использовать какие-то пулы объектов.
Проблемы и их решения
singleton
Механизм уведомления о событиях в приложении, с низкой
связностью.
GoF Behavioral
Software design patterns
Используем Обсервер когда
➔ когда нужно организовать
отношение “многие ко многим”
между частями приложения,
➔ и когда структурой этих
зависимостей нужно управлять в
рантайме.
➔ Также для вынесения сайд-
эффектов BL (той её части, что не
нужна немедленно для получения
результата) (SRP).
Предпосылки Эффекты
observer
observer
observer
Классический Обсервер отягощён прямой зависимостью Обсервера от Субъекта, и
потому ограничен лишь отношением “один ко многим”.
Это исправляется через DIP — введение промежуточной сущности (События) и
зависимостью Субъекта и Обсервера от него, что позволяет получить отношение
“многие ко многим”, и, в итоге, систему, известную нам как PubSub или Event Emitter.
Диспетчер — может быть как Синглтоном, так и неотъемлемой частью Субъекта.
Не во всех языках и средах возможна передача информации о типе через Диспетчер,
потому приходится либо откатываться на “event.type” & “event.data as any”, либо
использовать классический, строго типизированный Обсервер.
Взаимодействия и варианты
observer
Примеры использования
observer
Software design patterns
Eugene S. Merkoulov
E-mail, LinkedIn
Aller Media Norge
2019

More Related Content

Similar to Software Design Patterns

Большие проекты, архитектура и фреймворки.
Большие проекты, архитектура и фреймворки.Большие проекты, архитектура и фреймворки.
Большие проекты, архитектура и фреймворки.EatDog
 
C++ осень 2013 лекция 8
C++ осень 2013 лекция 8C++ осень 2013 лекция 8
C++ осень 2013 лекция 8Technopark
 
C++ осень 2012 лекция 7
C++ осень 2012 лекция 7C++ осень 2012 лекция 7
C++ осень 2012 лекция 7Technopark
 
Евгений Кривошеев: Фундаментальные правила и принципы проектирования ПО
Евгений Кривошеев: Фундаментальные правила и принципы проектирования ПОЕвгений Кривошеев: Фундаментальные правила и принципы проектирования ПО
Евгений Кривошеев: Фундаментальные правила и принципы проектирования ПОLuxoft Education Center
 
Автоматизация design patterns и компактный код вместе с PostSharp
Автоматизация design patterns и компактный код вместе с PostSharpАвтоматизация design patterns и компактный код вместе с PostSharp
Автоматизация design patterns и компактный код вместе с PostSharpGoSharp
 
Шаблоны проектирования GoF
Шаблоны проектирования GoFШаблоны проектирования GoF
Шаблоны проектирования GoFUnguryan Vitaliy
 
Шаблоны проектирования в Magento
Шаблоны проектирования в MagentoШаблоны проектирования в Magento
Шаблоны проектирования в MagentoPavel Usachev
 
шаблоны проектирования
шаблоны проектированияшаблоны проектирования
шаблоны проектированияksmster
 
Dependency injection
Dependency injectionDependency injection
Dependency injectionGetDev.NET
 
Как пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на SwiftКак пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на SwiftAnton Loginov
 
AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)Andrey Gordienkov
 
Aspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAndrey Gordienkov
 
Создаем Drupal дистрибутив: от идеи до сопровождения
Создаем Drupal дистрибутив: от идеи до сопровожденияСоздаем Drupal дистрибутив: от идеи до сопровождения
Создаем Drupal дистрибутив: от идеи до сопровожденияOvadiah Myrgorod
 
JavaScript design patterns overview
JavaScript design patterns overview JavaScript design patterns overview
JavaScript design patterns overview Kseniya Redunova
 
JavaScript Design Patterns overview by Ksenia Redunova
JavaScript Design Patterns overview by Ksenia RedunovaJavaScript Design Patterns overview by Ksenia Redunova
JavaScript Design Patterns overview by Ksenia RedunovaLohika_Odessa_TechTalks
 
Database automated deployment and versioning ...for smart people
Database automated deployment and versioning ...for smart peopleDatabase automated deployment and versioning ...for smart people
Database automated deployment and versioning ...for smart peopleAlexey Diyan
 
Шаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. ВведниеШаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. ВведниеSergey Nemchinsky
 
разработка бизнес приложений (7)
разработка бизнес приложений (7)разработка бизнес приложений (7)
разработка бизнес приложений (7)Alexander Gornik
 

Similar to Software Design Patterns (20)

Большие проекты, архитектура и фреймворки.
Большие проекты, архитектура и фреймворки.Большие проекты, архитектура и фреймворки.
Большие проекты, архитектура и фреймворки.
 
C++ осень 2013 лекция 8
C++ осень 2013 лекция 8C++ осень 2013 лекция 8
C++ осень 2013 лекция 8
 
C++ осень 2012 лекция 7
C++ осень 2012 лекция 7C++ осень 2012 лекция 7
C++ осень 2012 лекция 7
 
Design Rules And Principles
Design Rules And PrinciplesDesign Rules And Principles
Design Rules And Principles
 
Евгений Кривошеев: Фундаментальные правила и принципы проектирования ПО
Евгений Кривошеев: Фундаментальные правила и принципы проектирования ПОЕвгений Кривошеев: Фундаментальные правила и принципы проектирования ПО
Евгений Кривошеев: Фундаментальные правила и принципы проектирования ПО
 
Автоматизация design patterns и компактный код вместе с PostSharp
Автоматизация design patterns и компактный код вместе с PostSharpАвтоматизация design patterns и компактный код вместе с PostSharp
Автоматизация design patterns и компактный код вместе с PostSharp
 
Шаблоны проектирования GoF
Шаблоны проектирования GoFШаблоны проектирования GoF
Шаблоны проектирования GoF
 
Шаблоны проектирования в Magento
Шаблоны проектирования в MagentoШаблоны проектирования в Magento
Шаблоны проектирования в Magento
 
шаблоны проектирования
шаблоны проектированияшаблоны проектирования
шаблоны проектирования
 
Refactoring
RefactoringRefactoring
Refactoring
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
Как пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на SwiftКак пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на Swift
 
AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)
 
Aspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design Patterns
 
Создаем Drupal дистрибутив: от идеи до сопровождения
Создаем Drupal дистрибутив: от идеи до сопровожденияСоздаем Drupal дистрибутив: от идеи до сопровождения
Создаем Drupal дистрибутив: от идеи до сопровождения
 
JavaScript design patterns overview
JavaScript design patterns overview JavaScript design patterns overview
JavaScript design patterns overview
 
JavaScript Design Patterns overview by Ksenia Redunova
JavaScript Design Patterns overview by Ksenia RedunovaJavaScript Design Patterns overview by Ksenia Redunova
JavaScript Design Patterns overview by Ksenia Redunova
 
Database automated deployment and versioning ...for smart people
Database automated deployment and versioning ...for smart peopleDatabase automated deployment and versioning ...for smart people
Database automated deployment and versioning ...for smart people
 
Шаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. ВведниеШаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. Введние
 
разработка бизнес приложений (7)
разработка бизнес приложений (7)разработка бизнес приложений (7)
разработка бизнес приложений (7)
 

Software Design Patterns

  • 1. Eugene S. Merkoulov Aller Media Norge 2019
  • 2. Christopher Alexander, 1979 Christopher Alexander Origins & history
  • 3. Kent & Ward, 1987 Kent Beck Howard Cunningham Using Pattern Languages for Object-Oriented Programs OOPSLA-87 Origins & history
  • 4. Gang of Four, 1995 Erich Gamma Richard Helm Ralph Johnson John Vlissides Origins & history
  • 5. Вынесение семейства алгоритмов (аспектов, поведений) из некоторого комплексного контекста в отдельные классы с целью их взаимозаменяемости. Также известен как Стратегия. GoF Behavioral Software design patterns
  • 6. Вариативность некоторой части комплексного поведения, как во время сборки, так и во время выполнения. Предпосылки Эффекты Policy / strategy
  • 11. Определяет интерфейс для создания объектов, но предоставляет подклассам принимать решение о типе создаваемого объекта. Решает проблему зависимости клиентского кода от конкретных типов создаваемых объектов. GoF Creational Software design patterns
  • 12. Используем Фабрики когда ➔ контекст создаёт объекты ➔ разных (полиморфных) типов; ➔ возможно, сразу нескольких; ➔ у процесса создания есть зависимости, не нужные в самом Контексте. Предпосылки Эффекты factory
  • 13. Продукт Объекты полиморфных типов, либо их семейства, используемые в Контексте. factory
  • 15. S O L I D factory
  • 17. Скрывает детали логики создания объекта за абстракцией шагов, тем самым позволяет изменять некоторые шаги создания, как и сам тип создаваемого объекта. Разделяет процесс конструирования и внутреннее устройство объектов. Удобен для создания Композитов. GoF Creational Software design patterns
  • 18. Нанимаем Билдера когда ➔ конструируем Композиты; ➔ в Контексте есть лишние зависимости от внутреннего устройства Продукта; ➔ список аргументов конструктора стал слишком длинным. Предпосылки Эффекты builder
  • 20. Контекст создает экземпляры Билдера и Директора, конфигурирует второго первым. Директор реализует некоторый вариант процесса конструирования Продукта, используя интерфейс Билдера для производства компонентов Продукта. В простых случаях Контекст может брать на себя функции Директора. Взаимодействия и варианты builder
  • 21. Фабрика обычно просто предоставляет готовый Продукт, тогда как Билдер позволяет его конфигурировать и тоньше управлять процессом создания. Фабрика отвечает на вопрос “Что?”, а Билдер — на вопрос “Как?”. Фабрика самодостаточна, Билдеру нужен прораб (Директор). Фабрики могут быть реализованы на основе Билдеров. Как, впрочем, и наоборот. Отличия от Фабрик builder
  • 22. S O L I D builder
  • 24. Позволяет убедиться, что всегда существует только один экземпляр класса, и предоставить глобальную точку доступа к нему. GoF Creational Software design patterns
  • 25. Синглтон идёт в дело когда ➔ мы заблуждаемся на счёт того, что нам всегда будет достаточно одного экземпляра класса; ➔ необходимо подменять этот экземпляр объектами производных типов. Предпосылки Эффекты singleton
  • 26. Точка доступа к телу Синглтона может быть как статическим методом в классической реализации, так и отдельной функцией (make()/app() в Laravel). В некоторых языках (Typescript) допустимо возвращать производные типы из конструкторов базовых, что делает возможным сокрытие доступа за обычным оператором new. Взаимодействия и варианты builder
  • 27. Синглтон ригиден. Решение: полиморфизм и Dependency Injection в том или ином виде. Синглтоны иногда перестают быть синглтонами. Там где было одно соединение с БД, может появиться ещё одно для параллельных запросов. Там где был один DOM, когда-нибудь появится Shadow DOM. Где не было тестов, однажды они должны появиться, а вместе с ними и необходимость реинициализации разных вещей, в т.ч. и синглтонов. Решение: полумеры вроде Multiton, либо не использовать синглтоны вообще, а использовать какие-то пулы объектов. Проблемы и их решения singleton
  • 28. Механизм уведомления о событиях в приложении, с низкой связностью. GoF Behavioral Software design patterns
  • 29. Используем Обсервер когда ➔ когда нужно организовать отношение “многие ко многим” между частями приложения, ➔ и когда структурой этих зависимостей нужно управлять в рантайме. ➔ Также для вынесения сайд- эффектов BL (той её части, что не нужна немедленно для получения результата) (SRP). Предпосылки Эффекты observer
  • 32. Классический Обсервер отягощён прямой зависимостью Обсервера от Субъекта, и потому ограничен лишь отношением “один ко многим”. Это исправляется через DIP — введение промежуточной сущности (События) и зависимостью Субъекта и Обсервера от него, что позволяет получить отношение “многие ко многим”, и, в итоге, систему, известную нам как PubSub или Event Emitter. Диспетчер — может быть как Синглтоном, так и неотъемлемой частью Субъекта. Не во всех языках и средах возможна передача информации о типе через Диспетчер, потому приходится либо откатываться на “event.type” & “event.data as any”, либо использовать классический, строго типизированный Обсервер. Взаимодействия и варианты observer
  • 34. Software design patterns Eugene S. Merkoulov E-mail, LinkedIn Aller Media Norge 2019