SlideShare a Scribd company logo
1 of 27
Design Patterns. Шаблоны
GRASP
Немчинский Сергей
2008
GRASP



Craig Larman
Книга Applying UML and Patterns, 3ed.
GRASP stands for General
Responsibility Assignment Software
Patterns.
Полный список шаблонов
GRASP










Information Expert
Creator
Controller
Low Coupling
High Cohesion
Polymorphism
Pure Fabrication
Indirection
Protected Variations
Шаблон информационный эксперт
(Information Expert)- GRASP


Проблема




Решение




В системе должна аккумулироваться, рассчитываться и т. п.
необходимая информация.

Назначить обязанность аккумуляции информации, расчета и т.
п. некоему классу (информационному эксперту), обладающему
необходимой информацией.

Рекомендации


Информационным экспертом может быть не один класс, а
несколько.
Эксперт. Пример






Необходимо рассчитать общую сумму
продажи. Имеются классы проектирования
"Продажа", "ТоварПродажа" (продажа
отдельного вида товара в рамках продажи
в целом), "ТоварСпецификация" (описание
конкретного вида товара).
Необходимо распределить обязанности по
предоставлению информации и расчету
между этими классами.
Таким образом, все три объекта являются
информационными экспертами.
Эксперт. Диаграмма классов
Создатель экземпляров
класса (Creator) - GRASP


Проблема




Решение




"Кто" должен отвечать за создание
экземпляров класса.
Назначить классу В обязанность создавать
объекты другого класса А

Рекомендации


Логично использовать паттерн если класс В
содержит, агрегирует, активно использует и т.п.
объекты класса А.
Creator. Пример.




необходимо определить, какой
объект должен отвечать за создание
экземпляра "ТоварПродажа".
Логично, чтобы это был объект
"Продажа", поскольку он содержит
(агрегирует) несколько обьектов
"ТоварПродажа".
Creator. Диаграмма
последовательности
Creator. Критика


Преимущества




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

Недостатки


Если процедура создания объекта достаточно
сложная (например выполняется на основе
некоего внешнего условия), логично
использовать паттерн "Абстрактная Фабрика",,
то есть, делегировать обязанность создания
объектов специальному классу.
Контроллер (Controller) GRASP


Проблема




Решение




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

Рекомендации


Для различных прецедентов логично использовать разные
контроллеры (контроллеры прецедентов) - контроллеры не
должны быть перегружены. Внешний контроллер представляет
всю систему целиком, его можно использовать, если он будет
не слишком перегруженным (то есть, если существует лишь
несколько системных событий).
Controller. Критика


Преимущества






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

Недостатки


Контроллер может оказаться перегружен.
Низкая связанность (Low
Coupling)


Проблема




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

Решение


Распределить обязанности между
объектами так, чтобы степень
связанности оставалась низкой.
Низкая связанность. Пример
Высокое зацепление (High
Cohesion) - GRASP


Проблема




Необходимо обеспечить выполнение
объектами разнородных функций.

Решение


Обеспечить распределение
обязанностей с высоким зацеплением.
Высокое зацепление.
Критика


Преимущества




Классы с высокой степенью зацепления просты
в поддержке и повторном использовании.

Недостатки


Иногда бывает неоправданно использовать
высокое зацепление для распределенных
серверных обьектов. В этом случае для
обеспечения быстродействия необходимо
создать несколько более крупных серверных
обьектов со слабым зацеплением.
Полиморфизм
(Polymorphism) - GRASP


Проблема






Как обрабатывать альтернативные варианты
поведения на основе типа?
Как заменять подключаемые компоненты
системы?

Решение




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

Преимущества




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

Недостатки


Не следует злоупотреблять
добавлением интерфейсов с
применением принципа полиморфизма с
целью обеспечения дееспособности
системы в неизвестных заранее новых
ситуациях.
Искусственный (Pure
Fabrication) - GRASP


Проблема




Какой класс должен обеспечивать реализацию
паттернов "Высокое зацепление", и "Низкая
связанность"?

Решение


Присвоить группу обязанностей с высокой
степенью зацепления классу, который не
представляет конкретного понятия из
предметной области (синтезировать
искусственную сущность для обеспечения
высокого зацепления и слабого связывания).
Искусственный. Пример






