SlideShare a Scribd company logo
1 of 44
Архитектура информационных
систем
Принципы GRASP
Проектирование на основе обязанностей
• Responsibility-driven design – это общий
подход к проектированию программных
объектов.
– Программные объекты рассматриваются как
люди, имеющие свои обязанности и
сотрудничающие с другими людьми для их
выполнения
Проектирование на основе распределение
обязанностей (GRASP)
Обязанности, относящиеся к действиям объекта
• Выполнение действий самим объектом
• Инициирование действий других объектов
• Управление действиями других объектов
Обязанности, относящиеся к знаниям объекта
• Наличие информации о закрытых инкапсулированных
данных
• Наличие информации о связанных объектах
• Наличие информации о следствиях или вычисляемых
величинах
Шаблон проектирования
• Это именованная пара «проблема-
решение», содержащая рекомендации для
применения в различных конкретных
ситуациях, которую можно использовать в
различных контекстах
Шаблоны GRASP
Creator
Information Expert
Low Coupling
Controller
High Cohesion
Polymorphism
Indirection
Creator
• Проблема: кто должен отвечать за создание нового
экземпляра некоторого класса?
• Решение: назначить классу B обязанность создавать
экземпляры класса A, если выполняется одно из условий:
– Класс В содержит или агрегирует объекты А
– Класс В записывает экземпляры объектов А
– Класс В активно использует объекты А
– Класс В обладает данными инициализации, которые будут
передаваться объектам А при их создании
Creator (пример)
Creator (особенности)
• Поддерживает принцип низкого
связывания (Low Coupling)
• Родственные шаблоны:
– Concrete Factory
– Abstract Factory
Information Expert
• Проблема: каков наиболее общий принцип
распределения обязанностей между
объектами при объектно-ориентированном
проектировании?
• Решение: назначить обязанность
информационному эксперту – классу, у
которого имеется информация, требуемая
для выполнения обязанностей
Information Expert (пример)
Information Expert (особенности)
• Поддерживает инкапсуляцию
• Поддерживает принцип низкого
связывания (Low Coupling)
• Поддерживает принцип высокого
зацепления (High Cohesion)
Low Coupling
• Проблема: как обеспечить
зависимость, незначительное влияние
изменений и повысить возможность
повторного использования?
• Решение: распределить обязанности таким
образом, чтобы степень связанности
оставалась низкой
Low Coupling (пример)
Low Coupling (особенности)
• Тесно связан с шаблонами Expert и High
Cohesion
• Изменение компонентов мало сказывается
на других объектах
• Принципы работы и функции компонентов
можно понять, не изучая другие объекты
• Удобство повторного использования
• Связан с Protected Variations
Controller
• Проблема: кто должен отвечать за получение и
координацию выполнения системных
операций, поступающих на уровне интерфейса
пользователя?
• Решение: делегирование обязанностей по обработке
системных сообщений классу, удовлетворяющему одному
из следующих условий
– Класс представляет всю систему в целом, корневой
объект, устройство или подсистему
– Класс представляет сценарий некоторого ВИ, в рамках
которого выполняется обработка всех системных событий
Controller (пример)
Хорошо
Плохо
Controller (особенности)
• Улучшение условий повторного
использования компонентов и
подключения интерфейсов
• Контроль состояний вариантов
использования
• Похожие шаблоны:
– Command
– Facade
– Layers
– Pure Fabrication
High Cohesion
• Проблема: как обеспечить
сфокусированность обязанностей
объекта, их управляемость и ясность, а
заодно выполнение принципа Low
Coupling?
• Решение: распределение
обязанностей, поддерживающее высокую
степень зацепления
High Cohesion (пример)
High Cohesion (особенности)
• Повышается ясность и простота проектных
решений
• Упрощается поддержка и доработка
• Зачастую обеспечивается слабое
связывание
• Улучшаются возможности повторного
использования
Polymorphism
• Проблема: как обрабатывать альтернативные
варианты поведения на основе типа? Как
создавать подключаемые программные
компоненты?
• Решение: если поведение объектов одного
типа (класса) может измениться, обязанности
распределяются для различных вариантов
поведения с использованием полиморфных
операций этого класса
Polymorphism (примеры)
Polymorphism (примеры)
Polymorphism (примеры)
Polymorphism (примеры)
Polymorphism (примеры)
Polymorphism (примеры)
Polymorphism (особенности)
• Позволяет легко расширять
систему, добавляя новые вариации
• Новые реализации можно вводить без
модификации клиентской части
приложения
• Связанные шаблоны:
– Protected Variations
– Adapter, Command, Composite, Proxy, State, Strat
egy …
Pure Fabrication
• Проблема: какой класс должен обеспечивать реализацию
шаблона High Cohesion и Low Coupling или других
принципов проектирования, если шаблон Expert
(например) не обеспечивает подходящего решения?
• Решение: присвоить группу обязанностей с высокой
степенью зацепления искусственному классу, не
представляющему конкретного понятия предметной
области, т.е. синтезировать искусственную сущность для
поддержки высокого зацепления, слабого связывания и
повторного использования
Pure Fabrication (примеры)
Pure Fabrication (особенности)
• Реализуется принцип высокого зацепления
• Повышается потенциал повторного
использования
• Связанные шаблоны:
– Low Coupling
– High Cohesion
– Adapter, Command, Strategy …
Indirection
• Проблема: как распределить
обязанности, чтобы обеспечить отсутствие
прямого связывания; снизить уровень
связывания объектов и сохранить высокий
потенциал повторного использования?
• Решение: присвоить обязанности
промежуточному объекту для обеспечения
связывания между другими компонентами
или службами, которые не связаны между
собой напрямую
Indirection (примеры)
Protected Variations
• Проблема: как спроектировать
объекты, подсистемы и систему, чтобы
изменение этих элементов не оказывало
нежелательное влияние на другие
элементы?
• Решение: идентифицировать точки
возможных вариаций или неустойчивости;
распределить обязанности таким
образом, чтобы обеспечить устойчивый
интерфейс
SOLID принципы проектирования
Принцип единственной ответственности (Single responsibility)
Принцип открытости/закрытости (Open-closed)
Принцип подстановки Барбары Лисков (Liskov substitution)
Принцип разделения интерфейса (Interface segregation)
Принцип инверсии зависимостей (Dependency Invertion)
Принцип единственной
ответственности
• «На каждый объект должна быть
возложена одна единственная
обязанность»
• Для этого проверяем, сколько у нас есть
причин для изменения класса — если
больше одной, то следует разбить данный
класс.
Принцип открытости/закрытости
• «Программные сущности должны быть
открыты для расширения, но закрыты
для модификации»
• Для этого представляем наш класс как
«чёрный ящик» и смотрим, можем ли в
таком случае изменить его поведение.
Принцип подстановки Барбары
Лисков
• «Объекты в программе могут быть
заменены их наследниками без изменения
свойств программы»
• Для этого проверяем, не усилили ли мы
предусловия и не ослабили ли постусловия.
Если это произошло — то принцип не
соблюдается
Принцип разделения интерфейса
• «Много специализированных интерфейсов
лучше, чем один универсальный»
• Проверяем, насколько много интерфейс
содержит методов и насколько разные
функции накладываются на эти методы, и
если необходимо — разбиваем
интерфейсы.
Принцип инверсии зависимостей
• «Зависимости должны строится
относительно абстракций, а не деталей»
• Проверяем, зависят ли классы от каких-то
других классов(непосредственно
инстанцируют объекты других классов и
т.д.) и если эта зависимость имеет
место, заменяем на зависимость от
абстракции.
Литература
• Крэг Ларман. Применение
UML 2.0 и шаблонов
проектирования. М.: ООО
«И.Д. Вильямс», 2007

