Anotações do curso de Linguagem de Modelagem Unificada (UML) — Parte 1
Published: 2020-11-09 18:22:09

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/nvppmd895j9kc4axdquc.png)

Essa semana, estou compartilhando minhas anotações pessoais de um curso de UML que fiz há alguns meses atrás. Como ficou bem grande, dividi em dois artigos. Espero que gostem!

__Fase de Desenvolvimento de um Sistema de UML__

__Análise de requisitos__ = é o primeiro levantamento das intenções e necessidades de dos usuários de um sistema. A partir dessa análise, serão elaboradas todas as demais necessidades do projeto, bem como os diagramas e os gráficos que permitirão uma análise detalhada do que cada processo ou ação vai executar.
__Análise do sistema__ = é o passo seguinte, onde se inicia as classes, os objetos e os mecanismos que irão solucionar um método ou uma ação. Os diagramas de use cases são ideais para este detalhamento.
__Design__ = nesta fase o projeto toma forma, onde são criadas as interligações com os vários sistemas.
__Programação__ = nesta fase o projeto é convertido para alguma linguagem de programação orientada a objetos, é a fase de codificação das etapas anteriores.
__Testes__ = é onde ocorre a validação do sistema, sendo comum que sejam executados três processos de teste: teste unitário, teste de integração e teste de homologação (aprovação).

__Análise de Requisitos__

Os principais elementos e entidades da análise de requisitos são os: __atores__ (elementos que alimentam o sistema. Por exemplo: usuários e gerências), __objetos__ (elementos para armazenamento de dados de sistema. Por exemplo: usuários e gerência) e __atributos__ (informações relevantes que serão utilizadas pelo sistema. Por exemplo, situação: disponível/indisponível).

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/ueapr0fsbao4f1pjsdil.png)

Exemplo: vamos criar um diagrama de caso de uso para um bibliotecário (auto avaliar os registros, permitir acesso ao acervo-usuário, disponibilizar status/situação, imprimir relatório-usuários, empréstimo, situação).

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/m4on4vux7azjphmd3gbz.png)

O desenvolvimento UML deve possuir também as __visões, modelos de elementos, mecanismos gerais e diagramas.__

__Visão__
As visões compostas nos diagramas possuem as estruturas dos elementos do sistema. Cada visão representa uma particularidades da especificação completa e mostra os diferentes aspectos do projetos. Elas são criadas com vários diagramas, que contém informações enfáticas sobre os aspectos particulares do projeto.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/g0zp336el7n86j9ssat8.png)

__Modelo de elementos e mecanismos gerais__

__Modelos de Elementos__ são as definições utilizadas nos diagramas, determinadas de acordo com a sua representação, sem gerar dúvidas ou ambiguidade.

__Classes__: é a referência ou a representação de um objeto e corresponde à classificação do objeto segundo os critérios de atributos e métodos.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/somvk6hnex6lioaa5bwx.png)

__Objetos__: é a referência ou a representação de um objeto e corresponde à classificação do objeto segundo os critérios de atributos e métodos. O nome representa a identificação do estado. Os atributos apresentam a variável do estado, suas características. As atividades relacionam as ações e os eventos, como entrar, sair, executar, etc.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/4ffblhsea95jmtdbals8.png)

__Estados__: os estados são os resultados das atividades alcançadas após o processamento de um objeto. Um estado é obtido por meio dos valores dos atributos do objeto e das ligações com outros objetos.

__Diagramas de módulos ou pacotes__: este diagrama descreve as partes de um sistema em agrupamentos lógicos. Além disso, o diagrama exibe as dependências entre esses agrupamentos. As formas de comunicação permitidas entre elas são identificadas por: dependência, refinamento ou generalização.

__Diagrama de Módulos__

O objetivo do diagrama de módulos é organizar os modelos dos elementos.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/6qes6m02pdqwffb8z2b2.png)

__Componentes__: são códigos em linguagem de programação ou códigos em linguagem de máquina (objeto ou executável). É utilizado para modelar o código-fonte e para destacar a função de cada módulo, facilitando a reutilização.