Какой класс должен сохранять экземпляры класса
"Продажа" в реляционной базе данных?
Если возложить эту обязанность на класс
"Продажа", то будем иметь низкую степень
зацепления и высокую степень связывания
(поскольку класс "Продажа" должен быть связан с
интерфейсом реляционной базы данных.
Хранение объектов в реляционной базе данных это общая задача, которую придется решать для
многих классов.
Искусственный. Пример


Решением данной проблемы будет создание
нового класса "ПостоянноеХранилище",
ответственного за сохранение обьектов
некоторого вида в базе данных.
Искуственный. Критика


Преимущества




Класс "ПостоянноеХранилище" будет
обладать низкой степенью связывания и
высокой степенью зацепления.

Недостатки


Данным паттерном не следует
злоупотреблять иначе все функции
системы превратятся в объекты.
Перенаправление
(Indirection) - GRASP


Проблема




Решение




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

Пример


См. пример к паттерну "Искусственный". Класс
"Хранилище" выступает в роли промежуточного звена
между классом "Продажа" и базой данных.
Устойчивый к изменениям
(Protected Variations) GRASP


Проблема




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

Решение


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

Паттерны GRASP:










Information Expert
Creator
Controller
Low Coupling
High Cohesion
Polymorphism
Pure Fabrication
Indirection
Protected Variations

More Related Content

What's hot

Object-oriented Programming-with C#
Object-oriented Programming-with C#Object-oriented Programming-with C#
Object-oriented Programming-with C#Doncho Minkov
 
Managing dependencies with gradle
Managing dependencies with gradleManaging dependencies with gradle
Managing dependencies with gradleLiviu Tudor
 
Understanding react hooks
Understanding react hooksUnderstanding react hooks
Understanding react hooksMaulik Shah
 
Design Pattern For C# Part 1
Design Pattern For C# Part 1Design Pattern For C# Part 1
Design Pattern For C# Part 1Shahzad
 
Padrões-10 - Padrões Criacionais - Singleton
Padrões-10 - Padrões Criacionais - SingletonPadrões-10 - Padrões Criacionais - Singleton
Padrões-10 - Padrões Criacionais - SingletonEduardo Nicola F. Zagari
 
S.O.L.I.D. Principles for Software Architects
S.O.L.I.D. Principles for Software ArchitectsS.O.L.I.D. Principles for Software Architects
S.O.L.I.D. Principles for Software ArchitectsRicardo Wilkins
 
React Class Components vs Functional Components: Which is Better?
React Class Components vs Functional Components: Which is Better?React Class Components vs Functional Components: Which is Better?
React Class Components vs Functional Components: Which is Better?Fibonalabs
 
UML (Unified Modeling Language)
UML (Unified Modeling Language)UML (Unified Modeling Language)
UML (Unified Modeling Language)Nguyen Tuan
 
Working With Legacy Code
Working With Legacy CodeWorking With Legacy Code
Working With Legacy CodeAndrea Polci
 
UML Prezentation class diagram
UML Prezentation class diagramUML Prezentation class diagram
UML Prezentation class diagramjuliettco
 
C# Exceptions Handling
C# Exceptions Handling C# Exceptions Handling
C# Exceptions Handling sharqiyem
 
Introduction to Design Patterns and Singleton
Introduction to Design Patterns and SingletonIntroduction to Design Patterns and Singleton
Introduction to Design Patterns and SingletonJonathan Simon
 
Introduction to SOLID Principles
Introduction to SOLID PrinciplesIntroduction to SOLID Principles
Introduction to SOLID PrinciplesGanesh Samarthyam
 
Functional Programming in Swift
Functional Programming in SwiftFunctional Programming in Swift
Functional Programming in SwiftSaugat Gautam
 
Learning solid principles using c#
Learning solid principles using c#Learning solid principles using c#
Learning solid principles using c#Aditya Kumar Rajan
 
Design Patterns - Abstract Factory Pattern
Design Patterns - Abstract Factory PatternDesign Patterns - Abstract Factory Pattern
Design Patterns - Abstract Factory PatternMudasir Qazi
 
소프트웨어 아키텍처 평가(Atam)
소프트웨어 아키텍처 평가(Atam)소프트웨어 아키텍처 평가(Atam)
소프트웨어 아키텍처 평가(Atam)영기 김
 

What's hot (20)

Object-oriented Programming-with C#
Object-oriented Programming-with C#Object-oriented Programming-with C#
Object-oriented Programming-with C#
 
Managing dependencies with gradle
Managing dependencies with gradleManaging dependencies with gradle
Managing dependencies with gradle
 
Understanding react hooks
Understanding react hooksUnderstanding react hooks
Understanding react hooks
 
Design Pattern For C# Part 1
Design Pattern For C# Part 1Design Pattern For C# Part 1
Design Pattern For C# Part 1
 
Padrões-10 - Padrões Criacionais - Singleton
Padrões-10 - Padrões Criacionais - SingletonPadrões-10 - Padrões Criacionais - Singleton
Padrões-10 - Padrões Criacionais - Singleton
 
S.O.L.I.D. Principles for Software Architects
S.O.L.I.D. Principles for Software ArchitectsS.O.L.I.D. Principles for Software Architects
S.O.L.I.D. Principles for Software Architects
 
React Class Components vs Functional Components: Which is Better?
React Class Components vs Functional Components: Which is Better?React Class Components vs Functional Components: Which is Better?
React Class Components vs Functional Components: Which is Better?
 
UML (Unified Modeling Language)
UML (Unified Modeling Language)UML (Unified Modeling Language)
UML (Unified Modeling Language)
 
Working With Legacy Code
Working With Legacy CodeWorking With Legacy Code
Working With Legacy Code
 
UML Prezentation class diagram
UML Prezentation class diagramUML Prezentation class diagram
UML Prezentation class diagram
 
C# Exceptions Handling
C# Exceptions Handling C# Exceptions Handling
C# Exceptions Handling
 
Introduction to Design Patterns and Singleton
Introduction to Design Patterns and SingletonIntroduction to Design Patterns and Singleton
Introduction to Design Patterns and Singleton
 
Introduction to SOLID Principles
Introduction to SOLID PrinciplesIntroduction to SOLID Principles
Introduction to SOLID Principles
 
Functional Programming in Swift
Functional Programming in SwiftFunctional Programming in Swift
Functional Programming in Swift
 
Bridge Design Pattern
Bridge Design PatternBridge Design Pattern
Bridge Design Pattern
 
Learning solid principles using c#
Learning solid principles using c#Learning solid principles using c#
Learning solid principles using c#
 
SOLID principles
SOLID principlesSOLID principles
SOLID principles
 
Design Patterns - Abstract Factory Pattern
Design Patterns - Abstract Factory PatternDesign Patterns - Abstract Factory Pattern
Design Patterns - Abstract Factory Pattern
 
Design pattern-presentation
Design pattern-presentationDesign pattern-presentation
Design pattern-presentation
 
소프트웨어 아키텍처 평가(Atam)
소프트웨어 아키텍처 평가(Atam)소프트웨어 아키텍처 평가(Atam)
소프트웨어 아키텍처 평가(Atam)
 

Similar to Шаблоны разработки ПО. Шаблоны GRASP

Grasp principles
Grasp principlesGrasp principles
Grasp principlesarybik
 
07 Архитектура информационных систем. Принципы GRASP
07 Архитектура информационных систем. Принципы GRASP07 Архитектура информационных систем. Принципы GRASP
07 Архитектура информационных систем. Принципы GRASPEdward Galiaskarov
 
Введение в машинное обучение
Введение в машинное обучениеВведение в машинное обучение
Введение в машинное обучениеGrigory Sapunov
 
Role based access-control
Role based access-controlRole based access-control
Role based access-controlAlex Frolov
 
Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)
Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)
Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)Ontico
 