More Related Content

What's hot

What's hot (20)

CKA_1st.pptx
CKA_1st.pptxCKA_1st.pptx
CKA_1st.pptx
 
【改訂版あり】クラウド・ネイティブ時代に最適なJavaベースのマイクロサービス・フレームワーク ~ Helidonの実力を見極めろ!
【改訂版あり】クラウド・ネイティブ時代に最適なJavaベースのマイクロサービス・フレームワーク ~ Helidonの実力を見極めろ!【改訂版あり】クラウド・ネイティブ時代に最適なJavaベースのマイクロサービス・フレームワーク ~ Helidonの実力を見極めろ!
【改訂版あり】クラウド・ネイティブ時代に最適なJavaベースのマイクロサービス・フレームワーク ~ Helidonの実力を見極めろ!
 
AWS for Games - 게임만을 위한 AWS 서비스 길라잡이 (레벨 200) - 진교선, 솔루션즈 아키텍트, AWS ::: Game...
AWS for Games - 게임만을 위한 AWS 서비스 길라잡이 (레벨 200) - 진교선, 솔루션즈 아키텍트, AWS :::  Game...AWS for Games - 게임만을 위한 AWS 서비스 길라잡이 (레벨 200) - 진교선, 솔루션즈 아키텍트, AWS :::  Game...
AWS for Games - 게임만을 위한 AWS 서비스 길라잡이 (레벨 200) - 진교선, 솔루션즈 아키텍트, AWS ::: Game...
 
