Artefatos > Conjunto de Artefatos de Análise e Design > Modelo de Design... > Subsistema de Design > Diretrizes

subsystem.gif (1376 bytes)
Subsistema de Design

Um elemento de modelo que tem a semântica de um pacote (pode conter outros elementos de modelo) e a uma classe (apresenta um comportamento). O comportamento do subsistema é definido por classes ou outros subsistemas contidos nele. Um subsistema realiza uma ou mais interfaces, que definem o comportamento apresentado por ele.
Tópicos

Uso do Subsistema Início da página

Os subsistemas podem ser usados de diversas maneiras complementares para dividir o sistema em unidades que

  • possam ser ordenadas, configuradas ou liberadas independentemente
  • possam ser desenvolvidas independentemente, contanto que as interfaces permaneçam inalteradas
  • possam ser implantadas independentemente em um conjunto de nós computacionais distribuídos
  • possam ser alteradas independentemente sem danificar outras partes dos sistemas

Além disso, os subsistemas podem

  • dividir o sistema em unidades que possam fornecer segurança restrita para os principais recursos
  • representar produtos existentes ou sistemas externos no design

Identificação de Subsistemas a partir de Colaborações de Classes Início da página

Se as classes de uma colaboração interagirem apenas entre si para produzir um conjunto bem definido de resultados, a colaboração e suas classes deverão ser encapsuladas em um subsistema.

Essa regra também se aplica a subconjuntos de colaborações. Em qualquer lugar, toda a colaboração ou parte dela poderá ser encapsulada e simplificada. Isso facilitará a compreensão do design.

Dicas

Dica

Detalhes

Procure possibilidade de opção Se uma determinada colaboração (ou subcolaboração) representar um comportamento opcional, inclua-a em um subsistema. As funcionalidades que possam ser removidas, atualizadas ou substituídas por outras deverão ser consideradas independentes.
Observe a interface do usuário do sistema Se a interface do usuário for relativamente independente das classes de entidade do sistema (ou seja, a interface e as classes podem e serão alteradas independentemente), crie subsistemas que sejam integrados horizontalmente: agrupe as classes de fronteira de interface do usuário relacionadas em um subsistema e agrupe classes de entidade relacionadas em outro subsistema.
Se a interface do usuário e as classes de entidade exibidas por ela estiverem intrinsecamente acopladas (ou seja, se uma mudança na interface acarretar uma mudança nas classes e vice-versa), crie subsistemas que sejam integrados verticalmente: inclua as classes de entidade e as classes de fronteira relacionadas em um subsistema comum.
Observe os Atores Separe a funcionalidade usada por dois atores diferentes, já que cada ator pode alterar independentemente seus requisitos no sistema.
Procure o acoplamento e a coesão entre as classes As classes com um elevado grau de acoplamento ou coesão colaboram para fornecer um conjunto de serviços. Organize as classes fortemente acopladas em subsistemas, separando-as em linhas de menor grau de acoplamento. Em alguns casos, o menor grau de acoplamento pode ser eliminado inteiramente dividindo-se as classes em classes menores com responsabilidades mais coesas.
Examine a substituição Se houver vários níveis de serviço especificados para um recurso específico (por exemplo: disponibilidade alta, média e baixa), represente cada nível de serviço como um subsistema separado, cada qual realizando o mesmo conjunto de interfaces. Com isso, os subsistemas serão substituídos uns pelos outros.
Examine a distribuição Embora possa haver diversas instâncias de um subsistema específico, cada uma executada em diferentes nós, em muitas arquiteturas não é possível que uma única instância de um componente seja dividida por diferentes nós. Nos casos em que o comportamento do subsistema deva ser dividido por diferentes nós, é recomendável decompor o subsistema em subsistemas menores (cada qual representando um único componente) com uma funcionalidade mais restrita.  Determine a funcionalidade que deve pertencer a cada nó e crie um novo subsistema para "possuir" essa funcionalidade, distribuindo as responsabilidades e os elementos relacionados do subsistema original de modo apropriado.  Os novos subsistemas estarão contidos no subsistema original.

Depois que as classes tiverem sido organizadas em subsistemas, atualize as realizações de casos de uso de acordo com essa organização.

Documentação de Subsistemas Início da página

Depois que o subsistema tiver sido criado:

  • Deverão ser atribuídos um nome e uma breve descrição a cada subsistema.
  • Quando as ferramentas suportarem pacotes mas não subsistemas, os pacotes poderão ser usados para documentar os subsistemas; o estereótipo de pacote "subsistema" deverá ser usado para indicar um subsistema nesse contexto.
  • As responsabilidades da classe de análise original deverão ser transferidas para o subsistema recém-criado, utilizando-se a descrição do subsistema para documentar as responsabilidades.