Web20 from zero
Web20 from zeroWeb20 from zero
Web20 from zeroqweasdrty
 
ВИРТУАЛЬНАЯ ЛАБОРАТОРИЯ ОБУЧЕНИЯ МЕТОДАМ ИСКУССТВЕННОГО ИНТЕЛЛЕКТА ДЛЯ ГЕНЕРА...
ВИРТУАЛЬНАЯ ЛАБОРАТОРИЯ ОБУЧЕНИЯ МЕТОДАМ ИСКУССТВЕННОГО ИНТЕЛЛЕКТА ДЛЯ ГЕНЕРА...ВИРТУАЛЬНАЯ ЛАБОРАТОРИЯ ОБУЧЕНИЯ МЕТОДАМ ИСКУССТВЕННОГО ИНТЕЛЛЕКТА ДЛЯ ГЕНЕРА...
ВИРТУАЛЬНАЯ ЛАБОРАТОРИЯ ОБУЧЕНИЯ МЕТОДАМ ИСКУССТВЕННОГО ИНТЕЛЛЕКТА ДЛЯ ГЕНЕРА...ITMO University
 
Александр Гладыш — Visual editor for business logic in Lua and JS
Александр Гладыш — Visual editor for business logic in Lua and JSАлександр Гладыш — Visual editor for business logic in Lua and JS
Александр Гладыш — Visual editor for business logic in Lua and JSYury Yurevich
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5Technopark
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.Igor Shkulipa
 
