Escolar Documentos
Profissional Documentos
Cultura Documentos
Capítulo 3
3.1 Esteriótipos
Um estereótipo é um dos mecanismos de uso geral da UML, que é utilizado para estender o
significado de determinado elemento em um diagrama. Podemos ter estereótipos de dois tipos:
predefinidos ou definidos pela equipe de desenvolvimento.
Um estereótipo definido pelo usuário deve ser utilizado de forma consistente na modelagem de
todo o sistema. Ou seja, não é correto utilizar um mesmo estereótipo para denotar diferentes
significados. O esteriotipo pode ser classificado com gráfico ou textual.
Um estereótipo de rótulo é representado por um nome delimitado pelos símbolos << e >> (esses
símbolos são chamados de aspas francesas), e posicionado próximo ao símbolo.
Por exemplo, uma etiqueta pode ser utilizada para informar o autor e a data de criação
de um determinado diagrama ou elemento de um diagrama. A Figura 3-3 ilustra essa
situação.
3.4 Restrições
As restrições permitem estender ou alterar a semântica natural de um elemento gráfico.
Esse mecanismo geral especifica restrições sobre um ou mais valores de um ou mais
elementos de um modelo. Restrições podem ser especificadas tanto formal quanto
informalmente. restrições também podem ser definidas informalmente pelo texto livre
(linguagem natural). Assim como para as etiquetas, uma restrição, seja ela formal ou
informal, também deve ser delimitada por chaves. Essas restrições devem aparecer
dentro de notas explicativas.
3.5 Pacotes
Um pacote é um mecanismo de agrupamento definido pela UML. Esse mecanismo pode
ser utilizado para agrupar elementos semanticamente relacionados. A notação para um
pacote é a de uma pasta com uma aba. Um pacote constitui um mecanismo de
agrupamento genérico. Sendo assim, ele pode ser utilizado para agrupar quaisquer
outros elementos, inclusive outros pacotes.
3.6 OCL
A OCL (Linguagem de Restrição de Objetos) pode ser utilizada para definir expressões de
navegação entre objetos, expressões lógicas, precondições, pós-condições etc. A maioria
das declarações em OCL consiste nos seguintes elementos estruturais: contexto, propriedade e
operação. Um contexto define o domínio no qual a declaração em OCL se aplica, como uma
classe ou uma instância de uma classe. A propriedade corresponde a algum componente do
contexto. Pode ser, por exemplo, o nome de um atributo em uma classe, ou uma associação
entre dois objetos. A operação define o que deve ser aplicado sobre a propriedade. Uma
operação pode envolver operadores aritméticos, operadores de conjunto e operadores de tipo.
Outros operadores que podem ser utilizados em uma expressão OCL são: and, or, implies, if,
then, else, not, in.
Capítulo 4
4.1.1.1 Formato
Os formatos comumente utilizados são o contínuo, o numerado e o tabular. O formato
contínuo a narrativa acontece por texto livre.
O formato tabular tenta prover alguma estrutura à descrição de casos de uso, onde a
sequência de interações entre o ator e o sistema é fragmentada em duas colunas de uma
tabela. Uma das colunas apresenta as ações do ator, e a outra apresenta as reações do
sistema.
A descrição de um caso de uso deve ser a mais clara possível, o que se contrapõe
diretamente à ideia de descrições de casos de uso semelhantes a códigos-fonte em
linguagens de programação.
4.1.1.3 Grau de abstração
O grau de abstração de um caso de uso diz respeito à existência ou não de menção a
aspectos relativos à tecnologia durante a descrição desse caso de uso. Em relação ao
grau de abstração, um caso de uso pode ser real ou essencial. Um caso de uso essencial
é abstrato no sentido de não fazer menção a aspectos relativos à tecnologia utilizada nas
interações entre ator e casos de uso. Em um caso de uso cujo grau de abstração é real,
a descrição das interações cita detalhes da tecnologia a ser utilizada na interação entre
o ator e o sistema. Com efeito, a descrição em um grau de abstração real se compromete
com a solução de projeto (tecnologia) a ser utilizada para implementar o caso de uso. Os
casos de uso apresentados como exemplos na Seção 4.1.1.1 são todos reais.
4.1.1.4 Cenários
Um cenário é a descrição de uma das maneiras pelas quais um caso de uso pode ser
utilizado. Outra maneira de ver um cenário é como a descrição de um episódio de
utilização de alguma funcionalidade do sistema. Uma analogia válida para entender a
relação entre caso de uso e cenário é a de um labirinto. Em um labirinto, temos
geralmente diversas maneiras para chegar a uma determinada saída a partir de uma
determinada entrada.
4.1.2 Atores
Na terminologia da UML, qualquer elemento externo (não fazem parte do sistema.) ao
sistema que interage com ele (troca informações com o sistema) é, por definição,
denominado ator.
Atores de um sistema podem ser agrupados em diversas categorias, como:
Uma mesma pessoa pode agir (desempenhar um papel) como um ator em um momento
e como outro ator em outro momento. Por exemplo, em um sistema de vendas de livros
via Internet, um indivíduo pode desempenhar o papel de Cliente que compra
mercadorias, assim como pode também assumir o papel de Agendador, o funcionário da
loja que agenda a entrega de encomendas.
Exemplos de bons nomes para atores: Cliente, Estudante, Fornecedor etc.
Exemplos de maus nomes para atores: João, Fornecedora, ACME etc.
Um caso de uso pode envolver a participação de vários atores, o que resulta na
classificação dos atores em primários ou secundários. Um ator primário é aquele que
inicia uma sequência de interações de um caso de uso. São eles os agentes externos para
os quais o caso de uso traz benefício direto. As funcionalidades principais do sistema são
definidas tendo em mente os objetivos dos atores primários. Já um ator secundário
supervisiona, opera, mantém ou auxilia na utilização do sistema pelos atores primários,
existindo apenas para que os atores primários possam utilizar o sistema. Por exemplo,
considere um programa para navegar na Internet. Para que o Usuário (ator primário)
requisite uma página ao programa, outro ator (secundário) está envolvido: o Servidor
Web. Note que o ator primário Usuário é de certa forma auxiliado pelo secundário,
Servidor Web, uma vez que é através deste último que o primeiro consegue alcançar seu
objetivo (visualizar uma página da Internet).
4.1.3 Relacionamentos
Relacionamento tem como função relacionar os atores e casos de uso. Sendo assim, um
ator deve estar relacionado a um ou mais casos de uso do sistema. Além disso, pode
haver relacionamentos entre os casos de uso ou entre os atores de um sistema. A UML
define os seguintes relacionamentos para o modelo de casos de uso: comunicação,
inclusão, extensão e generalização.
Como um exemplo de generalização entre atores, analise uma biblioteca na qual pode haver dois
tipos de usuários: alunos e professores. Os dois tipos de usuário podem realizar empréstimos de
títulos de livros e reservas de exemplares. Suponha que, com relação àqueles processos do
negócio (empréstimos e reservas), não haja diferença entre um professor e um aluno. Suponha,
ainda, que somente o professor pode requisitar a compra de títulos de livros à biblioteca. Nessa
situação, poder-se-ia definir um ator chamado Usuário e outro ator chamado Professor, que
herdaria de Usuário. Assim, o ator Professor herda todos os casos de uso do ator Usuário, ou
seja, um professor pode interagir com todos os casos de uso com os quais um usuário comum
interage. Além disso, um professor também interage com o caso de uso de requisição de compra
de novos títulos de livros, sendo que este caso de uso é específico para professores.
• Caso de uso “oposto”: chama-se caso de uso oposto àquela cuja realização
desfaz o resultado da realização de outro caso de uso. Por exemplo, pode ser que
um cliente tenha a possibilidade de cancelar um pedido de compra realizado
anteriormente. Nesse caso, não é preciso pensar muito para identificar um novo
caso de uso, Cancelar Pedido. Deve-se perguntar de forma geral, para cada caso
de uso: “As ações realizadas pelo sistema quando da realização deste caso de uso
podem ser desfeitas “.
• Caso de uso que precede outro caso de uso: algumas vezes, certas condições
devem ser verdadeiras quando da execução de um caso de uso. Por exemplo,
para que um cliente realize um pedido de compra, é necessário que ele esteja
cadastrado no sistema da livraria virtual. Isso leva a um novo caso de uso para
que o cliente se cadastre. Além disso, para realizar um pedido de compra, o
cliente deve ter a possibilidade de obter detalhes de determinados produtos por
meio de um mecanismo de busca. De forma geral, a pergunta a ser feita para
identificar casos de uso precedentes é, para cada caso de uso, “o que pode
ocorrer antes da realização deste caso de uso?”.
• Caso de uso que sucede a outro caso de uso: uma outra estratégia de
identificação é pensar nas consequências da realização de um caso de uso. Por
exemplo, considerando o mesmo exemplo da livraria virtual, quando um cliente
realiza uma compra, pode ser que haja a necessidade de agendar sua entrega.
Nessa situação, um possível caso de uso decorrente seria Agendar Entrega de
Pedido, no qual um funcionário da livraria seleciona alguns pedidos para serem
entregues em certa data. A pergunta geral que se deve fazer para cada caso de
uso identificado é “o que pode ocorrer após a realização deste caso de uso?”.
• Caso de uso temporal: pode haver funcionalidades realizadas pelo sistema que
não são iniciadas por um ator. Isso normalmente acontece quando o sistema
deve realizar alguma tarefa de tempos em tempos, sem intervenção externa.3
Por exemplo: “O sistema deve gerar um relatório de vendas toda sexta-feira”. A
pergunta geral nessa situação é: “Há alguma tarefa que o sistema deva realizar
automaticamente?”. Em um caso de uso temporal, normalmente o ator é
definido como o agente que recebe a informação resultante (p. ex., um
funcionário recebe o relatório de execução do sistema). Alternativamente, pode-
se definir um ator fictício, no caso, Tempo, que estará associado ao referido caso
de uso (ver Figura 4-8).
• Caso de uso relacionado a alguma condição interna: assim como nos casos de
uso temporais, esta é uma situação em que não há um ator diretamente
envolvido. Nessa situação, o sistema deve realizar alguma funcionalidade de
acordo com a ocorrência de algum evento interno. Seguem dois exemplos disso:
“O sistema deve notificar o usuário deque há novas mensagens de correio”;
“O sistema deve avisar o almoxarife de que um determinado produto chegou
no nível de estoque mínimo”.
Capítulo 5
(esse capítulo fala sobre o diagrama de classes, ver uns vídeos sobre e fazer exercícios
que tenham correção pra poder comparar já deve dar uma boa noção pra prova)
Temos três estágios sucessivos de abstração pelos quais o modelo de classes passa:
análise, especificação e implementação:
1. O modelo de classes de análise representa as classes de análise, ou seja, aquelas
que se torna evidentes na medida em que focamos a atenção sobre “o que” o
sistema deve fazer. Este modelo é construído na fase de análise e não leva em
consideração restrições inerentes à tecnologia a ser utilizada.
2. O modelo de classes de especificação é um detalhamento do modelo de classes
de análise, focando sobre “como” o sistema deve funcionar, envolvendo também
a adição de detalhes às classes identificadas na análise.
3. O modelo de classes de implementação é um detalhamento do modelo de
especificação, correspondendo à implementação das classes em uma linguagem de
programação, normalmente orientada a objetos (C++, Java, C#...), considerando o
próprio código-fonte do sistema como um modelo.
5.2.2.1 Multiplicidades
As associações permitem a representação da informação dos limites inferior e superior
da quantidade de objetos aos quais outro objeto pode estar associado. Esses limites são
chamados de multiplicidades na terminologia da UML. Cada associação em um
diagrama de classes possui duas multiplicidades, uma em cada extremo da linha que a
representa. Os símbolos possíveis para representar uma multiplicidade estão descritos
na tabela abaixo:
Obs.: o símbolo “1” é equivalente à “1...1”. Outra equivalência ocorre entre os símbolos
“*” e “0..*”.
Na seguinte figura, temos duas classes, Pedido e Cliente, e uma associação entre as
mesmas:
A multiplicidade dessa associação nos informa que pode haver um objeto da classe
Cliente que esteja associado a vários (*) objetos da classe Pedido. Além disso, pode haver
um objeto da classe Cliente que não esteja associado a nenhum pedido (0). Já um objeto
da classe Pedido está associado a um, e somente um, objeto da classe Cliente.
• X tem um ou mais Y?
• Y é parte de X?
Na Figura 5-23, a expressão em OCL define que, para um objeto Voo, a quantidade de
horas de treinamento do piloto deve ser maior ou igual à quantidade mínima de horas
exigida para o avião a ser pilotado.
No exemplo da Figura 5-24, tem-se uma restrição em OCL definida sobre o elemento de
associação entre as classes do diagrama. Essa restrição indica que um indivíduo deve ter
mais de 21 anos para participar de certa sociedade.
Fronteiras
Fronteiras realizam a comunicação do sistema com atores, notificando aos outros
objetos os eventos gerados pelo ambiente do sistema e notificando aos atores o
resultado de interações entre os demais objetos. Em resumo, fronteiras são
especializadas em realizar a comunicação com o ambiente do SSOO. Nomes de classes
de fronteira não devem conter verbos nem sugerir ações. Em vez disso, esse nome
precisa servir para lembrar qual é o canal de comunicação com o mundo externo que a
classe representa. Exemplos: FormulárioInscrição, LeitoraCartões, SistemaFaturamento
etc. Fronteiras se comunicam com atores e com controladores.
Controladores
Controladores servem como uma ponte de comunicação entre fronteiras e entidades.
São responsáveis por coordenar a execução de alguma funcionalidade do sistema.
Normalmente (embora não necessariamente), essa parte do sistema corresponde a um
caso de uso. Nomes normalmente utilizados para uma classe de controle devem lembrar
qual caso de uso ela é responsável por coordenar. Exemplos:
RealizarInscriçãoControlador e ReservasCarrosControlador.
Algumas responsabilidades típicas de controladores são:
1. realizar monitorações a fim de responder a eventos externos ao sistema
2. coordenar a realização de um caso de uso por meio do envio de mensagens a
fronteiras e a entidades
3. criar associações entre entidades (embora isso possa ser feito pelas próprias
entidades
4. manter valores acumulados ou derivados durante a realização de um caso de uso
5. manter o estado da realização do caso de uso
Entidades
Uma entidade representa um conceito encontrado no domínio do problema. Nessas
classes são alocadas as responsabilidades mais importantes do sistema: as que dizem
respeito à lógica do negócio. É comum existirem várias instâncias de uma mesma classe
de entidade coexistindo no sistema. Por exemplo, em um sistema de venda de produtos,
é possível haver milhares de objetos (instâncias) da classe Produto.
Algumas responsabilidades típicas de entidades são as seguintes:
1. informar valores de seus atributos a objetos requisitantes
2. realizar cálculos ou impor restrições relativas às regras do negócio
3. criar e destruir objetos-parte (considerando que o objeto em questão seja um
objeto-todo de uma agregação ou composição)
A categorização implica que cada objeto é especialista em realizar um dos três tipos de
tarefa: comunicar-se com atores (fronteira), manter as informações (entidade) ou
coordenar a realização de um caso de uso (controle).
Classes de entidade, assim como seus atributos, são relativamente fáceis de identificar,
porque tipicamente correspondem a conceitos pertencentes ao domínio do problema.
Essas classes são identificadas na análise do domínio. Já as classes de entidade e de
controle são normalmente encontradas na análise da aplicação.