Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 семестр ЗО / Лаб.работы / ЛабРаб № 10!.doc
Скачиваний:
56
Добавлен:
06.02.2016
Размер:
697.86 Кб
Скачать

Вопрос 2. Шаблоны

Опытные разработчики объектно-ориентированных систем сформулировали об­щие принципыистандартные решения, помогающие в разработке программного обеспечения. Если эти принципы и идиомы систематизировать и структуриро­вать, а также присвоить им имена, то их можно применять в качествешаблонов (patterns).

Приведем пример одного из таких шаблонов:

Имя шаблона

Information Expert

Решение

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

Решаемая проблема

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

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

Имена шаблонов

Именование шаблонов, методов и принципов имеет следующие преимущества:

  • Позволяет зафиксировать понятие в памяти;

  • Облегчает общение.

В частности, шаблоны GRASPимеют осмыс­ленные имена, например,Information Expert(Эксперт),Creator(Создатель),Pro­tected 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

Другие названия и аналогичные принципы: "Хранение обязанностей вместе с дан­ными", "Кто знает, тот и выполняет", "Сделай сам", "Размещайте службы вме­сте с их атрибутами".

Соседние файлы в папке Лаб.работы