Dependency injection
Dependency injectionDependency injection
Dependency injectionGetDev.NET
 
АРК-ПЗ-1.pptx
АРК-ПЗ-1.pptxАРК-ПЗ-1.pptx
АРК-ПЗ-1.pptxrobete3065
 
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нёмFrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нёмFrontDays
 
Глава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeansГлава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeansmetaform
 

Similar to Шаблоны разработки ПО. Шаблоны GRASP (20)

Grasp principles
Grasp principlesGrasp principles
Grasp principles
 
Grasp principles
Grasp principlesGrasp principles
Grasp principles
 
07 Архитектура информационных систем. Принципы GRASP
07 Архитектура информационных систем. Принципы GRASP07 Архитектура информационных систем. Принципы GRASP
07 Архитектура информационных систем. Принципы GRASP
 
лек11 7
лек11 7лек11 7
лек11 7
 
лек11 7
лек11 7лек11 7
лек11 7
 
Введение в машинное обучение
Введение в машинное обучениеВведение в машинное обучение
Введение в машинное обучение
 
Role based access-control
Role based access-controlRole based access-control
Role based access-control
 
Java 9 - кратко о новом
Java 9 -  кратко о новомJava 9 -  кратко о новом
Java 9 - кратко о новом
 
Unit Testing
Unit TestingUnit Testing
Unit Testing
 
Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)
Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)
Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)
 
Web20 from zero
Web20 from zeroWeb20 from zero
Web20 from zero
 
ВИРТУАЛЬНАЯ ЛАБОРАТОРИЯ ОБУЧЕНИЯ МЕТОДАМ ИСКУССТВЕННОГО ИНТЕЛЛЕКТА ДЛЯ ГЕНЕРА...
ВИРТУАЛЬНАЯ ЛАБОРАТОРИЯ ОБУЧЕНИЯ МЕТОДАМ ИСКУССТВЕННОГО ИНТЕЛЛЕКТА ДЛЯ ГЕНЕРА...ВИРТУАЛЬНАЯ ЛАБОРАТОРИЯ ОБУЧЕНИЯ МЕТОДАМ ИСКУССТВЕННОГО ИНТЕЛЛЕКТА ДЛЯ ГЕНЕРА...
ВИРТУАЛЬНАЯ ЛАБОРАТОРИЯ ОБУЧЕНИЯ МЕТОДАМ ИСКУССТВЕННОГО ИНТЕЛЛЕКТА ДЛЯ ГЕНЕРА...
 
Uml
UmlUml
Uml
 
Александр Гладыш — Visual editor for business logic in Lua and JS
Александр Гладыш — Visual editor for business logic in Lua and JSАлександр Гладыш — Visual editor for business logic in Lua and JS
Александр Гладыш — Visual editor for business logic in Lua and JS
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
АРК-ПЗ-1.pptx
АРК-ПЗ-1.pptxАРК-ПЗ-1.pptx
АРК-ПЗ-1.pptx
 
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нёмFrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
 
Глава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeansГлава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeans
 

More from Sergey Nemchinsky

Как найти первую работу и как с нее не вылететь
Как найти первую работу и как с нее не вылететьКак найти первую работу и как с нее не вылететь
Как найти первую работу и как с нее не вылететьSergey Nemchinsky
 
основы Java переменные, циклы
основы Java   переменные, циклыосновы Java   переменные, циклы
основы Java переменные, циклыSergey Nemchinsky
 
