- •Проектирование информационных систем
- •Вопрос 1. Обязанности, методы, взаимодействия
- •Вопрос 2. Шаблоны
- •Information Expert
- •Шаблон Information Expert
- •Шаблон Creator
- •Шаблон Low Coupling
- •Шаблон High Cohesion
- •Шаблон Controller
- •Вопрос 3. Реализация прецедентов
- •Пример: Реализация прецедентов для данной итерации разработки pos системы тт
- •Проектное решение: makeNewSale
- •Выбор класса-контроллера
- •Проектное решение: enterItem
- •Проектное решение: endSale
- •Проектное решение: makePayment
- •Проектное решение: startup
- •Проектное решение: store-create
- •Подключение уровня интерфейса пользователя к уровню предметной области
Вопрос 2. Шаблоны
Опытные разработчики объектно-ориентированных систем сформулировали общие принципыистандартные решения, помогающие в разработке программного обеспечения. Если эти принципы и идиомы систематизировать и структурировать, а также присвоить им имена, то их можно применять в качествешаблонов (patterns).
Приведем пример одного из таких шаблонов:
Имя шаблона
|
Information Expert
|
Решение
|
Обязанности назначаются классу, который имеет информацию, необходимую для их выполнения
|
Решаемая проблема |
Каков основной принцип распределения обязанностей между объектами? |
В объектно-ориентированной технологии проектирования шаблономназывают именованное описание проблемы и ее решения, которые можно применить при разработке других систем. (Другими словами, шаблон – это именованная пара "проблема/решение", содержащая рекомендации для применения в различных конкретных ситуациях, которую можно использовать в различных контекстах.)
Имена шаблонов
Именование шаблонов, методов и принципов имеет следующие преимущества:
Позволяет зафиксировать понятие в памяти;
Облегчает общение.
В частности, шаблоны GRASPимеют осмысленные имена, например,Information Expert(Эксперт),Creator(Создатель),Protected Variations(Защищенные вариации).
Если шаблон имеет имя, то его легко обсуждать с другими разработчиками. Использование общеизвестных имен не только облегчает общение, но и позволяет обсуждать вопросы разработки на более высоком уровне абстракции.
Применение шаблонов GRASP
Ниже приводится описание основных пяти шаблонов GRASP:
Information Expert
Creator
High Cohesion
Low Coupling
Controller
Применение этих шаблонов касается основных и фундаментальных вопросов проектирования.
Система обозначений диаграммы классов в языке UML
Диаграммы классов иллюстрируют взаимоотношения программных элементов. Обозначение класса состоит из трех частей, в которых указываются имя класса, его атрибуты и методы (рис. 2.1).
Рисунок 2.1 – Имена методов программных классов
Система обозначений диаграммы классов будет использоваться при описании шаблонов.
Шаблон Information Expert
Решение.Назначить обязанность информационному эксперту – классу, у которого имеется информация, требуемая для выполнения обязанности.
Проблема.Каков наиболее общий принцип распределения обязанностей между объектами при объектно-ориентированном проектировании?
В модели системы могут быть определены десятки или сотни программных классов, а в приложении может потребоваться выполнение сотен или тысяч обязанностей. Во время объектно-ориентированного проектирования при формулировке принципов взаимодействия объектов необходимо распределить обязанности между классами. При правильном выполнении этой задачи система становится гораздо проще для понимания, поддержки и расширения. Кроме того, появляется возможность повторного использования уже разработанных компонентов в последующих приложениях.
Пример. В приложении POS-системы ТТ некоторому классу необходимо знать общую сумму продажи.
Начинать распределение обязанностей следует с их четкой формулировки.
С этой точки зрения можно сформулировать следующее утверждение: Какой класс должен отвечать за знание общей суммы продажи?
Согласно шаблону InformationExpert, нужно определить, объекты каких классов содержат информацию, необходимую для вычисления общей суммы.
Теперь возникает ключевой вопрос: на основе какой модели нужно анализировать информацию – модели предметной области или проектирования?Модель предметной области иллюстрирует концептуальные классы из предметной области системы, а в модели проектирования показаны программные классы.
Ответ на этот вопрос сводится к следующему:
если в модели проектирования имеются соответствующие классы, в первую очередь, следует использовать ее;
в противном случае нужно обратиться к модели предметной области и постараться уточнить ее для облегчения создания соответствующих программных классов.
Например, предположим, мы находимся в самом начале этапа проектирования, когда модель проектирования представлена в минимальном объеме. Следовательно, кандидатуру на роль информационного эксперта следует искать в модели предметной области. Вероятно, на эту роль подойдет концептуальный классSale. Тогда в модель проектирования нужно добавить соответствующий программный класс под именемSaleи присвоить ему обязанность вычисления общей стоимости, реализуемую с помощью вызова методаgetTotal. При таком подходе сокращается разрыв между организацией программных объектов и соответствующих им понятий из предметной области.
Чтобы рассмотреть этот пример подробнее, обратимся к фрагменту модели предметной области, представленному на рис. 2.2:
Рисунок 2.2 – Ассоциации объекта Sale
Какая информация требуется для вычисления общей суммы?Необходимо узнать стоимость всех проданных товаровSalesLineItemи просуммировать эти промежуточные суммы. Такой информацией обладает лишь экземпляр объект,Sale. Следовательно, с точки зрения шаблонаInformationExpertобъектSaleподходит для выполнения этой обязанности, т.е. являетсяинформационным экспертом(informationexpert).
Как уже упоминалось, подобные вопросы распределения обязанностей зачастую возникают при создании диаграмм взаимодействий. Представьте, что вы приступили к работе, начав создание диаграмм для распределения обязанностей между объектами. Принятые решения иллюстрируются на фрагменте диаграммы взаимодействий, представленном на рис. 2.3.
Рисунок 2.3 – Фрагмент диаграммы взаимодействий
Однако на данном этапе выполнена не вся работа. Какая информация требуется для вычисления промежуточной суммы элементов продажи? Необходимы значения атрибутов SalesLineItem.quantityиSalesLineItem.price. ОбъектуSalesLineItemизвестно количество товара и известен связанный с ним объектProductSpecification. Следовательно, в соответствии с шаблономExpert, промежуточную сумму должен вычислять объект SalesLineItem. Другими словами, этот объект являетсяинформационным экспертом.
В терминах диаграмм взаимодействий это означает, что объект Saleдолжен передать сообщенияgetSubtotalкаждому объекту SalesLineItem, а затем просуммировать полученные результаты. Этот процесс проиллюстрирован на рис. 2.4:
Рисунок 2.4 – Вычисление общей суммы продажи
Для выполнения обязанности, связанной со знанием и предоставлением промежуточной суммы, объекту SalesLineItem должна быть известна стоимость товара.
В данном случае в качестве информационного эксперта будет выступать объект ProductSpecification.
Результаты проектирования представлены на рис. 2.5:
Рисунок 2.5 – Вычисление общей суммы продажи
Для выполнения обязанности "знать и предоставлять общую сумму продажи трем объектам классов" были следующим образом присвоены три обязанности.
Класс |
Обязанность
|
Sale
|
Знание общей суммы продажи
|
SalesLineItem
|
Знание промежуточной суммы для данного товара
|
ProductSpecification
|
Знание цены товара
|
Рассмотрение и распределение обязанностей выполнялись в процессе создания диаграммы взаимодействий. Затем полученные результаты могут быть реализованы в разделе методов диаграммы классов.
При назначении обязанностей, согласно шаблону Expert, был применен следующий принцип: обязанности связываются с тем объектом, который имеет информацию, необходимую для их выполнения.
Преимущества
Шаблон Expertподдерживает инкапсуляцию. Для выполнения требуемых задач объекты используют собственные данные. Подобную возможность обеспечивает также шаблонLowCoupling, применение которого приводит к созданию более надежных и легко поддерживаемых систем.
Соответствующее поведение системы обеспечивается несколькими классами, содержащими требуемую информацию. Это приводит к определениям классов, которые гораздо проще понимать и поддерживать. Кроме того, поддерживается шаблон HighCohesion.
Связанные шаблоны:
Low Coupling
High Cohesion
Другие названия и аналогичные принципы: "Хранение обязанностей вместе с данными", "Кто знает, тот и выполняет", "Сделай сам", "Размещайте службы вместе с их атрибутами".