Слайд 2Обязанности
Обязанность – контракт или обязательство классификатора.
Действие
Выполнение действий другим объектом (создание экземпляра или
выполнение вычислений)
Инициирование действий других объектов
Управление действиями других объектов или их координирование
Знание
Наличие информации о закрытых инкапсулированных данных
Наличие информации о связных объектах
Наличие информации о следствиях или вычисляемых величинах
Слайд 4Обязанности
Операция => Обязанность
Обязанность ≠> Операция
Слайд 5Обязанности
на диаграммах взаимодействия
Слайд 6GRASP
Шаблоны GRAS или GRASP – General Responsibility Assignment Software Patterns
Информационный эксперт (Information
Expert)
Создатель (Creator)
Высокое зацепление (High Cohesion)
Слабое связывание (Low Coupling)
Контроллер (Controller)
Полиморфизм (Polymorphism)
Чистая выдумка (Pure Fabrication)
Посредник (Indirection)
Сокрытие реализации (Protected Variations)
Слайд 7Информационный эксперт
Проблема:
Необходимо выявить наиболее общий принцип распределения обязанностей между объектами.
Решение:
Назначить обязанность информационному
эксперту – классу, у которого имеется информация, требуемая для выполнения обязанности.
Слайд 8Информационный эксперт
GetTotalPrice()
?
!
Слайд 10Информационный эксперт
Требуемая обязанность:
Знать и предоставлять общую сумму продажи.
Итоговое распределение обязанностей:
Слайд 11Информационный эксперт
Выводы
Самый часто используемый шаблон распределения обязанностей.
Аналогия с реальным миром.
Существование «частичных» экспертов.
Слайд 12Информационный эксперт
Преимущества
Поддерживает инкапсуляцию
Поведение обеспечивается несколькими классами, содержащими требуемую информацию => простота понимания
и поддержки.
Слайд 13Информационный эксперт
не следует применять
В тех случаях, когда это нарушает связывание и сцепление.
SQL
Слайд 14Создатель
Проблема:
Кто должен отвечать за создание нового экземпляра некоторого класса?
Решение:
Назначить классу B обязанность
создавать экземпляры класса A, если выполняется одно из следующих условий:
Класс B агрегирует объекты A.
Слайд 15Создатель
Класс B содержит объекты A.
Класс B записывает экземпляры объектов A.
Слайд 16Создатель
Класс B активно использует объекты A.
Класс B обладает данными инициализации объектов A.
Класс
B – создатель объектов A.
Слайд 19Создатель
Выводы
Самый распространенный способ распределения обязанностей, связанных с созданием объектов – простота выявления
объекта-создателя, при сохранении низкой степени связанности.
Создатель, содержащий данные инициализации – шаблон Информационный эксперт.
Слайд 20Создатель
не следует применять
Когда создание – сложная операция, выполняемая при реализации некоторого условия
на основе каких-либо внешних свойств.
В этом случае предпочтительнее использовать шаблон Фабрика (Factory).
Слайд 21Создатель
Преимущества
Не повышает степень связанности, так как созданный объект обычно оказывается видимым для
объекта-создателя.
Слайд 22Слабое связывание(Low Coupling)
Проблема:
Как обеспечить минимальную зависимость, минимальный риск изменений и повышенное
повторное использование?
Связывание – мера того, насколько сильно элементы связаны, зависят друг от друга.
Сильное связывание приводит к проблемам:
Изменения в одном классе влекут необходимость в изменении другого
Сложность понимания элемента в изоляции от других
Сложность повторного использования
Слайд 23Слабое связывание(Low Coupling)
Паттерн «Создатель» нам диктует:
Но можно поразмыслить:
Слайд 24Слабое связывание(Low Coupling)
Классы ClassX и ClassY могут быть связаны:
ClassX имеет атрибут, который
ссылается на ClassY
ClassX содержит операцию, которая ссылается на ClassY (использует экземпляр класса в качестве параметра, переменной или возвращаемого значения)
ClassX – непосредственный потомок ClassY
ClassY – интерфейс, а ClassX его реализует
Слайд 25Слабое связывание(Low Coupling)
Применение
Применяется вместе с другими паттернами (такими как Высокое зацепление и
Эксперт)
Применяется в случае «нестабильности» в эволюционном смысле слова. Не применяется в отношении к классам статических библиотек.
Применяется в разумных пределах
Слайд 26Слабое связывание(Low Coupling)
Результаты
Решение проблемы
Классы не зависят от изменений в других классах
Классы легко
понимаемы вне контекста
Классы удобны для повторного использования
Слайд 27Высокое зацепление (High cohesion)
Проблема
Как управлять необъятным?
Зацепление – мера того, насколько взаимосвязаны и
целенаправленны обязанности, возложенные на элемент.
Элемент с взаимосвязанными обязанностями обладает высоким зацеплением.
Слабое зацепление приводит к проблемам:
Класс трудно «познать»
Класс трудно использовать повторно
Класс трудно поддерживать
Класс «нежен»
Слайд 28Высокое зацепление (High cohesion)
Мы снова доверяемся паттерну «Создатель»
Слайд 29Высокое зацепление (High cohesion)
Но тогда Register может разбухнуть!
Попробуем все же вот так:
Слайд 30Высокое зацепление (High cohesion)
Классификация зацеплений (by Grady Booch)
Очень низкое зацепление (RDB-RPC-Interface)
Низкое зацепление
(RDB-Interface)
Высокое зацепление
Умеренное зацепление (Company)
Слайд 31Высокое зацепление (High cohesion)
Зацепление и связывание
Инь и Янь программной инженерии
Исключения
Упрощение обслуживания одним
человеком (ICQ Expert)
Удаленные операции
Слайд 32Высокое зацепление (High cohesion)
Результаты
Ясность и простота понимания дизайна
Упрощение поддержки и эволюции
Слабое связывание
в подарок
Повторное использование
Слайд 33Контроллер
Проблема
Кто должен быть ответственен за обработку системных событий ввода?
Системное сообщение ввода– сообщение,
сгенерированное внешним актером. Они ассоциированы с операциями системы в ответ на событие.
Слайд 35Контроллер
Варианты контроллера
Фасадный контроллер - представляет всю систему(или подсистему) в совокупности
Register
Название, соответствующее системе
(ChessGame)
Контроллер варианта использования представляет ВИ, в пределах которого возникают сообщения.
Handler
Слайд 36Контроллер
Выбор контроллера
Фасадный контроллер
Малое количество событий
UI не может перенаправить системные сообщения на переменные
контроллеры (как в системах обработки сообщений)
Контроллер ВИ
Большое количество событий
Необходимо поддерживать логику ВИ
UI не должны быть ответственны за события ввода!
Слайд 39Контроллер
Результаты
Логика приложения отделена от интерфейса
Повторное использование
Учет состояния варианта использования
Слайд 40Контроллер
Проблемы
Один единственный контроллер, принимающий орды сообщений
Контроллер берет на себя часть обязанностей по
обработке сообщений
Контроллер содержит много аттрибутов
Контроллер хранит дубликаты информации из системы
Решения
Увеличить количество контроллеров
Проектировать контроллер чтобы он только делегировал обязанности другим объектам
Слайд 41Благодарность
Creig Larman, за его интереснейшую книгу “Applying UML and patterns”.
Слайд 42Благодарность
Гради Бучу, за то, что учил Крэга Лармана. И за то, что
научил.
Слайд 43Благодарность
А.Ю. Шелестову, за перевод замечательной книги Крэга Лармана на русский язык («Применение
UML и шаблонов проектирования»).
Слайд 44Благодарность
Google Search, за его релевантную выдачу.
Слайд 45Благодарность
Ru.wikipedia.org, за понимание темы в целом.
Слайд 46Благодарность
Пакету Microsoft Office 2007, за прекрасные инструменты создания презентаций.
Слайд 47Благодарность
И, конечно, отдельное спасибо компании Blizzard, за ее бессмертные игры.