디지털 해적들로부터 영상 콘텐츠 보호하기 – 황윤상 AWS 솔루션즈 아키텍트, 김준호 잉카엔트웍스 매니저:: AWS Cloud Week ...
디지털 해적들로부터 영상 콘텐츠 보호하기 –  황윤상 AWS 솔루션즈 아키텍트, 김준호 잉카엔트웍스 매니저:: AWS Cloud Week ...디지털 해적들로부터 영상 콘텐츠 보호하기 –  황윤상 AWS 솔루션즈 아키텍트, 김준호 잉카엔트웍스 매니저:: AWS Cloud Week ...
디지털 해적들로부터 영상 콘텐츠 보호하기 – 황윤상 AWS 솔루션즈 아키텍트, 김준호 잉카엔트웍스 매니저:: AWS Cloud Week ...
 
Verrazzanoご紹介
Verrazzanoご紹介Verrazzanoご紹介
Verrazzanoご紹介
 
Introduction to docker swarm
Introduction to docker swarmIntroduction to docker swarm
Introduction to docker swarm
 
[온라인교육시리즈] NKS에서 Cluster & Pods Autoscaling 적용
[온라인교육시리즈] NKS에서 Cluster & Pods Autoscaling 적용[온라인교육시리즈] NKS에서 Cluster & Pods Autoscaling 적용
[온라인교육시리즈] NKS에서 Cluster & Pods Autoscaling 적용
 
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)
 
Deep Dive on Accelerating Content, APIs, and Applications with Amazon CloudFr...
Deep Dive on Accelerating Content, APIs, and Applications with Amazon CloudFr...Deep Dive on Accelerating Content, APIs, and Applications with Amazon CloudFr...
Deep Dive on Accelerating Content, APIs, and Applications with Amazon CloudFr...
 
高速にコンテナを起動できるイメージフォーマット
高速にコンテナを起動できるイメージフォーマット高速にコンテナを起動できるイメージフォーマット
高速にコンテナを起動できるイメージフォーマット
 
MySQL Failover and Orchestrator
MySQL Failover and OrchestratorMySQL Failover and Orchestrator
MySQL Failover and Orchestrator
 
NewRelic x Terraform Cloud で Observability as Code
NewRelic x Terraform Cloud で Observability as CodeNewRelic x Terraform Cloud で Observability as Code
NewRelic x Terraform Cloud で Observability as Code
 
Oracle Database 11g Release 2 PSR 11.2.0.4 のご紹介
Oracle Database 11g Release 2 PSR 11.2.0.4 のご紹介Oracle Database 11g Release 2 PSR 11.2.0.4 のご紹介
Oracle Database 11g Release 2 PSR 11.2.0.4 のご紹介
 
[Outdated] Secrets of Performance Tuning Java on Kubernetes
[Outdated] Secrets of Performance Tuning Java on Kubernetes[Outdated] Secrets of Performance Tuning Java on Kubernetes
[Outdated] Secrets of Performance Tuning Java on Kubernetes
 
Deploy an Elastic, Resilient, Load-Balanced Cluster in 5 Minutes with Senlin
Deploy an Elastic, Resilient, Load-Balanced Cluster in 5 Minutes with SenlinDeploy an Elastic, Resilient, Load-Balanced Cluster in 5 Minutes with Senlin
Deploy an Elastic, Resilient, Load-Balanced Cluster in 5 Minutes with Senlin
 
K8s security best practices
K8s security best practicesK8s security best practices
K8s security best practices
 
【旧版】Oracle Exadata Cloud Service:サービス概要のご紹介 [2021年7月版]
【旧版】Oracle Exadata Cloud Service:サービス概要のご紹介 [2021年7月版]【旧版】Oracle Exadata Cloud Service:サービス概要のご紹介 [2021年7月版]
【旧版】Oracle Exadata Cloud Service:サービス概要のご紹介 [2021年7月版]
 
