Задача: Subsystem Design (SOA)
This task extends the traditional RUP subsystem design with details specific to a SOA solution, especially where subsystems were identified from business analysis models. Once we make the transition from the business domain to the IT domain, we map identified functional areas defined by the former to subsystems, their IT counterparts.
Назначение

To link the business models to their IT counterparts we perform the following:

  • Identify the relationship between Functional Areas (Concept: Functional Area Analysis) in the Artifact: Business Analysis Model to corresponding Artifact: Design Subsystem.
  • To define the behaviors specified in the subsystem's interfaces in terms of collaborations of contained design elements and external subsystems/interfaces.
  • To document the internal structure of the subsystem, in terms of Artifact: Service Components that realize the Subsystem.
  • To define realizations between the subsystem's interfaces and contained components and classes.
  • To determine the dependencies upon other subsystems.
Взаимосвязи
РолиОсновной: Дополнительно: Помощь:
ВходыОбязательный: Необязательный: Внешний:
  • Нет
Выходы
Основное описание

We begin with the determination and documentation of the dependencies between subsystems that correspond to the functional areas that have been identified during Task: Functional Area Analysis. Usually a functional area will correspond to a single subsystem; that is, the simplifying assumption that has been found to be accurate in many, if not most cases. If we decide to map a functional area to several subsystems, that can also be feasible and valid; but usually means the domain decomposition did not go deep enough and the functional areas are not granular enough.

Шаги
Document Subsystem Origin

During Task: Functional Area Analysis we identified a set of subsystems that corresponded to the input received from a Component Business Map (see Concept: Component Business Modeling). During Process Decomposition, the identified leaf-level activity nodes (Concept: Business Process Decomposition) may be placed on the subsystems as the operations or services that the subsystem, as a facade, will provide. The functionality of these operations will be realized by the service component’s functional components. Also, you may choose to group these operations onto interfaces that are offered by the subsystem. The operation non-functional requirements will be used to mine out the technical components and services required within the subsystem.

It is important that the relationship between these identified subsystems and their original source be kept in-place. In cases where both the business-level and service model work products are in UML, the dependency information may easily be stored in the models; otherwise, such information should be stored in the Template: Service Model in Word or held in an associated work product.

ISV Considerations: Services may be realized through existing subsystems such as custom applications, software packages and/or Independent Software Vendors. As the following section explains, in some cases, identification of new subsystems may involve physical grouping of services based on criteria such as data affinity, cost, performance etc., although subsystem identification is usually done top-down during Functional Area Analysis activity. The allocation of the components to the architectural tiers, in order to satisfy architectural constraints imposed by non-functional requirements, is explained in Service Realization.

Example

The output from the functional area analysis for an example rental agency was the following table:

Domain Functional Area Subsystem Description
Marketing and Customer Management Customer Service Customer Service Provides all automated functions for the functional area.
Products Promotions Management Promotions Management Provides all automated functions for the functional area.
Rental Fleet Logistics Fleet Management Fleet Management Provides all automated functions for the functional area.
Rentals Management Rental Rental Provides all automated functions for the functional area.
Rentals Management Reservations Reservations Provides all automated functions for the functional area.
Rentals Management Pricing Pricing Provides all automated functions for the functional area.

The resulting UML model of the subsystems identified above would be the following, note that the subsystem dependencies are already provided in the model shown below.

For each subsystem either the details described by the Artifact: Design Subsystem should be documented, or may be captured in the document-format service model (see Template: Service Model in Word), in a form similar to the following.

Name Reservation
Description The Reservation subsystem is used to create and manage car rental reservations.
Interfaces
  • Reserve Vehicle
  • Modify Reservation
  • Get Options Information
  • Confirm Rental Agreement
  • Locate Reservation
  • Cancel Reservation
Functions
  • Reserve Vehicle
  • Modify Reservation
  • Get Options Information
  • Confirm Rental Agreement
  • Locate Reservation
  • Cancel Reservation
Dependencies None
Non-Functional Requirements None



Identify and Apply Service Component Patterns

In the Guideline: Service Component Patterns we introduce not only the different kinds of components that are commonly used to implement the subsystems identified during this task, but also a set of patterns that allow for scalable and flexible implementations of these subsystems. The patterns, and of course additional patterns exist - this is not a complete set - and may be specified as part of the architecture of a project.