Как пишутся и поддерживаются Enterprise системы
Как пишутся и поддерживаются Enterprise системыКак пишутся и поддерживаются Enterprise системы
Как пишутся и поддерживаются Enterprise системыSergey Nemchinsky
 
Как найти первую работу и не вылететь с нее
Как найти первую работу  и не вылететь с нееКак найти первую работу  и не вылететь с нее
Как найти первую работу и не вылететь с нееSergey Nemchinsky
 
Быть разработчиком: вызовы, ожидания, перестроение мозгов
Быть разработчиком: вызовы, ожидания, перестроение мозговБыть разработчиком: вызовы, ожидания, перестроение мозгов
Быть разработчиком: вызовы, ожидания, перестроение мозговSergey Nemchinsky
 
Service oriented architecture, Oracle Service Bus
Service oriented architecture, Oracle Service BusService oriented architecture, Oracle Service Bus
Service oriented architecture, Oracle Service BusSergey Nemchinsky
 
Java enterprise: обучение, работа, перспективы
Java enterprise: обучение, работа, перспективыJava enterprise: обучение, работа, перспективы
Java enterprise: обучение, работа, перспективыSergey Nemchinsky
 
Enterprise или на чем стоит мир
Enterprise или на чем стоит мирEnterprise или на чем стоит мир
Enterprise или на чем стоит мирSergey Nemchinsky
 
Java enterprise: Обучение, работа, перспективы
Java enterprise: Обучение, работа, перспективыJava enterprise: Обучение, работа, перспективы
Java enterprise: Обучение, работа, перспективыSergey Nemchinsky
 
Основы Java. 5. Databases
Основы Java. 5. DatabasesОсновы Java. 5. Databases
Основы Java. 5. DatabasesSergey Nemchinsky
 
Основы Java. 4. Collection Framework
Основы Java. 4. Collection FrameworkОсновы Java. 4. Collection Framework
Основы Java. 4. Collection FrameworkSergey Nemchinsky
 
Основы Java. 3. Конструкторы, уровни доступа, статика
Основы Java. 3. Конструкторы, уровни доступа, статикаОсновы Java. 3. Конструкторы, уровни доступа, статика
Основы Java. 3. Конструкторы, уровни доступа, статикаSergey Nemchinsky
 
Основы Java. ООП. Объекты, классы, интерфейсы
Основы Java. ООП. Объекты, классы, интерфейсыОсновы Java. ООП. Объекты, классы, интерфейсы
Основы Java. ООП. Объекты, классы, интерфейсыSergey Nemchinsky
 
Щаблоны разработки ПО. Антипаттерны
Щаблоны разработки ПО. АнтипаттерныЩаблоны разработки ПО. Антипаттерны
Щаблоны разработки ПО. АнтипаттерныSergey Nemchinsky
 
Шаблоны разработки ПО. Рефакторинг
Шаблоны разработки ПО. РефакторингШаблоны разработки ПО. Рефакторинг
Шаблоны разработки ПО. РефакторингSergey Nemchinsky
 

More from Sergey Nemchinsky (17)

Как найти первую работу и как с нее не вылететь
Как найти первую работу и как с нее не вылететьКак найти первую работу и как с нее не вылететь
Как найти первую работу и как с нее не вылететь
 
основы Java переменные, циклы
основы Java   переменные, циклыосновы Java   переменные, циклы
основы Java переменные, циклы
 
Как пишутся и поддерживаются Enterprise системы
Как пишутся и поддерживаются Enterprise системыКак пишутся и поддерживаются Enterprise системы
Как пишутся и поддерживаются Enterprise системы
 
Как найти первую работу и не вылететь с нее
Как найти первую работу  и не вылететь с нееКак найти первую работу  и не вылететь с нее
Как найти первую работу и не вылететь с нее
 
Быть разработчиком: вызовы, ожидания, перестроение мозгов
Быть разработчиком: вызовы, ожидания, перестроение мозговБыть разработчиком: вызовы, ожидания, перестроение мозгов
Быть разработчиком: вызовы, ожидания, перестроение мозгов
 
Service oriented architecture, Oracle Service Bus
Service oriented architecture, Oracle Service BusService oriented architecture, Oracle Service Bus
Service oriented architecture, Oracle Service Bus
 
Java enterprise: обучение, работа, перспективы
Java enterprise: обучение, работа, перспективыJava enterprise: обучение, работа, перспективы
Java enterprise: обучение, работа, перспективы
 