AWS를 활용해서 글로벌 게임 런칭하기 - 박진성 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021
AWS를 활용해서 글로벌 게임 런칭하기 - 박진성 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021AWS를 활용해서 글로벌 게임 런칭하기 - 박진성 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021
AWS를 활용해서 글로벌 게임 런칭하기 - 박진성 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021
 
PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...
PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...
PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...
 
AWSでアプリ開発するなら 知っておくべこと
AWSでアプリ開発するなら 知っておくべことAWSでアプリ開発するなら 知っておくべこと
AWSでアプリ開発するなら 知っておくべこと
 

Viewers also liked

02 Архитектура информационных систем. Основы
02 Архитектура информационных систем. Основы02 Архитектура информационных систем. Основы
02 Архитектура информационных систем. Основы
Edward Galiaskarov
 
03 Архитектура информационных систем. Принципы проектирования архитектуры
03 Архитектура информационных систем. Принципы проектирования архитектуры03 Архитектура информационных систем. Принципы проектирования архитектуры
03 Архитектура информационных систем. Принципы проектирования архитектуры
Edward Galiaskarov
 
06 Архитектура информационных систем. Паттерны и фреймворки
06 Архитектура информационных систем. Паттерны и фреймворки06 Архитектура информационных систем. Паттерны и фреймворки
06 Архитектура информационных систем. Паттерны и фреймворки
Edward Galiaskarov
 
04 Архитектура информационных систем. Архитектурные модели и стили
04 Архитектура информационных систем. Архитектурные модели и стили04 Архитектура информационных систем. Архитектурные модели и стили
04 Архитектура информационных систем. Архитектурные модели и стили
Edward Galiaskarov
 
05 Архитектура информационных систем. Атрибуты качества. Метод ADD
05 Архитектура информационных систем. Атрибуты качества. Метод ADD05 Архитектура информационных систем. Атрибуты качества. Метод ADD
05 Архитектура информационных систем. Атрибуты качества. Метод ADD
Edward Galiaskarov
 
Архитектурные стили и шаблоны
Архитектурные стили и шаблоныАрхитектурные стили и шаблоны
Архитектурные стили и шаблоны
Vlad Andrusenko
 
Краткая характеристика основных архитектурных стилей
Краткая характеристика основных архитектурных стилейКраткая характеристика основных архитектурных стилей
Краткая характеристика основных архитектурных стилей
инна ветрова
 
Системное мышление
Системное мышлениеСистемное мышление
Системное мышление
JaneKozmina
 
Плохой против хорошего консультанта
Плохой против хорошего консультантаПлохой против хорошего консультанта
Плохой против хорошего консультанта
JaneKozmina
 
Требования к по
Требования к поТребования к по
Требования к по
JaneKozmina
 
Нотации оформления требований
Нотации оформления требованийНотации оформления требований
Нотации оформления требований
JaneKozmina
 
Методологии разработки по
Методологии разработки поМетодологии разработки по
Методологии разработки по
JaneKozmina
 
Шаблоны оформления требований
Шаблоны оформления требованийШаблоны оформления требований
Шаблоны оформления требований
JaneKozmina
 

Viewers also liked (20)

02 Архитектура информационных систем. Основы
02 Архитектура информационных систем. Основы02 Архитектура информационных систем. Основы
02 Архитектура информационных систем. Основы
 
03 Архитектура информационных систем. Принципы проектирования архитектуры
03 Архитектура информационных систем. Принципы проектирования архитектуры03 Архитектура информационных систем. Принципы проектирования архитектуры
03 Архитектура информационных систем. Принципы проектирования архитектуры
 
06 Архитектура информационных систем. Паттерны и фреймворки
06 Архитектура информационных систем. Паттерны и фреймворки06 Архитектура информационных систем. Паттерны и фреймворки
06 Архитектура информационных систем. Паттерны и фреймворки
 
04 Архитектура информационных систем. Архитектурные модели и стили
04 Архитектура информационных систем. Архитектурные модели и стили04 Архитектура информационных систем. Архитектурные модели и стили
04 Архитектура информационных систем. Архитектурные модели и стили
 
01 Архитектура информационных систем. Общие понятия
01 Архитектура информационных систем. Общие понятия01 Архитектура информационных систем. Общие понятия
01 Архитектура информационных систем. Общие понятия
 
