UML – Diagramas de Sequência


 

Olá pessoal, neste mês estamos trazendo mais alguns conceitos de UML, desta vez iremos transmitir alguns conceitos do diagrama de sequência. No artigo anterior, abordamos uma introdução de conceitos sobre a UML e também falamos sobre o diagrama de casos de uso, demonstramos também, com um exemplo corriqueiro, a importância de se ter um software bem documentado. No fim ainda tivemos um exemplo prático utilizando a ferramenta Star UML.

 

Conceito básico

 

O diagrama de sequência é outra ferramenta muito importante da UML. Seu principal objetivo é demonstrar em linhas de tempo quais são as interações entre os objetos de um determinado cenário representado pelo diagrama. Geralmente um diagrama de sequência é criado a partir de um diagrama de casos de uso, com a finalidade de descrever como serão as interações/mensagens entre cada objeto/elemento do diagrama. Este diagrama possui dois eixos: o eixo vertical que indica a sequência das mensagens e o tempo de vida dos objetos e o eixo horizontal, este último indica quais são os objetos que participam do diagrama.

 

Elementos do Diagrama

 

O diagrama de sequência compõe-se basicamente de dois elementos, são eles objetos e mensagens. Em alguns casos pode-se ter um elemento com a representação semelhante ao elemento Ator do diagrama de casos de uso, contudo este elemento é interpretado como um objeto comum neste diagrama.

 

Objetos

 

Os objetos podem representar atores ou mesmo instâncias de classes do sistema, desde que tenham alguma interação no cenário do diagrama. Ou seja, geralmente, um objeto vem predefinido de um diagrama de classes.
A representação gráfica de um objeto é um retângulo, e a sua distribuição no diagrama se dá pela horizontal. Ou seja, cada objeto do diagrama deve estar alinhado horizontalmente no cenário. A ordem dos objetos não interfere no objetivo do diagrama, porém, é aconselhável distribuir os objetos de forma a facilitar a leitura do diagrama. Veja na figura 1 a representação do objeto.

 

Figura 1 – Representação do objeto no diagrama de sequência

 

A nomenclatura do objeto deve seguir a seguinte sintaxe: NomeObjeto: NomeClasse. Por exemplo, um determinado cliente deverá ser representado num diagrama de sequência, a nomenclatura deste objeto poderia assumir uma das seguintes opções:

  • umCliente: Clientes

  • pedro: Clientes

  • : Clientes

  • João

O nome do objeto pode ser representado por um nome de pessoa ou algum nome genérico e ainda pode também ser omitido, como visto no terceiro exemplo. Um objeto pode estar criado sem a sua classe, ou seja, apenas com o nome do objeto, como mostra o quarto exemplo, porém, é aconselhável estar implícito o nome da classe no objeto.

Abaixo do objeto segue na vertical uma linha tracejada, que indica o tempo de vida de objeto, ou seja, sua criação e sua destruição do mesmo. É por meio de sua linha de vida, que os objetos terão as suas interações com os demais objetos do cenário ou com sigo mesmo.

A linha de vida demonstra também quando o objeto está com o foco, isto é feito através de barras de ativação. As barras de ativações são vinculadas a cada mensagem/interação. Pode-se ter também barras de ativações empilhadas, ou seja, isso indica que o objeto enviou uma auto mensagem (auto delegação).

Os objetos podem ser de vários tipos, na UML são chamados de estereótipos, os mais comuns são:

  • Boundary (Fronteira): São classes de interface de usuário;

  • Control (Controle): São classes que controlam o comportamento de um caso de uso;

  • Entity (Entidade): São classes que armazenam informações que serão manipuladas pelo sistema.

Veja na figura 2 as representações dos estereótipos de objetos citados acima.

 

Figura 2 – Representações gráficas dos tipos de objetos

 

 

Mensagens

 

As interações entre os objetos são representadas por mensagens, que podem também ser denominadas estímulos. As mensagens podem partir de um objeto para outro, ou em alguns casos um objeto pode enviar uma auto mensagem, neste caso a mensagem parte da linha de vida do tal objeto e tem como destino o mesmo, portanto sua seta faz uma volta apontando ao mesmo objeto.

