UML - Guia Do Usuário
UML - Guia Do Usuário
Turno: Manhã
Capítulo 1:
Capítulo 2:
A UML é uma linguagem expressiva que serve para visualizar, especificar, construir e
documentar um sistema complexo de software. Para entender UML, é preciso aprender três
elementos principais: os blocos de construção básicos da UML, as regras que determinam
como esses blocos poderão ser combinados e alguns mecanismos comuns aplicados na
UML.
Os blocos de construção são os itens, os relacionamentos e os diagramas. Os itens
dividem-se em quatro tipos:
Itens estruturais que são substantivos usados em modelos da UML, como as classes, as
colaborações, os casos de uso, as classes ativas, os componentes, os artefatos e os nós.
Esses são os itens estruturais básicos que poderão ser incluídos em um modelo da UML.
Itens comportamentais são as ações que representam comportamentos no tempo e no
espaço. Existem dois tipos de itens comportamentais: as interações são um conjunto de
mensagens que mostram as ações correspondentes. Uma máquina de estado é um
comportamento que mostra sequência de estados em resposta a eventos.
Itens de agrupamento são as partes organizacionais dos modelos de UML. Servem para
organizar as partes do projeto e só existem em tempo de desenvolvimento.
Itens anotacionais são os comentários explicativos nos modelos de UML. Servem para
esclarecer ou descrever qualquer elemento do modelo utilizando-se notas.
Os relacionamentos dividem-se em quatro tipos: dependência, associação, generalização
e realização. Uma dependência é um relacionamento no qual um item depende do outro,
em que numa alteração do item independente pode afetar o item dependente. São
representadas por linhas tracejadas, geralmente com setas. Uma associação são conexões
entre elementos do modelo. É representado por linhas sólidas, geralmente com nomes de
papéis e multiplicidades. Uma generalização é um relacionamento entre dois objetos em
que um é substituível pelo outro mais generalizado, como os filhos que compartilham a
estrutura e o comportamento dos pais. São representados por uma linha sólida com uma
seta em branco em direção ao pai. Uma realização é um relacionamento semântico entre
classificadores, em que um especifíca um contrato que outro garante executar. É
representado por uma linha tracejada com uma seta em branco.
Os diagramas na UML são desenhos com os itens e os relacionamentos para permitir
visualizar um sistema parcialmente. Comumente são usados certas combinações de
elementos que são coerentes com as cinco visões mais úteis da arquitetura de sistema
complexo de software. São eles: os diagramas de classes, diagrama de objetos, diagrama
de componentes, diagrama de estruturas complexas, diagrama de caso de uso, diagrama
de sequências, diagrama de comunicações, diagrama de gráficos de estados, diagrama de
atividades, diagrama de implantação, diagrama de pacote, diagrama de temporização e
diagrama de visão geral da interação.
As regras da UML para incentivar a construção de modelos bem-formados são em relação
a nome, escopo, visibilidade, integridade e execução.
Os mecanismos básicos da UML servem para torna-la mais simples pela adoção de 4
mecanismos: Especificações, Adornos, Divisões comuns e mecanismos de extensão.
Arquitetura de software é o conjunto de métodos, técnicas e processos para a construção
de um sistema. Arquitetura de software não está relacionada somente com a estrutura e
comportamento, mas também à vários outros fatores relacionados com as características do
software. Essas características podem ser descritas mais adequadamente por cinco visões
interligadas, que são a visão de projeto, visão da implementação, visão de caso de uso,
visão do processo e visão da implantação. Cada visão abrange os aspectos do sistema,
utilizando diagramas para visualizar tais aspectos.
Capítulo 3:
De acordo com Brian Kernighan e Denis Ritchie, os autores da linguagem C, "a única
maneira de se aprender uma nova linguagem de programação é utiliza-la para escrever
programas". O mesmos se aplica à UML, utilizando-a para escrever modelos.
O primeiro programa que muitos desenvolvedores fazem quando estão começando em
uma nova linguagem é um programa simples que escreva "Hello, world!" na tela. Vamos
começar a usar a UML dessa forma, modelar "Hello world!" que, aparentemente é um
programa simples, mas por trás existem alguns mecanismos interessantes que a fazem
funcionar.
Em java, para o applet exibir "Hello world!" em um navegador web é bem simples:
1 import java.awt.graphics;
2 class HelloWorld extends java.applet.Applet {
3 public void paint (graphics g) {
4 g.drawString ("Hello, world!", 10, 10);
5 }
6 }
A primeira linha do código faz com que a classe Graphics fique disponível à próxima
linha e o prefixo java.awt indica em qual pacote está a classe Graphics.
A segunda linha introduz a classe HelloWorld, e as três linhas seguintes declaram uma
operação chamada paint, cuja implementação inicia outra operação, chamada drawString,
responsável pela exibição do "Hello, world!".
Usando UML para modelar essa aplicação, a classe HelloWorld pode ser representada
graficamente como um ícone retangular. A operação paint é mostrado logo abaixo com seus
parâmetros formais omitidos, num quadrado e uma linha pontilhada do paint até uma nota
mostrando o parâmetro g.drawString. Esse diagrama de classes capta o básico da
aplicação "Hello, world!", mas não inclui vários itens. Podemos simplificar e adicionar as
classes Applet e Graphics de uma forma diferente. A classe Applet é empregada como mãe
de HelloWorld e a classe Graphics é usada na assinatura e implementação de uma de suas
operações, paint. Essas classes são representadas como ícones retangulares. A classe
Applet tem uma seta ligando HelloWorld a ela indicando uma generalização. E a classe
Graphics tem uma seta pontilhada ligando o paint a ele, indicando um relacionamento de
dependência.
Esse não é o final, procurando nas bibliotecas de java as classes Applet e Graphics,
descobrimos que elas fazem parte de uma hierarquia maior, possibilitando a construção de
outro diagrama de classes. A representação é assim: as classes estão dentro de cada
retângulo e a classe HelloWorld é filha do Applet, que é filha do Painel, que é filha do
Container, que é filha do Component, e que é filha do objeto. O ImageObserver está
embaixo de um círculo com uma linha sólida ligado ao Component. Esse modelo
corresponde à biblioteca de java - cada classe-filha estende a classe mãe imediata.
ImageObserver é uma interface, por isso é diferente.
Conforme mostram as representações gráficas, HelloWorld colabora diretamente apenas
com duas classes (Applet e Graphics), que estão numa pequena parte da biblioteca maior
de classes predefinidas de Java. Para gerenciar a extensa coleção de pacotes, a linguagem
Java organiza suas interfaces e classes em vários pacotes diferentes.
Esses pacotes podem ser visualizados em um diagrama de classes, são representados
na UML por diretórios com guias. Os pacotes podem ser aninhados, com linhas tracejadas
representando as dependências entre os pacotes.
A parte mais difícil para aprender os mecanismos da linguagem Java, é aprender como
suas partes trabalham em conjunto. Basicamente, um objeto chama outro objeto até chegar
no alvo procurado. Na UML, esses objetos são representados por papéis e essa
modelagem de ordenação de eventos pode ser feita através de um diagrama de sequência.
Capítulo 4:
Capítulo 5:
A maioria das classes não trabalham sozinhas, elas podem ser relacionadas com outras
classes. Para isso, existem 3 tipos principais de relacionamento: dependências,
generalizações e associações. Esses três tipos de relacionamentos abrangem os modos
mais importantes de colaboração entre os itens, eles também mapeiam adequadamente as
formas fornecidas pela maioria das linguagens de programação em relação à conexão de
objetos.
A UML oferece uma representação gráfica para cada um desses tipos de
relacionamentos. Um relacionamento é uma conexão entre itens. É representado
graficamente como um caminho, com tipos diferentes de linha para diferenciar os tipos de
relacionamentos.
Uma generalização é um relacionamento em que um item é a especificação de outro item
mais genérico. As classes genéricas são chamadas de classes-mãe e os tipos específicos,
de classes-filha. As classes-filha herdam, principalmente, os atributos e operações da
classe-mãe. Geralmente as filhas têm atributos e operações além daqueles encontrados
nas respectivas mães. Uma generalização é representada graficamente como linhas sólidas
com uma grande seta triangular apontando a mãe.
Uma associação é um relacionamento estrutural que liga um objeto a outro objeto. A partir
dessa associação, você é capaz de navegar do objeto de uma classe até o objeto da outra
classe e vice-versa. Graficamente, é representada como uma linha sólida conectando as
classes.
Podem ser aplicados quatro tipos de aprimoramentos às associações:
Um nome dizendo o que tal classe faz com outra classe, podendo haver uma seta indicando
a direção.
Um papel, em que descreve o que aquela classe é.
A multiplicidade determina quantos objetos tem ou podem ter em uma extremidade da
associação.
Uma agregação significa que um objeto do todo contém os objetos das partes, é
representada por uma associação simples com um diamante aberto na extremidade do
todo.
Dependências, generalização e associação são itens estáticos, definidos no nível das
classes. Na UML, esses relacionamentos costumam ser visualizados em diagramas de
classes.
Técnicas básicas de modelagem:
Dependências simples: o tipo mais comum de relacionamento de dependência é a
conexão entre uma classe que somente utiliza outra classe como parâmetro para
determinada operação. Para fazer a modelagem desse relacionamento, é preciso criar uma
dependência apontando, a partir da classe que executa a operação, a classe utilizada como
parâmetro nessa operação.
Herança simples: Ao modelar o vocabulário do sistema, sempre encontraremos classes
parecidas estrutural ou comportamentalmente. Para resolver este problema, devemos
extrair as características estruturais e comportamentais comuns e, a partir disso, juntar
essas características numa classe mais geral ou então crie outra classe ao qual esses
elementos podem ser atribuídos, depois, indicar que as classes mais específicas herdarão
da classe mais geral, utilizando-se um relacionamento de generalização, definido a partir de
cada classe especializada para a classe-mãe mais geral.
Relacionamentos estruturais: Enquanto os relacionamentos de dependência e
generalização são unilaterais, as associações são relacionamentos bilaterais, ou seja, os
objetos interagem entre si, navegando em ambas as direções.
Para fazer a modelagem de relacionamentos estruturais:
Para cada par de classes, se os objetos de uma classe precisarem interagir com objetos de
outras classes como parâmetros de uma operação, especifique uma associação entre as
duas classes.
Para cada uma dessas associações, especifique uma multiplicidade (quando não for *, que
é o padrão) e os nomes de papéis (se ajudar na explicação do modelo).
Se uma das classes de uma associação for um todo quando comparada às classes
encontradas na outra extremidade, e essas parecerem partes, marque esse caso como uma
agregação, não esquecendo de colocar um adorno de diamante na extremidade que se
encontra ao todo.