__Diagrama de Componentes__
O diagrama de componentes determina como as classes deverão estar organizadas, por meio dos componentes de trabalho. Desse modo, é possível apontar quais classes cada componente representa.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/ozjd02pu0cy6dyq1e5sy.png)

Os __relacionamentos__ conectam classe ou objetos estabelecidos relações lógicas entre as próprias entidades, são divididos em:

__Associação__: é o relacionamento entre as classes e os objetos dessas classes. A função de associação é detalhar uma quantidade de conexões definidas entre os dois objetos relacionados.

__Generalização__: é um tipo de relacionamento entre o elemento globalizado com outro específico, que abrange somente informações complementares (mais detalhadas além da instância), permitindo sua utilização onde o elemento globalizado seja permitido.

__Especialização__: ocorre quando uma classe criada é herdada da generalização e detalha o processo definido na classe pai. Dessa forma, essa classe especializa a classe pai para um tipo específico.

__Dependência__: a dependência é a relação entre um elemento independente e um elemento dependente. Por conta desse relacionamento, qualquer modificação no elemento independente provoca alteração no elemento dependente.

__Refinamento__: o refinamento é um relacionamento em níveis distintos de concepção. Tal relacionamento envolve duas definições de uma mesma entidade.

Uma associação exibe a conexão de duas classes. Seus tipos mais usados são:

__Associação Normal__: é a forma mais comum de associação. De modo geral, a associação declara um nome de identificação e, normalmente, uma ação. A ação só pode ser declarada por um verbo ou um substantivo, quando um verbo não for recomendado.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/jjlth5mz21wyzq95we1q.png)

__Associação Recursiva__: é um tipo de associação que permite a conexão de uma classe a ela mesma por ligação.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/jasm22dw9utmyq3zjnkp.png)

__Associação Qualificada__: são aplicadas às associações de um para vários (1 … *) ou de vários para vários (*). O identificador da associação qualificada (qualificador) determina como um objeto é identificado no final da associação n.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/ppjsrfwn6fq24g2ef0wj.png)

__Associação Exclusiva__: uma associação é exclusiva quando um modelo apresenta restrições de duas ou mais associações. Desse modo, em um certo momento, a participação de objetos de uma classe deve ocorrer em uma das associações no máximo. É indicada por uma linha tracejada entre as associações, com a referência {ou} na linha tracejada.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/n50ixc4t590c4kttz5vs.png)

__Associação Ordenada__: ocorre quando as relações entre objetos possuem uma ordem específica, também podem indicar uma ordenação oculta em alguns casos. A associação é indicada com a descrição “{ordenada}” próxima à linha de relacionamento de associação entre ambas as classes.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/scmuc9d82l7xzb3b2erf.png)

__Associação Ternária__: ocorre quando uma classe pode ser ligada a outras associações que já possui duas classes a ela relacionadas. Ela ocorre na própria linha da associação, para adicionar informações extras na associação anterior. Nesse sentido, a associação ternária reúne três classes e é representada por meio de um losango.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/lind5ujb7sihejmd0uqk.png)

__Associação Agregação__: é utilizada quando uma das classes associadas é considerada parte de outra classe ou está inserida em outra classe. É identificada quando alguns termos são aplicados, como: é parte de; contém; consiste em. Elas são especificadas em:

__o Agregação Compartilhada__: ocorre quando uma das classes é parte de outra classe ou nela está inserida. Com isso, a classe pode repetir-se diversas vezes em um mesmo instante.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/rpwu7950y7huvw7qw4ob.png)

__o Agregação Composta/Composição__:ocorre quando uma classe está inserida em outra classe. Caso o objeto da classe principal seja eliminado, as classes que integram a classe principal também são eliminadas.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/3415v61ebi5l1z3g4tyv.png)

A __generalização__ é um tipo de relacionamento definido pelo elemento principal classe pai e pelo elemento detalhado classe filho/herança. Essa generalização é dividida em dois tipos diferentes:

__o Generalização Normal__: a classe detalhada é conhecida como subclasse ou classe filha. A subclasse todos os atributos, os métodos e as associações da classe principal. A representação é visualizada por meio de uma linha que associa as duas classes relacionadas, superclasse é indicada pela seta da linha que representa a generalização.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/gkziz8o2gjutl1xsc61g.png)

