- •Проектирование информационных систем
- •Вопрос 1. Обязанности, методы, взаимодействия
- •Вопрос 2. Шаблоны
- •Information Expert
- •Шаблон Information Expert
- •Шаблон Creator
- •Шаблон Low Coupling
- •Шаблон High Cohesion
- •Шаблон Controller
- •Вопрос 3. Реализация прецедентов
- •Пример: Реализация прецедентов для данной итерации разработки pos системы тт
- •Проектное решение: makeNewSale
- •Выбор класса-контроллера
- •Проектное решение: enterItem
- •Проектное решение: endSale
- •Проектное решение: makePayment
- •Проектное решение: startup
- •Проектное решение: store-create
- •Подключение уровня интерфейса пользователя к уровню предметной области
Шаблон Creator
Решение.Назначить классу В обязанность создавать экземпляры класса А, если выполняется одно из следующих условий:
Класс В агрегирует,(aggregate) объекты А.
Класс В содержит(contains) объекты А.
Класс В записывает(records) экземпляры объектов А.
Класс В активно использует(closelyuses) объекты А.
Класс В обладает данными инициализации(hastheinitializingdata), которые будут передаваться объектам А при их создании (т.е. при создании объектов А класс В является экспертом).
Класс В – создатель(creator) объектов А.
Если выполняется несколько из этих условий, то лучше использовать класс В, агрегирующийилисодержащийкласс А.
Проблема.Кто должен отвечать за создание нового экземпляра некоторого класса?
Создание объектов в объектно-ориентированной системе является одним из наиболее стандартных видов деятельности. Следовательно, при назначении обязанностей, связанных с созданием объектов, полезно руководствоваться некоторым основным принципом. Правильно распределив обязанности при проектировании, можно создать слабо связанные независимые компоненты с возможностью их дальнейшего использования, упростить их, а также обеспечить инкапсуляцию данных и их повторное использование.
Пример.Кто в POS-системе должен отвечать за создание нового экземпляра объектаSalesLineltem?
В соответствии с шаблоном Creator, необходимо найти класс, агрегирующий, содержащий и т.д. экземпляры объектов SalesLineItem. Рассмотрим фрагмент модели предметной области, представленной на рис. 2.6:
Рисунок 2.6 – Фрагмент модели предметной области
Поскольку объект Saleсодержит (фактически – агрегирует) несколько объектовSalesLineItem, согласно шаблонуCreator, он является хорошим кандидатом для выполнения обязанности, связанной с созданием экземпляров объектовSalesLineItem.
Такой подход приводит к необходимости разработки взаимодействия объектов, показанного на следующей диаграмме (рис. 2.7):
Рисунок 2.7 – Создание экземпляра объекта SalesLineltem
При таком распределении обязанностей требуется, чтобы в объекте Saleбыл определен методmakeLineItem.
Рассмотрение и распределение обязанностей выполнялись в процессе создания диаграммы взаимодействий. Затем полученные результаты могут быть реализованы в конкретных методах, помещенных в разделе методов диаграммы классов.
Преимущества
Поддерживается шаблон LowCoupling(рассматриваемый ниже), способствующий снижению затрат на сопровождение и обеспечивающий возможность повторного использования созданных компонентов в дальнейшем применение шаблонаCreatorне повышает степени связанности, посколькусозданный(created) класс, как правило, оказывается видимым для класса создателя посредством имеющихся ассоциаций.
Связанные шаблоны и принципы:
LowCoupling.
Factory.
Шаблон Low Coupling
Решение.Распределить обязанности таким образом, чтобы степень связанности оставалась низкой.
Проблема.Как обеспечить зависимость, незначительное влияние изменений и повысить возможность повторного использования?
Степень связанности(coupling) – это мера, определяющая насколько жестко один элемент связан с другими элементами, либо каким количеством данных о других элементах он обладает. Элемент с низкой степенью связанности (или слабым связыванием) зависит от не очень большого числа других элементов. Выражение "очень много" зависит от контекста, однако необходимо провести его оценку.
Класс с высокой степенью связанности (или жестко связанный) зависит от множества других классов. Однако наличие таких классов нежелательно, поскольку оно приводит к возникновению следующих проблем:
Изменения в связанных классах приводят к локальным изменениям в данном классе.
Затрудняется понимание каждого класса в отдельности.
Усложняется повторное использование, поскольку для этого требуется дополнительный анализ классов, с которыми связан данный класс.
Пример.Рассмотрим следующий фрагмент диаграммы классов для приложения ТТ.
Предположим, что необходимо создать экземпляр класса Paymentи связать его с объектомSale.
Какой класс должен отвечать за выполнение этой операции?
Поскольку в реальной предметной области регистрация объекта Paymentвыполняется объектомRegister, в соответствии с шаблономCreator, объектRegisterявляется хорошим кандидатом для создания объектаPayment. Затем экземпляр объектаRegisterдолжен передать сообщениеaddPaymentобъектуSale, указав в качестве параметра новый объектPayment. Приведенные рассуждения отражены на фрагменте диаграммы взаимодействий, представленной на рис. 2.8:
Рисунок 2.8 – Новый экземпляр объекта Paymentсоздается с помощью объектаRegister
Такое распределение обязанностей предполагает, что класс Registerобладает знаниями о данных классаPayment(т.е. связывается с ним).
Обратите внимание на обозначения, принятые в языке UML. Экземпляру объектаPaymentприсвоено явное имяр, чтобы его можно было использовать в качестве параметра сообщения 2.
Альтернативный способ создания объекта Paymentи его связывания с объектомSaleпоказан на рис. 2.9:
Рисунок 2.9 – Новый экземпляр объекта Paymentсоздается с помощью объектаSale
Какой из методов проектирования, основанный на распределении обязанностей, обеспечивает более низкую степень связывания?В обоих случаях предполагается, что в конечном итоге объектуSaleдолжно быть известно о существовании объектаPayment. При использовании первого способа, когда объектPaymentсоздается с помощью объектаRegister, между этими двумя объектами добавляется новая связь, тогда как второй способ степень связывания объектов не усиливает. С точки зрения числа связей между объектами, более предпочтительным является второй способ, поскольку в этом случае обеспечивается низкая степень связывания. Приведенная иллюстрация является примером того, как при использовании двух различных шаблонов –LowCouplingиCreator– можно прийти к двум различным решениям.
На практике уровень связывания не рассматривается отдельно от других принципов, сформулированных в шаблонах Expert и High Cohesion. Тем не менее в шаблоне Low Coupling описан один из факторов, с использованием которого можно значительно улучшить весь проект в целом.
Преимущества:
Изменения компонентов мало сказываются на других объектах.
Принципы работы и функции компонентов можно понять, не изучая другие объекты.
Удобство повторного использования.
Связанные шаблоны:
ProtectedVariations(Защищенные вариации).