Selection of, or customization of, a particular pattern will depend upon:

  • The Functional and Non-Functional Requirements of the solution and specific Subsystem.
  • The Capabilities and Qualities of Service provided by any middleware upon which the components will be deployed.
  • The cost/complexity and benefit trade-off between different patterns.
Identify Service Component

Subsystems, in and of themselves, are not IT assets and not deployable into the IT infrastructure; they provide a bridge between the business and IT perspectives. Each subsystem is realized by one or more Service Components where a Service Component is an enterprise-scale asset (a managed software element with guaranteed availability, load balancing, security, performance, and versioning). The Service Component is in turn realized by multiple Functional and Technical Components according to the diagram below.

Generally each service assigned to a Subsystem will result in a Service Component; Functional and Technical Components may be shared between Service Components within the same subsystem.

Identify Functional Components

Functional components provide additional business function to a service component; in many respects, the capability provided by a service component is dependent entirely on its functional components and any additional business logic it implements on top of these.

Functional components are often to be found among Type Managers - components that manage a particular domain element, for example "Vehicle", "Customer", "Schedule", and so forth. It should be made clear that these domain elements are more frequently large-grained graphs of data rather than simple structures.

Example

Considering the Rent-a-Car example, the Reservation service component need to be able to pull together details about the customer, the location they wish to hire from and the vehicles available for the class they specify. Also we need to be able to determine the customer's rating such that we can provide the correct level of service in the event of issues such as unavailable vehicles. The following diagram demonstrates the component model for Reservation.



Identify Technical Components

Technical, or Infrastructure, components serve to make available horizontal platform capabilities; that is the capabilities they provide are not specific to the business domain but cut across business domains. These technical services are frequently provided by middleware products including operating systems and are used either directly by the service component or by the functional components on which they rely.

Example

In completing the Rent-a-Car component model (see functional component step above) we include two technical components into the model, one for the Reservation to log the completion of a reservation request and one to denote that the Vehicle and Location components rely on EJB Services to persist their business data.

Alternatively you can use a tabular format in expressing the required components and their relationship to the services previously identified, as shown in the figure below.



Распределить поведение подсистемы на элементы.
Цель: Описать внутреннее поведение подсистемы.
Выявить дополнительные классы проекта и подсистемы проекта, необходимые для удовлетворения требований к поведению подсистем.  

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

Взаимодействие элементов модели в рамках подсистемы должно быть описано с помощью циклограмм, показывающих, как реализовано поведение подсистемы. Каждая операция интерфейса, предоставляемого подсистемой, должна быть снабжена хотя бы одной циклограммой. Циклограммы являются составными элементами подсистем и применяются для описания их внутреннего поведения.

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

В системах реального времени для инкапсуляции таких нитей будет применяться Рабочий продукт: капсула.

Пример:

Взаимодействие подсистем, обеспечивающих определенное поведение системы, можно выразить с помощью следующих циклограмм:

Диаграмма, описанная в тексте.

На этой диаграмме показано, как интерфейсы подсистем применяются для выполнения последовательности операций. В частности, для подсистемы Network Handling указаны конкретные интерфейсы (в данном случае - ICoordinator) и операции, которые она должна поддерживать. Кроме того, на диаграмме видно, что подсистема NetworkHandling зависит от интерфейсов IBHandler и IAHandler.

Взглянув внутрь подсистемы, можно увидеть, как реализован интерфейс ICoordinator:

Диаграмма, описанная в тексте.

Класс Coordinator выступает в роли посредника для интерфейса ICoordinator и отвечает за обработку операций интерфейса и координацию его поведения.

На "внутренней" циклограмме показана полная структура классов интерфейса, что должно произойти для выполнения функций подсистемы, и какие классы отправляют сообщения вовне подсистемы. Такие диаграммы, иллюстрирующие внутреннюю структуру подсистем, крайне важны для подсистем со сложной структурой. Они упрощают изучение поведения подсистем и повторное использование подсистем в различных контекстах.

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

При создании новых элементов проекта необходимо пересматривать содержание и границы подсистем. Постарайтесь избежать создания одинаковых классов в разных подсистемах. Наличие таких классов - косвенный признак неоптимального формулирования границ подсистемы. Регулярно возвращайтесь к задаче Задача: Определение элементов проекта для коррекции баланса ответственности подсистем.