Enterprise или на чем стоит мир
Enterprise или на чем стоит мирEnterprise или на чем стоит мир
Enterprise или на чем стоит мир
 
Java enterprise: Обучение, работа, перспективы
Java enterprise: Обучение, работа, перспективыJava enterprise: Обучение, работа, перспективы
Java enterprise: Обучение, работа, перспективы
 
Основы Java. 5. Databases
Основы Java. 5. DatabasesОсновы Java. 5. Databases
Основы Java. 5. Databases
 
Основы Java. 4. Web
Основы Java. 4. WebОсновы Java. 4. Web
Основы Java. 4. Web
 
Основы Java. 4. Collection Framework
Основы Java. 4. Collection FrameworkОсновы Java. 4. Collection Framework
Основы Java. 4. Collection Framework
 
Основы Java. 3. Конструкторы, уровни доступа, статика
Основы Java. 3. Конструкторы, уровни доступа, статикаОсновы Java. 3. Конструкторы, уровни доступа, статика
Основы Java. 3. Конструкторы, уровни доступа, статика
 
Основы Java. 2. JVM
Основы Java. 2. JVMОсновы Java. 2. JVM
Основы Java. 2. JVM
 
Основы Java. ООП. Объекты, классы, интерфейсы
Основы Java. ООП. Объекты, классы, интерфейсыОсновы Java. ООП. Объекты, классы, интерфейсы
Основы Java. ООП. Объекты, классы, интерфейсы
 
Щаблоны разработки ПО. Антипаттерны
Щаблоны разработки ПО. АнтипаттерныЩаблоны разработки ПО. Антипаттерны
Щаблоны разработки ПО. Антипаттерны
 
Шаблоны разработки ПО. Рефакторинг
Шаблоны разработки ПО. РефакторингШаблоны разработки ПО. Рефакторинг
Шаблоны разработки ПО. Рефакторинг
 