05 Архитектура информационных систем. Атрибуты качества. Метод ADD
05 Архитектура информационных систем. Атрибуты качества. Метод ADD05 Архитектура информационных систем. Атрибуты качества. Метод ADD
05 Архитектура информационных систем. Атрибуты качества. Метод ADD
 
Архитектурные стили и шаблоны
Архитектурные стили и шаблоныАрхитектурные стили и шаблоны
Архитектурные стили и шаблоны
 
Краткая характеристика основных архитектурных стилей
Краткая характеристика основных архитектурных стилейКраткая характеристика основных архитектурных стилей
Краткая характеристика основных архитектурных стилей
 
Спецификация на примерах или как научить людей общаться
Спецификация на примерах или как научить людей общатьсяСпецификация на примерах или как научить людей общаться
Спецификация на примерах или как научить людей общаться
 
Software documentation
Software documentationSoftware documentation
Software documentation
 
Системное мышление
Системное мышлениеСистемное мышление
Системное мышление
 
Плохой против хорошего консультанта
Плохой против хорошего консультантаПлохой против хорошего консультанта
Плохой против хорошего консультанта
 
Требования к по
Требования к поТребования к по
Требования к по
 
Нотации оформления требований
Нотации оформления требованийНотации оформления требований
Нотации оформления требований
 
Промышленная разработка ПО. Лекция 8. Особенности работы руководителя проекто...
Промышленная разработка ПО. Лекция 8. Особенности работы руководителя проекто...Промышленная разработка ПО. Лекция 8. Особенности работы руководителя проекто...
Промышленная разработка ПО. Лекция 8. Особенности работы руководителя проекто...
 
Методологии разработки по
Методологии разработки поМетодологии разработки по
Методологии разработки по
 
Шаблоны оформления требований
Шаблоны оформления требованийШаблоны оформления требований
Шаблоны оформления требований
 
Dump nzh 02
Dump nzh 02Dump nzh 02
Dump nzh 02
 
UML (basics of)
UML (basics of)UML (basics of)
UML (basics of)
 
IDEF - basics of
IDEF - basics ofIDEF - basics of
IDEF - basics of
 

Similar to 07 Архитектура информационных систем. Принципы GRASP

GRASP – паттерны Объектно-Ориентированного Проектирования
GRASP – паттерны Объектно-Ориентированного ПроектированияGRASP – паттерны Объектно-Ориентированного Проектирования
GRASP – паттерны Объектно-Ориентированного Проектирования
Alexander Nemanov
 
Шаблоны разработки ПО. Шаблоны GRASP
Шаблоны разработки ПО. Шаблоны GRASPШаблоны разработки ПО. Шаблоны GRASP
Шаблоны разработки ПО. Шаблоны GRASP
Sergey Nemchinsky
 
SOLID & GRASP
SOLID & GRASPSOLID & GRASP
SOLID & GRASP
devel123
 
C++ осень 2012 лекция 8
C++ осень 2012 лекция 8C++ осень 2012 лекция 8
C++ осень 2012 лекция 8
Technopark
 
Cергей Константинов, Яндекс
Cергей Константинов, ЯндексCергей Константинов, Яндекс
Cергей Константинов, Яндекс
Ontico
 
HighLoad весна 2014 лекция 1
HighLoad весна 2014 лекция 1HighLoad весна 2014 лекция 1
HighLoad весна 2014 лекция 1
Technopark
 

Similar to 07 Архитектура информационных систем. Принципы GRASP (20)

GRASP – паттерны Объектно-Ориентированного Проектирования
GRASP – паттерны Объектно-Ориентированного ПроектированияGRASP – паттерны Объектно-Ориентированного Проектирования
GRASP – паттерны Объектно-Ориентированного Проектирования
 
Шаблоны разработки ПО. Шаблоны GRASP
Шаблоны разработки ПО. Шаблоны GRASPШаблоны разработки ПО. Шаблоны GRASP
Шаблоны разработки ПО. Шаблоны GRASP
 
Grasp principles
Grasp principlesGrasp principles
Grasp principles
 
Grasp principles
Grasp principlesGrasp principles
Grasp principles
 
SOLID & GRASP
SOLID & GRASPSOLID & GRASP
SOLID & GRASP
 
SOLID
SOLIDSOLID
SOLID
 
Большие проекты, архитектура и фреймворки.
Большие проекты, архитектура и фреймворки.Большие проекты, архитектура и фреймворки.
Большие проекты, архитектура и фреймворки.
 