Иногда полезно создать две отдельные внутренние модели подсистемы, иллюстрирующие подсистему с точки зрения клиентов и с точки зрения реализаторов. В спецификацию можно включить "идеальные" классы и взаимодействия, для того чтобы описать поведение подсистемы в терминах идеальных классов и взаимодействий. С другой стороны, спецификация системы для реализаторов отражает видение реализации системы и может постепенно эволюционировать в реализацию.   Дополнительные сведения о спецификации и реализации подсистемы проекта приведены в разделе Рекомендация по рабочему продукту: Подсистемы проекта, реализация и спецификация подсистем.

Создайте описание элементов подсистемы
Цель: Описать внутреннюю структуру подсистемы.  

Для того чтобы описать внутреннюю структуру подсистемы, создайте одну или несколько диаграмм классов с описанием элементов подсистем и их взаимосвязей. Одной диаграммы классов должно быть достаточно, хотя для упрощения картины можно создать несколько диаграмм.

Ниже приведен пример диаграммы класса:

Диаграмма, описанная в тексте.

Пример диаграммы класса для системы регистрации заказов.

Внутреннее содержимое подсистемы, смоделированное в виде компонента, можно представить в виде прямоугольника, обозначающего компонент на диаграмме компонентов. Таким образом можно показать точки взаимодействия этой подсистемы с внешними объектами через интерфейсы.

Ниже приведен пример диаграммы компонентов, на которой показаны подсистема Order, ее внутренние компоненты, предоставляемые и необходимые интерфейсы.

Диаграмма, описанная в тексте.

Пример диаграммы компонентов подсистемы Order

Поскольку компонент представляет собой структурированный класс, его можно полностью инкапсулировать, разрешив поступление внешних данных только через порты интерфейсов. Такой подход позволяет повысить точность спецификаций и протоколов обмена данными компонента. В результате мы получаем связать составные части соединителями и структурировать реализацию компонента (дополнительные сведения приведены в разделе Концепция: Структурированный класс).

На следующей иллюстрации показан пример составной диаграммы структуры подсистемы Order с интерфейсами и портами.

Диаграмма, описанная в тексте.

Пример составной диаграммы структуры подсистемы Order.



Помимо этого, может понадобиться создать циклограмму для описания всех возможных состояний, в которых может находиться подсистема (см. раздел Технология: Циклограмма).

Описание классов подсистемы создается при выполнении задачи Задача: Проектирование классов.

Опишите зависимости подсистемы
Цель: Описать интерфейсы, от которых зависит подсистема.  

Зависимостью между подсистемами называется ситуация, когда элементы одной подсистемы пользуются поведением элементов другой подсистемы. Для упрощения повторного использования подсистем и сокращения зависимостей при обслуживании зависимости следует привязывать к конкретным интерфейсам подсистем, а не к подсистемам в целом и не к их внутренним элементам.

Причин тому две:

  • Элементы модели (включая подсистемы) должны быть взаимозаменяемы при условии, что их поведение одинаково. Поведение описывается в терминах интерфейсов, поэтому любые обстоятельства, от которых зависит поведение элемента, также должны быть описаны в терминах интерфейсов.
  • У разработчика должна быть полная свобода в отношении внутреннего поведения подсистем, постольку поскольку обеспечивается правильное внешнее поведение. Если элемент модели одной подсистемы ссылается на элемент модели другой подсистемы, разработчик уже не может просто удалить этот элемент модели или распределить его поведение на другие элементы. В результате система становится более "хрупкой".

Необходимо обеспечить отсутствие прямых зависимостей и связей между элементами модели, находящимися в подсистеме, и элементами модели, находящимися в других подсистемах. Кроме того, нужно убедиться в отсутствии циклических зависимостей между подсистемами и интерфейсами: система не может одновременно и предоставлять интерфейс, и зависеть от него.

Зависимости между подсистемами, равно как зависимости между подсистемами и пакетами, можно описать напрямую, как показано ниже. В данном случае одна подсистема (например, Invoice Management) напрямую зависит от другой (например, Payment Scheduling Management).


Диаграмма, описанная в тексте.

Пример структуры подсистем с непосредственными зависимостями.

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


Диаграмма, описанная в тексте.

Пример структуры подсистем с зависимостями через интерфейсы

 

Свойства
Несколько вхождений
Управляется событиями
Выполняющийся
Необязательный
Запланированный
Повторяющийся
Дополнительные сведения