Шаблоны разработки ПО. Шаблоны GRASP

  • 2. GRASP   Craig Larman Книга Applying UML and Patterns, 3ed. GRASP stands for General Responsibility Assignment Software Patterns.
  • 3. Полный список шаблонов GRASP          Information Expert Creator Controller Low Coupling High Cohesion Polymorphism Pure Fabrication Indirection Protected Variations
  • 4. Шаблон информационный эксперт (Information Expert)- GRASP  Проблема   Решение   В системе должна аккумулироваться, рассчитываться и т. п. необходимая информация. Назначить обязанность аккумуляции информации, расчета и т. п. некоему классу (информационному эксперту), обладающему необходимой информацией. Рекомендации  Информационным экспертом может быть не один класс, а несколько.
  • 5. Эксперт. Пример    Необходимо рассчитать общую сумму продажи. Имеются классы проектирования "Продажа", "ТоварПродажа" (продажа отдельного вида товара в рамках продажи в целом), "ТоварСпецификация" (описание конкретного вида товара). Необходимо распределить обязанности по предоставлению информации и расчету между этими классами. Таким образом, все три объекта являются информационными экспертами.
  • 7. Создатель экземпляров класса (Creator) - GRASP  Проблема   Решение   "Кто" должен отвечать за создание экземпляров класса. Назначить классу В обязанность создавать объекты другого класса А Рекомендации  Логично использовать паттерн если класс В содержит, агрегирует, активно использует и т.п. объекты класса А.
  • 8. Creator. Пример.   необходимо определить, какой объект должен отвечать за создание экземпляра "ТоварПродажа". Логично, чтобы это был объект "Продажа", поскольку он содержит (агрегирует) несколько обьектов "ТоварПродажа".
  • 10. Creator. Критика  Преимущества   Использование этого паттерна не повышает связанности, поскольку созданный класс, как правило, виден только для класса - создателя. Недостатки  Если процедура создания объекта достаточно сложная (например выполняется на основе некоего внешнего условия), логично использовать паттерн "Абстрактная Фабрика",, то есть, делегировать обязанность создания объектов специальному классу.
  • 11. Контроллер (Controller) GRASP  Проблема   Решение   "Кто" должен отвечать за обработку входных системных событий? Обязанности по обработке системных сообщений делегируются специальному классу. Контроллер - это объект, который отвечает за обработку системных событий и не относится к интерфейсу пользователя. Контроллер определяет методы для выполнения системных операций. Рекомендации  Для различных прецедентов логично использовать разные контроллеры (контроллеры прецедентов) - контроллеры не должны быть перегружены. Внешний контроллер представляет всю систему целиком, его можно использовать, если он будет не слишком перегруженным (то есть, если существует лишь несколько системных событий).
  • 12. Controller. Критика  Преимущества    Удобно накапливать информацию о системных событиях (в случае, если системные операции выполняются в некоторой определенной последовательности). Улучшаются условия для повторного использования компонентов (системные события обрабатываются Контроллером а не элементами интерфейса пользователя). Недостатки  Контроллер может оказаться перегружен.
  • 13. Низкая связанность (Low Coupling)  Проблема   Обеспечить низкую связанность при создании экземпляра класса и связывании его с другим классом. Решение  Распределить обязанности между объектами так, чтобы степень связанности оставалась низкой.
  • 15. Высокое зацепление (High Cohesion) - GRASP  Проблема   Необходимо обеспечить выполнение объектами разнородных функций. Решение  Обеспечить распределение обязанностей с высоким зацеплением.
  • 16. Высокое зацепление. Критика  Преимущества   Классы с высокой степенью зацепления просты в поддержке и повторном использовании. Недостатки  Иногда бывает неоправданно использовать высокое зацепление для распределенных серверных обьектов. В этом случае для обеспечения быстродействия необходимо создать несколько более крупных серверных обьектов со слабым зацеплением.
  • 17. Полиморфизм (Polymorphism) - GRASP  Проблема    Как обрабатывать альтернативные варианты поведения на основе типа? Как заменять подключаемые компоненты системы? Решение   Обязанности распределяются для различных вариантов поведения с помощью полиморфных операций для этого класса. Каждая внешняя система имеет свой интерфейс.
  • 19. Полиморфизм. Критика  Преимущества   Впоследствии легко расширять и модернизировать систему. Недостатки  Не следует злоупотреблять добавлением интерфейсов с применением принципа полиморфизма с целью обеспечения дееспособности системы в неизвестных заранее новых ситуациях.
  • 20. Искусственный (Pure Fabrication) - GRASP  Проблема   Какой класс должен обеспечивать реализацию паттернов "Высокое зацепление", и "Низкая связанность"? Решение  Присвоить группу обязанностей с высокой степенью зацепления классу, который не представляет конкретного понятия из предметной области (синтезировать искусственную сущность для обеспечения высокого зацепления и слабого связывания).
  • 21. Искусственный. Пример    Какой класс должен сохранять экземпляры класса "Продажа" в реляционной базе данных? Если возложить эту обязанность на класс "Продажа", то будем иметь низкую степень зацепления и высокую степень связывания (поскольку класс "Продажа" должен быть связан с интерфейсом реляционной базы данных. Хранение объектов в реляционной базе данных это общая задача, которую придется решать для многих классов.
  • 22. Искусственный. Пример  Решением данной проблемы будет создание нового класса "ПостоянноеХранилище", ответственного за сохранение обьектов некоторого вида в базе данных.
  • 23. Искуственный. Критика  Преимущества   Класс "ПостоянноеХранилище" будет обладать низкой степенью связывания и высокой степенью зацепления. Недостатки  Данным паттерном не следует злоупотреблять иначе все функции системы превратятся в объекты.
  • 24. Перенаправление (Indirection) - GRASP  Проблема   Решение   Как перераспределить обязанности обьектов, чтобы обеспечить отсутствие прямого связывания? Присвоить обязанности по обеспечению связи между службами или компонентами промежуточному объекту. Пример  См. пример к паттерну "Искусственный". Класс "Хранилище" выступает в роли промежуточного звена между классом "Продажа" и базой данных.
  • 25. Устойчивый к изменениям (Protected Variations) GRASP  Проблема   Как спроектировать систему так, чтобы изменение одних ее элементов не влияло на другие? Решение  Идентифицировать точки возможных изменений или неустойчивости и распределить обязанности таким образом, чтобы обеспечить устойчивую работу системы.
  • 27. Итоги  Паттерны GRASP:          Information Expert Creator Controller Low Coupling High Cohesion Polymorphism Pure Fabrication Indirection Protected Variations