C++ осень 2012 лекция 8
C++ осень 2012 лекция 8C++ осень 2012 лекция 8
C++ осень 2012 лекция 8
 
Design principles
Design principles Design principles
Design principles
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.
 
Евгений Кривошеев: Фундаментальные правила и принципы проектирования ПО
Евгений Кривошеев: Фундаментальные правила и принципы проектирования ПОЕвгений Кривошеев: Фундаментальные правила и принципы проектирования ПО
Евгений Кривошеев: Фундаментальные правила и принципы проектирования ПО
 
Design Rules And Principles
Design Rules And PrinciplesDesign Rules And Principles
Design Rules And Principles
 
Как пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на SwiftКак пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на Swift
 
Cергей Константинов, Яндекс
Cергей Константинов, ЯндексCергей Константинов, Яндекс
Cергей Константинов, Яндекс
 
Solid code via tdd
Solid code via tddSolid code via tdd
Solid code via tdd
 
введение в объектно ориентированный анализ
введение в объектно ориентированный анализвведение в объектно ориентированный анализ
введение в объектно ориентированный анализ
 
HighLoad весна 2014 лекция 1
HighLoad весна 2014 лекция 1HighLoad весна 2014 лекция 1
HighLoad весна 2014 лекция 1
 
Принципы SOLID
Принципы SOLIDПринципы SOLID
Принципы SOLID
 
Модифицируемость программных систем
Модифицируемость программных системМодифицируемость программных систем
Модифицируемость программных систем
 
Общие темы. Тема 01.
Общие темы. Тема 01.Общие темы. Тема 01.
Общие темы. Тема 01.
 