No geral, as mensagens são representadas graficamente por uma linha simples, tracejada ou não, com uma seta apontando para o objeto destino da mensagem. Uma mensagem representa a chamada de algum método ou função do objeto destino, portanto, é especificado também acima da linha da mensagem qual o método que aquela mensagem está chamando. A sintaxe da mensagem é a seguinte:

 

retorno := mensagem(parâmetro: tipoParâmetro): tipoRertorno

 

Uma barra de ativação delimita a execução do método chamado pela mensagem.
Para o diagrama de sequência existem alguns tipos de mensagens específicos, veja logo mais alguns deles:

  • Call: este é o tipo mais comum, pois representa a chamada de um método de algum objeto. Um objeto pode fazer a chamada de seus próprios métodos, isso seria a auto mensagem.  Esta é uma mensagem síncrona, o que indica que o fluxo do diagrama não continuará até que este método seja finalizado (ver figuras 3 e 4);

  • Send: este tipo de mensagem também chama um método, a diferença é que esta é uma mensagem assíncrona, ou seja, a sua execução decorre em paralelo aos demais processos (ver figura 5).

  • Return: este tipo de mensagem representa o retorno de um valor para o objeto de chamou a execução do método. O retorno não é obrigatório ser representado no diagrama, porém, não é errado utilizá-lo (ver figura 6);

  • Create: indica a criação de um objeto (ver figura 7);

  • Destroy: indica a eliminação de um objeto (ver figura 8).

Veja nas seguintes figuras as representações gráficas de cada tipo de mensagem.

 

Figura 3 – Representação da mensagem do tipo Call
 
Figura 4 – Representação da mensagem do tipo Call de auto delegação
 
Figura 5 – Representação da mensagem do tipo Send
 
Figura 6 – Representação da mensagem do tipo Return
 
Figura 7 – Representação da mensagem do tipo Create
 
Figura 8 – Representação da mensagem do tipo Destroy

 

 

Exemplo Fazer Login

 

Com estes dois elementos que foram apresentados, Objetos e Mensagens, pode-se resolver diversos cenários de casos de uso, descrevendo a sequência dos métodos e a interação entre os objetos do cenário. Vamos dar um exemplo de um caso de uso Fazer Login (ver figura 9).

 

Figura 9 – Diagrama de sequência Fazer Login

 

Neste exemplo, temos um usuário que chama o método informaDados do objeto telaLogin, fornecendo os dados de login e senha. Logo em sequência o objeto telaLogin envia uma mensagem com o objetivo de consultar os dados do usuário, logicamente passando as informações de login e senha, onde o retorno desta mensagem será armazenado em usuarioOk. Na sequência, se usuarioOk for igual a True, a telaLogin envia uma mensagem do tipo Create para o objeto telaPrincipal. Por fim o objeto telaLogin envia uma auto mensagem do tipo Destroy. Percebe-se que não foi enviada nenhuma mensagem de retorno ao usuário, aviando se houve algum a efetuar o login. Porém, o intuito deste exemplo é mostrar a utilização dos elementos do diagrama de sequência, como a distribuição dos objetos e a utilização de alguns tipos de mensagens.

 

Frames

 

Além de Objetos e Mensagens podemos ter ainda no diagrama de sequência o elemento Frame. Este elemento serve para tratar alguns conceitos mais avançados, como estruturas de repetição e de decisão.
Os frames são quadros ou molduras que determinam que um grupo de mensagem seja tratado de forma diferente no fluxo do diagrama. Alguns dos tipos mais comuns de frames são: Loop, Alt e Opt.

 

Loop

 

Como o próprio nome já indica este tipo de frame indica que as mensagens que estiverem dentro do escopo deste frame farão parte de uma estrutura de repetição considerando alguma condição, que também deve estar descrita no frame. Além de sua condição o frame pode conter também uma breve descrição, indicando qual o seu propósito, mas isso não é obrigatório e em alguns casos nem é necessário, pois a própria condição pode se descrever bem. Veja na figura 10 a representação do frame de tipo Loop.

 