__o Generalização Restrita__: detalha informações mais objetivas e concretas, abordando o processo e a forma como a generalização será aplicada e ampliada posteriormente. Ela pode ser dividida em generalização de sobreposição, disjuntiva, completa e incompleta.
Ao contrário da generalização, a especialização cria uma classe herdada na generalização. Com isso, o processo definido na classe é refinado. A especialização detalha a classe pai de acordo com as necessidades dos elementos da aplicação.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/3ps1e6p8scmxp9jr086c.png)

__Dependência__: A dependência é uma ligação estrutural entre dois tipos de elementos (um independente e outro dependente). A dependência gera cumplicidade entre os elementos, fazendo com que a classe que adquire um objeto de outra classe como parâmetro acessa o objeto principal dessa classe. Nesse sentido, qualquer alteração no elemento independente afetará também o elemento dependente.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/y6iamvciefjdgs82k0oo.png)

__Refinamento__: é o relacionamento entre duas descrições de um mesmo elemento, porém, em camadas divergentes de abstração. Também pode ser utilizado para modelar implementações diversas de uma mesma função. Ex: relatório com visão geral e visão detalhada.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/o7vh9sc6awkcq7begtsl.png)

__Mecanismo Gerais__

A UML determinados recursos em seus diagramas para lidar com as informações complementares, denominados mecanismos. Há dois tipos de mecanismos gerais:

__Ornamentais__: os ornamentos são acrescentados aos modelos de elementos em diagramas para agregar informações ao elemento. A utilização do ornamento tem o objetivo de apontar determinado aspecto de um elemento, como a multiplicidade de relacionamentos

__Notas__: é utilizada quando a inclusão de informações em um modelo não puder ser indicada de outra maneira. Ela pode ser inserida em qualquer parte do diagrama e armazenar qualquer tipo de informação.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/u7hqh5hyy9r9zprtb4e6.png)

__Diagramas__
Os diagramas são divididos em: Diagramas Estruturais (Classe, Objetos, Componentes, Implantação, Pacotes ou Módulos, Estrutura) e em Diagramas Comportamentais (Caso de Uso, Máquina de Estados, Atividade, Interação).

Os __Diagramas Estruturais__ representam estruturas estáticas ou modelos estáticos de um sistema, e são definidos como modelos para documentação dos aspectos estáticos de um ciclo de desenvolvimento de software.

__Diagramas de Classe__: funciona por meio de simbologia, define todas as classes necessárias no sistema. Com isso, esse diagrama serve de apoio para a elaboração de outros diagramas.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/bs3coijnzylm3zwy9jry.png)

__Diagramas de Objetos__: é uma diversificação do Diagrama de Classe, no entanto, os elementos representados no diagrama são os objetos, justamente os que foram definidos como instâncias de classes.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/0moj9mm7y5004rmzjndv.png)

__Diagramas de Componentes__: este diagrama mostra o sistema pelo lado funcional, e está relacionado à linguagem de programação, exibindo as associações entre os componentes e a distribuição dos módulos durante o processamento. Ex: código-fonte. A representação empregada em um componente UML é indicada por meio de um retângulo, com a identificação do componente escrita na parte inferior ou interior de seu símbolo. No lado esquerdo, são usados uma elipse e dois retângulos de menores dimensões.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/ipr48p7x68ubhxgn107r.png)

__Diagrama de Implantação, Execução e Instalação__: o diagrama de implantação exibe a arquitetura física do hardware e a arquitetura do software do sistema.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/w3j0asn2ulynqmxd295f.png)

__Diagrama de Módulos ou Pacotes__: descreve os pacotes ou as partes do sistema (são os subsistemas ou sub-módulos incorporados e distribuídos em agrupamentos lógicos). A finalidade desse diagrama é simbolizar um grupo de classes.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/j0e4hh91iyub9lju3o0d.png)

__Diagrama de Estrutura Composta__: este diagrama apresenta o detalhamento das páginas internas de uma estrutura. Esse detalhamento é realizado por meio da descrição dos relacionamentos entre os elementos e da colaboração interna das classes, interfaces, ou componentes e suas funcionalidades.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/mekcm84l40y88i0mm41e.png)