Subsistemas e Componentes Início da página

Os componentes são itens de implementação; um subsistema pode ser usado como um proxy do componente para representá-lo no design.

  • Cada parte do sistema deve ser o mais independente possível das outras partes.
  • O ideal é que qualquer parte do sistema possa ser substituída por uma nova parte, contanto que a nova parte suporte as mesmas interfaces.
  • Deve ser possível desenvolver diferentes partes do sistema independentemente das outras partes.

Para esses fins, os Subsistemas de Design representam, de forma ideal, os componentes no Modelo de Design: eles são elementos de design que encapsulam o comportamento de diversas classes (assim como os componentes encapsulam o comportamento de diversas instâncias de classe) e seu comportamento só é acessado através das interfaces que realizam (como é o caso dos componentes).

Subsistemas que Representam Produtos Existentes Início da página

Quando um produto existente for um produto que exporte interfaces, ou seja, operações (e talvez recepções), mas, em contrapartida, mantenha todos os detalhes de implementação ocultos, ele poderá ser modelado como um subsistema na visão lógica.  Entre os exemplos de produtos usados pelo sistema que podem ser representados por um subsistema estão incluídos:

  • Software de comunicação (middleware).
  • Suporte de acesso a banco de dados (suporte de mapeamento RDBMS).
  • Produtos para aplicações específicas.

Alguns produtos existentes, como conjuntos de tipos e estruturas de dados (por exemplo, pilhas, listas, filas), podem ser melhor representados como pacotes, já que revelam mais do que simplesmente um comportamento. Além disso, é o conteúdo específico do pacote que é importante e útil, e não o pacote propriamente dito, que é simplesmente um contêiner. 

Utilitários comuns (como, por exemplo, bibliotecas de matemática) poderão ser representados como subsistemas, caso simplesmente exportem interfaces, mas se isso será necessário ou fará sentido dependerá do julgamento do designer sobre a natureza do que é modelado.  Os subsistemas são construções orientadas a objetos que são classificadores assim como pacotes: um subsistema pode ter instâncias (caso seja indicado pelo designer). A UML é outra forma de modelar grupos de procedimentos e variáveis globais no utilitário, que é um estereótipo de classe sem instâncias. 

Ao definir o subsistema para representar o produto, defina também uma ou mais interfaces para representar as interfaces do produto.

Restrições de Dependência de Subsistema Início da página

Os subsistemas diferem dos pacotes em seu aspecto semântico: um subsistema é um tipo de pacote que apresenta comportamento em uma ou mais interfaces que realiza. Os pacotes não apresentam nenhum comportamento; são simplesmente contêiners de elementos que apresentam comportamento.

A razão para se usar um subsistema em vez de um pacote é que o subsistema encapsula completamente seu conteúdo, apresentando comportamento somente através de suas interfaces. A vantagem disso é que, ao contrário do que ocorre no pacote, o conteúdo e os comportamentos internos de um subsistema podem ser alterados com total liberdade, contanto que as interfaces do subsistema não sofram mudanças. Os subsistemas também fornecem um elemento de "design substituível": dois subsistemas quaisquer (ou classes, no que diz respeito a isso) que realizem as mesmas interfaces são intercambiáveis.

Para assegurar que os subsistemas sejam elementos substituíveis no modelo, algumas regras precisam ser aplicadas:

  • Um Subsistema não deverá expor nenhuma parte de seu conteúdo (ou seja, nenhum elemento contido em um subsistema deve ter visibilidade "pública"); nenhum elemento fora do subsistema deverá depender da existência de um elemento específico contido no subsistema.
  • Um Subsistema só deverá depender das interfaces de outros elementos de modelo, para que não seja diretamente dependente de nenhum elemento de modelo específico fora do subsistema. São exceções os casos em que vários subsistemas compartilham um conjunto de definições de classes em comum. Nesses casos, esses subsistemas "importam" o conteúdo dos pacotes que contêm as classes comuns. Isso só deverá ser feito com pacotes em camada inferiores da arquitetura e somente para assegurar que as definições de classes comuns que devem ser passadas entre os subsistemas sejam definidas de maneira consistente.

Veja a seguir um exemplo das dependências de Subsistema e de Pacote:

Dependências de Subsistema e de Pacote no Modelo de Design

Copyright  © 1987 - 2001 Rational Software Corporation


Exibir o Rational Unified Process usando quadros

Rational Unified Process