Figura 10 – Representação gráfica do frame de tipo Loop

 

 

Opt

 

Este tipo de frame funciona como um If na programação, portanto logicamente, deve-se especificar uma condição para executar as mensagens dentro do frame, ou seja, o fluxo apenas irá executar as mensagens dentro deste frame caso a condição especificada seja atendida. Lembrando pode-se que também adicionar uma descrição opcional para este frame também. Veja na figura 11 a representação deste tipo de frame.

 

Figura 11 – Representação gráfica do frame de tipo Opt

 

 

Alt

 

Este tipo de frame funciona de forma semelhante ao Opt, a diferença é que este tipo dá a opção de utilizar o um Else, ou seja, caso a condição não seja atendida, pode-se executar outras mensagens. Para isso o frame é dividido na horizontal por uma linha tracejada, na parte de cima é onde ficará a condição do Alt e as mensagens a serem executadas caso a condição seja verdadeira, e na parte inferior do frame, ficarão as mensagens que serão executadas cosa a condição não seja atendida. Veja na figura  12 a representação gráfica para este tipo de frame.

 

Figura 12 – Representação gráfica do frame de tipo Alt

 

Apenas a critério de curiosidade saiba que existem ainda outros tipos de frames, estes citados aqui são apenas os mais comuns.

Veja na figura 13 a adaptação feita no diagrama de exemplo Fazer Login utilizando alguns frames. Utilizando um Loop para validar o usuário e um Alt para exibir se o login deu certo ou não.

 

Figura 13 – Adaptação do exemplo Fazer Login utilizando frames

 

 

Exemplo prático com StarUML

 