07 Архитектура информационных систем. Принципы GRASP

  • 2. Проектирование на основе обязанностей • Responsibility-driven design – это общий подход к проектированию программных объектов. – Программные объекты рассматриваются как люди, имеющие свои обязанности и сотрудничающие с другими людьми для их выполнения
  • 3. Проектирование на основе распределение обязанностей (GRASP) Обязанности, относящиеся к действиям объекта • Выполнение действий самим объектом • Инициирование действий других объектов • Управление действиями других объектов Обязанности, относящиеся к знаниям объекта • Наличие информации о закрытых инкапсулированных данных • Наличие информации о связанных объектах • Наличие информации о следствиях или вычисляемых величинах
  • 4. Шаблон проектирования • Это именованная пара «проблема- решение», содержащая рекомендации для применения в различных конкретных ситуациях, которую можно использовать в различных контекстах
  • 5. Шаблоны GRASP Creator Information Expert Low Coupling Controller High Cohesion Polymorphism Indirection
  • 6. Creator • Проблема: кто должен отвечать за создание нового экземпляра некоторого класса? • Решение: назначить классу B обязанность создавать экземпляры класса A, если выполняется одно из условий: – Класс В содержит или агрегирует объекты А – Класс В записывает экземпляры объектов А – Класс В активно использует объекты А – Класс В обладает данными инициализации, которые будут передаваться объектам А при их создании
  • 8. Creator (особенности) • Поддерживает принцип низкого связывания (Low Coupling) • Родственные шаблоны: – Concrete Factory – Abstract Factory
  • 9. Information Expert • Проблема: каков наиболее общий принцип распределения обязанностей между объектами при объектно-ориентированном проектировании? • Решение: назначить обязанность информационному эксперту – классу, у которого имеется информация, требуемая для выполнения обязанностей
  • 11. Information Expert (особенности) • Поддерживает инкапсуляцию • Поддерживает принцип низкого связывания (Low Coupling) • Поддерживает принцип высокого зацепления (High Cohesion)
  • 12. Low Coupling • Проблема: как обеспечить зависимость, незначительное влияние изменений и повысить возможность повторного использования? • Решение: распределить обязанности таким образом, чтобы степень связанности оставалась низкой
  • 14. Low Coupling (особенности) • Тесно связан с шаблонами Expert и High Cohesion • Изменение компонентов мало сказывается на других объектах • Принципы работы и функции компонентов можно понять, не изучая другие объекты • Удобство повторного использования • Связан с Protected Variations
  • 15. Controller • Проблема: кто должен отвечать за получение и координацию выполнения системных операций, поступающих на уровне интерфейса пользователя? • Решение: делегирование обязанностей по обработке системных сообщений классу, удовлетворяющему одному из следующих условий – Класс представляет всю систему в целом, корневой объект, устройство или подсистему – Класс представляет сценарий некоторого ВИ, в рамках которого выполняется обработка всех системных событий
  • 17.
  • 20. Controller (особенности) • Улучшение условий повторного использования компонентов и подключения интерфейсов • Контроль состояний вариантов использования • Похожие шаблоны: – Command – Facade – Layers – Pure Fabrication
  • 21. High Cohesion • Проблема: как обеспечить сфокусированность обязанностей объекта, их управляемость и ясность, а заодно выполнение принципа Low Coupling? • Решение: распределение обязанностей, поддерживающее высокую степень зацепления
  • 23. High Cohesion (особенности) • Повышается ясность и простота проектных решений • Упрощается поддержка и доработка • Зачастую обеспечивается слабое связывание • Улучшаются возможности повторного использования
  • 24. Polymorphism • Проблема: как обрабатывать альтернативные варианты поведения на основе типа? Как создавать подключаемые программные компоненты? • Решение: если поведение объектов одного типа (класса) может измениться, обязанности распределяются для различных вариантов поведения с использованием полиморфных операций этого класса
  • 31. Polymorphism (особенности) • Позволяет легко расширять систему, добавляя новые вариации • Новые реализации можно вводить без модификации клиентской части приложения • Связанные шаблоны: – Protected Variations – Adapter, Command, Composite, Proxy, State, Strat egy …
  • 32. Pure Fabrication • Проблема: какой класс должен обеспечивать реализацию шаблона High Cohesion и Low Coupling или других принципов проектирования, если шаблон Expert (например) не обеспечивает подходящего решения? • Решение: присвоить группу обязанностей с высокой степенью зацепления искусственному классу, не представляющему конкретного понятия предметной области, т.е. синтезировать искусственную сущность для поддержки высокого зацепления, слабого связывания и повторного использования
  • 34. Pure Fabrication (особенности) • Реализуется принцип высокого зацепления • Повышается потенциал повторного использования • Связанные шаблоны: – Low Coupling – High Cohesion – Adapter, Command, Strategy …
  • 35. Indirection • Проблема: как распределить обязанности, чтобы обеспечить отсутствие прямого связывания; снизить уровень связывания объектов и сохранить высокий потенциал повторного использования? • Решение: присвоить обязанности промежуточному объекту для обеспечения связывания между другими компонентами или службами, которые не связаны между собой напрямую
  • 37. Protected Variations • Проблема: как спроектировать объекты, подсистемы и систему, чтобы изменение этих элементов не оказывало нежелательное влияние на другие элементы? • Решение: идентифицировать точки возможных вариаций или неустойчивости; распределить обязанности таким образом, чтобы обеспечить устойчивый интерфейс
  • 38. SOLID принципы проектирования Принцип единственной ответственности (Single responsibility) Принцип открытости/закрытости (Open-closed) Принцип подстановки Барбары Лисков (Liskov substitution) Принцип разделения интерфейса (Interface segregation) Принцип инверсии зависимостей (Dependency Invertion)
  • 39. Принцип единственной ответственности • «На каждый объект должна быть возложена одна единственная обязанность» • Для этого проверяем, сколько у нас есть причин для изменения класса — если больше одной, то следует разбить данный класс.
  • 40. Принцип открытости/закрытости • «Программные сущности должны быть открыты для расширения, но закрыты для модификации» • Для этого представляем наш класс как «чёрный ящик» и смотрим, можем ли в таком случае изменить его поведение.
  • 41. Принцип подстановки Барбары Лисков • «Объекты в программе могут быть заменены их наследниками без изменения свойств программы» • Для этого проверяем, не усилили ли мы предусловия и не ослабили ли постусловия. Если это произошло — то принцип не соблюдается
  • 42. Принцип разделения интерфейса • «Много специализированных интерфейсов лучше, чем один универсальный» • Проверяем, насколько много интерфейс содержит методов и насколько разные функции накладываются на эти методы, и если необходимо — разбиваем интерфейсы.
  • 43. Принцип инверсии зависимостей • «Зависимости должны строится относительно абстракций, а не деталей» • Проверяем, зависят ли классы от каких-то других классов(непосредственно инстанцируют объекты других классов и т.д.) и если эта зависимость имеет место, заменяем на зависимость от абстракции.
  • 44. Литература • Крэг Ларман. Применение UML 2.0 и шаблонов проектирования. М.: ООО «И.Д. Вильямс», 2007