Code It Easy With GRASP Patterns

28
Code it easy with GRASP Pa terns Alex kucherenko Android Soſtware Engineer

description

Доклад

Transcript of Code It Easy With GRASP Patterns

Page 1: Code It Easy With GRASP Patterns

Code it easy with GRASP Paterns 

Alex kucherenkoAndroid Software Engineer

Page 2: Code It Easy With GRASP Patterns

Craig Larman. Применение UML и шаблонов проектирования

GRASP

Page 3: Code It Easy With GRASP Patterns

GRASP stands for

eneralGesponsibilityRssignmentAoftwareSaternsP

Page 4: Code It Easy With GRASP Patterns

Paterns list Creator

Information Expert

Low Coupling

Controller

High Cohesion

Polymorphism

Pure Fabrication

Indirection

Protected Variations

Page 5: Code It Easy With GRASP Patterns

Creator

Проблема

Решение

Кто отвечает за создание нового экземпляра некоторого класса А?

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

Page 6: Code It Easy With GRASP Patterns

Creator. Пример

Кто создает объект Square ?

Ответ: класс Board

Page 7: Code It Easy With GRASP Patterns

Creator. Диаграмма

Динамическаямодель

Статическаямодель

Page 8: Code It Easy With GRASP Patterns

Information Expert

Проблема

Решение

Каков базовый принцип распределения обязанностей между объектами?

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

Page 9: Code It Easy With GRASP Patterns

Information Expert. Диаграмма

Page 10: Code It Easy With GRASP Patterns

Low Coupling

Проблема

Решение

Как уменьшить влияние вносимых изменений на другие объекты?

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

Page 11: Code It Easy With GRASP Patterns

Controller

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

Page 12: Code It Easy With GRASP Patterns

Controller. Диаграмма

Page 13: Code It Easy With GRASP Patterns

ControllerРешение

Присвоить эту обязанность классу, удовлетворяющему одному из следующих условий: Класс представляет всю систему в целом,

корневой объект, устройство или важную подсистему (внешний контроллер)

Класс представляет сценарий некоторого прецедента, в рамках которого выполняется обработка этой системной операции (контроллерпрецедента или контроллер сеанса)

Page 14: Code It Easy With GRASP Patterns

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

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

Page 15: Code It Easy With GRASP Patterns

High Cohesion

ПроблемаКак обеспечить сфокусированность обязанностей объектов, их управляемость и ясность, а заодно выполнение принципа Low Coupling?

Page 16: Code It Easy With GRASP Patterns

High Cohesion

Нельзя просто так взять...

...и сделать все в одном классе

Page 17: Code It Easy With GRASP Patterns

High Cohesion

РешениеОбеспечивать высокий уровень зацепления в процессе распределения обязанностей. Этот принцип нужно использовать для оценки различных альтернатив

Page 18: Code It Easy With GRASP Patterns

High Cohesion

Page 19: Code It Easy With GRASP Patterns

Polymorphism

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

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

Page 20: Code It Easy With GRASP Patterns

Polymorphism. Диаграмма

Page 21: Code It Easy With GRASP Patterns

Pure FabricationПроблема

Какой класс должен обеспечить реализацию шаблонов High Cohesion и Low Coupling или других принципов проектирования, если шаблон Expert (например) не обеспечивает подходящего решения?

Page 22: Code It Easy With GRASP Patterns

Pure Fabrication

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

Page 23: Code It Easy With GRASP Patterns

Pure Fabrication. Пример Какой класс должен сохранять экземпляры

класса "Продажа" в реляционной базе данных?

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

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

Page 24: Code It Easy With GRASP Patterns

Pure Fabrication

РешениеСоздать класс PersistentStorage, ответственный за сохранение обьектов некоторого вида в базе данных

Page 25: Code It Easy With GRASP Patterns

IndirectionПроблема

Как распределить обязанности, чтобы обеспечить отсутствие прямого связывания; снизить уровень связывания объектов, согласно шаблону Low Coupling,и сохранить высокий потенциал повторного использования?

РешениеПрисвоить обязанности по обеспечению связи между службами или компонентами промежуточному объекту

Page 26: Code It Easy With GRASP Patterns

IndirectionСвязанные шаблоны и принципы

Protected variations Low Coupling Многие шаблоны GoF, в том числе Adapter,

Bridge, Observer и Mediator Различные частные случаи использования

шаблона Pure Fabrication

Page 27: Code It Easy With GRASP Patterns

Protected VariationsПроблема

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

РешениеИдентифицировать точки возможных вариаций или неустойчивости;распределить обязанности таким образом, чтобы обеспечить устойчивый интерфейс

Page 28: Code It Easy With GRASP Patterns

Thank You!