Para quem não conhece, o StarUML é uma das várias ferramentas disponíveis para a criação e manipulação de diagramas da UML. O StarUML é um software gratuito e prático de usar. Para fazer o download do StarUML basta acessar a página principal do projeto, através do seguinte endereço (http://staruml.softonic.com.br). A instalação deste software segue o padrão (next/ next / finish).

 

Criando o diagrama de sequência

 

Após a instalação do StarUML, abra-o com um clique duplo em seu ícone na área de trabalho do Windows. Na primeira janela que é apresentada escolha a opção Default Approach (abordagem padrão em português). Para criar um novo diagrama de sequência vá com o ponteiro do mouse até o painel Model Explorer, situado na lateral direita da tela, clique com o direito do mouse sobre o nó “<<useCaseModel>> Use case Model“ do painel Model Explorer, e escolha as seguintes opções (Add Diagram/ Sequence Diagram) (ver figura 14).

 

Figura 14 – Criando um diagrama de sequência no StarUML

 

Situado na lateral esquerda da tela do StarUML temos o painel Toolbox, nele é onde ficam as respectivas ferramentas a serem utilizadas no diagrama de sequência, tais como Objetos, Mensagens e Frames. As mensagens são chamadas pela ferramenta de Stimulus, que é também uma denominação aceitável para as mensagens. Veja na figura 15 os elementos disponibilizados pela ferramenta para o desenho do diagrama de sequência no painel Toolbox.

 

Figura 15 – Painel Toolbox

 

 

Criando os objetos

 

O diagrama que iremos desenhar é o mesmo do exemplo dado na figura 13. Ou seja, neste trecho do artigo apenas explicaremos como configurar as propriedades dos elementos do diagrama de sequência, pois a disposição dos elementos no mesmo será seguida conforme a figura 13.

Podemos perceber que não tem nenhum elemento com a figura de um ator. Para adicionarmos um ator ao diagrama de sequência precisamos cria-lo no painel Model Explorer, este é um processo parecido com o processo de criar o diagrama de sequência, clique com o direito do mouse sobre a opção “<<useCaseModel>> Use Case Model” e escolhas as seguintes opções (Add/ Actor), logo em seguida adicione um nome para o ator, no exemplo utilizamos a nomenclatura “Usuario”. Note que foi criado um novo item no menu TreeView, com o símbolo do ator e o nome Usuario. Para adicionar o ator ao desenho, basta arrastar seu item para a área de desenho do diagrama, a área em branco no centro da tela.

Como foi dito anteriormente, o objeto é uma instância de alguma classe, e pode também ser criado sem nenhuma classe, porém recomenda-se que crie o elemento objeto através de uma classe já criada no diagrama. Para criar o objeto basta clicar no elemento Object no painel Toolbox e clicar posteriormente na área de desenho do diagrama. Desta forma teremos um objeto sem nenhuma classe definida, porém, abaixo do painel Model Explorer na lateral direita da tela, temos o painel Properties, este painel mostra todas as propriedades passíveis de alterações do elemento que estiver com o foco, isto vale para qualquer elemento do StarUML, por exemplo, até o diagrama de sequência que foi criado tem propriedades que podem ser alteradas pelo painel Properties.

Crie um objeto no diagrama ao lado direito do objeto Usuario criado anteriormente, e mantenha o foco neste. No painel Properties altere o seu nome para “telaLogin”, este objeto será o objeto que representará a interface de login do sistema. Na propriedade Stereotype (estereótipo em português), você pode escrever diretamente o tipo do objeto ou pesquisar através do botão “...” exibido após a propriedade receber o foco. Será aberta uma janela para informar qual o estereótipo do objeto, como a telaLogin é uma interface de usuário, o estereótipo da mesma será o “boundary”. Escolha “boundary” e clique em Ok para confirmar (ver figura 16).

 

Figura 16 – Selecionando um estereótipo para um objeto

 

Ainda com o foco no objeto telaLogin, e explorando as suas propriedades, temos a seguir a propriedade Visibility, esta propriedade indica a visibilidade deste objeto para com os demais objetos do sistema, esta propriedade é comum em outros elementos do diagrama. O valor para a propriedade Visibility pode variar entre PUBLIC, PROTECTED, PRIVATE e PACKAGE. Mantenha a visibilidade do objeto como PUBLIC.

Logo na sequência temos a propriedade Classifier, nesta propriedade é onde indicamos qual a classe deste objeto, como dissemos anteriormente, não é obrigatório identificar a classe, porém, neste exemplo vamos indicar a classe telaLogin. Porém esta classe ainda não existe no escopo do projeto de diagramas do StarUML, teremos que cria-la, faça como fora feito para criar o ator, clique com o direito do mouse em “<<useCaseModel>> Use Case Model” e escolha as seguintes opções (Add/ Class). Defina no painel Properties o nome da classe como “telaLogin” e o estereótipo da mesma como “boundary”.
Após ter criado a classe telaLogin selecione novamente o objeto telaLogin no diagrama de sequência. No painel Properties, selecione a propriedade Classifier e clique no botão “...“ para selecionar qual a classe para o objeto. Irá abrir uma janela de busca, com uma estrutura semelhante a do painel Model Explorer. Clique duas vezes no item “<<useCaseModel>> Use Case Model” para abrir suas opções. Serão apresentadas duas opções, o ator Usuario e a classe telaLogin que criamos. A classe telaLogin estará indicando o seu estereótipo com o prefixo <<boundary>> antes de seu nome. Selecione o item da telaLogin e clique em Ok para confirmar. Note que a representação do objeto telaLogin mudou, agora está representado com o seu estereótipo, seu nome e sua classe separada do nome pelo sinal de dois pontos “:”.

Para completar nosso exemplo ainda falta adicionar dois objetos ao nosso diagrama, são eles: usuários que é a entidade que armazena as informações dos usuários do sistema e a interface principal do sistema, que será chama caso o login efetuado pelo Usuário esteja correto.

Portanto crie a classe “usuários” com o estereótipo “entity” e a classe “telaPrincipal” com o estereótipo “boundary”. Para criarmos os objetos destas classes no diagrama basta arrastarmos o item criado no painel Model Explorer com os nomes de suas respectivas classes (ver figura 17), desta forma o objeto será criado no diagrama com suas propriedades já configuradas seguindo o estereótipo de sua classe.

 

Figura 17 – Painel Model Explorer com as classes criadas

 

 

Criando as mensagens

 

Para criar mensagens entre os objetos do diagrama, é necessário saber quem está iniciando a mensagem, ou seja, de qual elemento é a origem da mensagem, e logicamente devemos ter em mente qual é o destino desta mensagem, que é o objeto que irá executar algum método ou receber algum valor retorno.

Vamos criar a primeira mensagem do diagrama, que é a interação entre o ator Usuario e o objeto telaLogin. Selecione no painel Toolbox o elemento Stimulus, e na área de desenho, clique na linha de vida do objeto Usuario (ator) e sem soltar o botão do mouse, arraste até a linha de vida do objeto telaLogin. Será criada uma interação entre estes dois objetos, logo após soltar o botão do mouse já é possível escrever o nome da mensagem, ou seja, o possível nome de algum método ou função da classe do tal objeto.

Na tabela 1, estão especificadas as informações e as sequências das mensagens do diagrama de exemplo. Portanto nesta primeira mensagem iremos definir como nome, informaDados, não é preciso informar seus parâmetros nesta etapa, pois iremos utilizar o painel Properties para isso, porém é possível fazê-lo.

Mantenha o foco na mensagem que acabamos de criar, clicando-a com o ponteiro do mouse, e caso ainda não tenha preenchido o nome da mensagem após cria-la pode fazê-lo através da propriedade Name. Mantenha a sua propriedade ActionKind como Call, pois esta mensagem representa a chamada de um método na classe telaLogin. Mantenha a propriedade Visibility como PUBLIC. No grupo de propriedades Detail, defina na propriedade Arguments os parâmetros passados na mensagem, neste caso (“login”, “senha”). Esta mensagem já está configurada. Porém, é interessante conhecer a utilização das demais propriedades do grupo Detail do elemento Stimulus.

A propriedade Return possibilita indicar um atributo que irá receber o valor de retorno da mensagem, por exemplo, usuarioOk na mensagem 2. Na propriedade Iteration pode-se informar quantas vezes esta mensagem deve repetir, por exemplo, se digitar o número 5, será representado da seguinte forma na mensagem: *[5]. Na propriedade Branch pode-se informar uma condição verificar se a mensagem será ou não chamada, por exemplo, usuário == True escrito nesta propriedade, será representado da seguinte forma: [usuarioOk == True].

Utilize a tabela 1 para criar as demais mensagens na tela, prestando atenção de onde parte a mensagem e para onde vai, e claro definindo corretamente o seu tipo de ação e parâmetros. Uma última observação sobre as mensagens, é que quando a origem e o destino da mensagem forem o mesmo objeto do diagrama, por exemplo, as mensagens 4, 5 e 7 da tabela 1, utilize o elemento SelfStimulus, ou caso ainda queira utilizar o mesmo elemento Stimulus basta clicar e arrastar o ponteiro do mouse pela própria linha de vida do objeto, que será criada uma auto mensagem.

Caso em seu diagrama ainda não tenha aparecido na representação das mensagens os parâmetros das mesmas, isto pode ser configurado nas propriedades do diagrama de sequência como também a exibição ou não dos números da sequência das mensagens. Clique numa área em branco do desenho para focar o diagrama, em seguida poderá ver três propriedades no grupo Detail do painel Properties, são elas: ShowSequenceNumber, MessageSingatur e ShowActivation. Elas servem respectivamente para Exibir ou não os números que representam a sequência das mensagens, controla o que será exibido junto com o nome da mensagem em sua representação, por padrão vem definido NONE, altere para NAMEANDTYPE, caso queira de seja exibido os parâmetros na representação da mensagem e por último controla a exibição ou não das barras de ativação das mensagens.

 

Tabela 1 – Lista de mensagens utilizadas no exemplo

 

 

Criando os frames

 

Para criar frames temos três tipos de elementos, são eles:

  • Frame: Este é apenas um quadro comum, que indica um tipo de agrupamento de mensagens, porém, apenas o frame não é possível estipular uma condição, como um frame de tipo Opt, ou outro que utilize uma condição.

  • Interation Operand: Este é um quadro invisível no desenho do diagrama. Ele é associado ao frame, nele pode ser adicionada uma condição para a interação das mensagens. Porém, ele não pode ser adicionado sozinho ao diagrama, necessariamente deve ser vinculado a um elemento Combined Fragment.

  • Combined Fragment: Como o próprio nome sugere, este é um elemento combinado, ele é a junção do Frame com o elemento Interation Operand, ou seja, este é o elemento que teremos que utilizar caso queiramos adicionar uma condição para que as mensagens agrupadas por nossos frames entrem no fluxo do diagrama. Neste elemento podem ter mais de um Interation Operand, como é o caso do tipo de frame Alt, que executa mensagens caso a condição seja atendida e também executa mensagens caso não seja atendida a mesma.

Como em nosso exemplo na figura 13 temos dois frames com condições. Iremos utilizar o elemento Combined Fragment. Portanto adicione o primeiro elemento ao desenho, este será um frame de tipo Loop. Como sabemos que o mesmo se compõe de dois elementos, Frame e Combined Operand, o título é o Frame e o centro do quadro é o elemento Interation Operand acoplado ao Frame. Para alterarmos as propriedades do Frame, teremos que acessar sua propriedade Interaction Operator no painel Properties e alterá-la para o tipo Loop. A propriedade Name indica uma descrição para o Frame, no exemplo, esta mesma fora preenchida com a seguinte descrição: “Validar Usuário”. Para incluirmos uma condição a este frame, clique no centro do mesmo, e no painel Properties acesse a propriedade Guard para incluir a condição “usuarioOk == False”, ou seja, enquanto esta condição for verdadeira o loop será realizado. Caso ainda não tenha posicionado este frame no desenho, faça-o como está no exemplo.

O próximo frame é do tipo Alt, ou seja, simula uma estrutura de decisão If e Else. Adicione mais um elemento Combined Fragment ao desenho. Clique no título do quadro para alterarmos sua propriedade Interaction Operator para Alt. Apague o texto que tiver na propriedade Name. Selecione o centro do quadro para adicionarmos uma condição na propriedade Guard no painel Properties. Adicione a condição “usuarioOk == True”. Notamos que ainda temos apenas um quadro neste Frame tipo Alt, precisamos de mais um quadro para englobar as mensagens que serão executadas caso a condição no primeiro quadro não seja atendida. Para isso clique no elemento Interation Operand e clique em seguida no frame do tipo Alt. Isso irá criar uma divisão no mesmo, uma linha tracejada irá determinar onde termina o fluxo “Caso Verdade” e começa o fluxo “Caso Falso”. Percebe-se que são elementos distintos, porém, unidos dentro do frame. O segundo fluxo criado, pode também ter uma condição na propriedade Guard, porém, não é necessário, tendo em vista que já se trata de uma estrutura de decisão. No exemplo da figura 13 foi inserido um texto na propriedade Guard deste segundo quadro, “Caso Contrário”.

 

Conclusão

 

Neste artigo apresentamos alguns conceitos de mais uma ferramenta da UML, o diagrama de sequência. Este é um diagrama muito útil para identificar em ordem cronológica, as mensagens que são passadas entre um objeto e outro no escopo de uma determinada situação, quase sempre um caso de uso. Demonstramos seus elementos e as características de cada um. Demonstramos também um exemplo de utilização e na parte prática do artigo ensinamos como montar o exemplo na ferramenta case StarUML.

Espero que tenham gostado do artigo e que tenha sido útil. Um abraço a todos e até mais.

 

 

 

 

 

Sobre o Autor

Lucas Vieira de Oliveira Consultor The Club

E-mail: suporte@theclub.com.br

The Club - O Maior Clube de programadores do Brasil