projeto de modelagem – máquina de café multiprodutoalcides/teaching/mestrado/fundamentos... ·...

37
1 Projeto de Modelagem – Máquina de Café Multiproduto Carlos G. Vasco, Marcelo Henrique Vithoft, Paulo Roberto C. Estante Programa de Pós Graduação em Informática Aplicada Pontifícia Universidade Católica do Paraná (PUCPR) – Curitiba, PR – Brasil [email protected], [email protected], [email protected] 1 INTRODUÇÃO O desenvolvimento de sistemas é caracterizado pela criação de sistemas que satisfaçam os requisitos. Basicamente, requisitos representam problemas a serem endereçados, os sistemas representa uma solução aos problemas, resolvendo-se os problemas através da implementação da solução. Nesse processo são utilizados alguns tipos de linguagem. Linguagens naturais, como textos ou fluxos de atividades, são utilizadas para comunicar os requisitos. Linguagens de programação são usadas para comunicar os detalhes do sistema. Como as linguagens naturais são menos precisas as que linguagens de programação, definiu-se uma linguagem de modelamento (sendo UML um dos tipos disponíveis) que são utilizadas no processo de resolução do problema, realizando-se a conexão entre os dois extremos. O extremo dos requisitos, pode parecer muito vago para os desenvolvedores do sistema, e o extremo do sistema que é muito específico para ser interpretado pelo solicitante do sistema. A UML é uma linguagem visual para modelamento e comunicação sobre sistemas. Utiliza diagramas e textos para dar suporte. A sigla UML significa Unified Modeling Language, ou Linguagem de Modelamento Unificado descrita em [Alhir] como sendo: Linguagem- permite a comunicação sobre um tema específico. Modelo- define a forma de representação de um tema. Unificada- traz a idéia de algo único ou padrão. Definida pela OMG(Object Management Group) uma linguagem comum para permitir a equipe de desenvolvimento a mesma interpretação do tema. A linguagem UML foi concebida com os seguintes objetivos: Pronta a ser utilizada Expressiva Simples Precisa Extensível Independente da implementação Independente do processo

Upload: truonglien

Post on 13-Nov-2018

213 views

Category:

Documents


0 download

TRANSCRIPT

1

Projeto de Modelagem – Máquina de Café Multiproduto

Carlos G. Vasco, Marcelo Henrique Vithoft, Paulo Roberto C. Estante

Programa de Pós Graduação em Informática Aplicada Pontifícia Universidade Católica do Paraná (PUCPR) – Curitiba, PR – Brasil

[email protected], [email protected], [email protected]

1 INTRODUÇÃO O desenvolvimento de sistemas é caracterizado pela criação de sistemas que satisfaçam os requisitos. Basicamente, requisitos representam problemas a serem endereçados, os sistemas representa uma solução aos problemas, resolvendo-se os problemas através da implementação da solução. Nesse processo são utilizados alguns tipos de linguagem.

• Linguagens naturais, como textos ou fluxos de atividades, são utilizadas para comunicar os requisitos.

• Linguagens de programação são usadas para comunicar os detalhes do sistema.

Como as linguagens naturais são menos precisas as que linguagens de programação, definiu-se uma linguagem de modelamento (sendo UML um dos tipos disponíveis) que são utilizadas no processo de resolução do problema, realizando-se a conexão entre os dois extremos. O extremo dos requisitos, pode parecer muito vago para os desenvolvedores do sistema, e o extremo do sistema que é muito específico para ser interpretado pelo solicitante do sistema. A UML é uma linguagem visual para modelamento e comunicação sobre sistemas. Utiliza diagramas e textos para dar suporte. A sigla UML significa Unified Modeling Language, ou Linguagem de Modelamento Unificado descrita em [Alhir] como sendo:

• Linguagem- permite a comunicação sobre um tema específico. • Modelo- define a forma de representação de um tema. • Unificada- traz a idéia de algo único ou padrão. Definida pela OMG(Object

Management Group) uma linguagem comum para permitir a equipe de desenvolvimento a mesma interpretação do tema.

A linguagem UML foi concebida com os seguintes objetivos:

• Pronta a ser utilizada • Expressiva • Simples • Precisa • Extensível • Independente da implementação • Independente do processo

2

O presente trabalho visa exemplificar as características expostas através da criação de casos de uso, diagramas de classe, seqüência e de atividades de um sistema responsável pelo gerenciamento de uma máquina de café multiproduto. Quantificando o modelamento da máquina de café multiproduto foram gerados os diagramas abaixo:

• 01 diagrama de caso de uso • 12 diagramas de classe • 10 diagramas de seqüência • 02 máquinas de estados • 03 diagramas de atividade

2 DESCRIÇÃO DO MODELO Uma máquina de café multiproduto tem como finalidade principal fornecer ao usuário a bebida selecionada. Porém existem tarefas adicionais que devem ser levadas em consideração como contabilização de produtos servidos, débito de créditos de usuário, etc. A Figura 1 mostra um exemplo da referida máquina.

Figura 1: Máquina de café multiproduto

Com o intuito de representar todas as funcionalidades necessárias a partir da perspectiva dos usuários do sistema o diagrama de casos de uso exposto na Figura 2 foi gerado.

3

Figura 2: Diagrama de Casos de Uso

Foram considerados usuários do sistema (atores) todos elementos que de uma forma independente fazem interface com o sistema.

� Usuário- pessoa com intuito de beber algum dos produtos que a máquina gera. � Repositor- caso especial de um usuário que possui características extras para

realizar a administração da máquina. O repositor pode assumir o papel de usuário quando estiver solicitando uma bebida.

� Configurador- caso especial de Usuário e Repositor (podendo assumir o papel de ambos). A característica adicional diz respeito a configuração dos produtos que a máquina multiproduto irá servir. Normalmente essa configuração é feita em fábrica no momento da montagem da máquina.

� Sensor- Ator que representa um subsistema que é responsável pelo controle dos dispositivos (Sensores e Atuadores), os quais serão tratados como caixa preta para o sistema..

Os casos de uso especificados são expostos a seguir.

� VisualizarInfos- a máquina dispõe de um sistema de vídeo, assim o modelo propõe visualização de noticias

� VisualizarReceitasDeBebidas- mesma idéia do item anterior porem para receita das bebidas.

� VisualizarSaldoDeCreditos- interage com sensores para coleta de saldo do usuário.

� PedirBebidas- representa o caso de uso principal, pois a função primordial da máquina é prover ao usuário a bebida escolhida.

4

� SelecionarExtras- adição de elementos extras na preparação da bebida como adoçante, leite. Trata-se de uma especialização de PedirBebidas.

� CalibrarSensores- Faz parte dos casos de uso de administração da máquina, interage com o repositor. A calibração é feita de acordo com o plano de manutenção definido pelo fabricante da máquina.

� ReiniciarContadores- função a ser utilizada após emissão de relatórios e calibração dos sensores. Faz parte do plano de manutenção da máquina

� EmitirRelatorios- fera relatório ao repositor com estatística de bebidas servidas, problemas durante a operação da máquina, bem como a receita gerada.

� ConfigurarProdutos- atividade usualmente executada em fábrica, o configurador através dela define quais bebidas serão fornecidas pela máquina. A quantidade de ingredientes utilizada por cada uma delas também é definida aqui.

2.1 Descrição dos Módulos Funcionais do Modelo Para garantir a modularidade deste projeto, bem como a organização dos diagramas, optou-se pela criação dos Módulos Funcionais, que nada mais são do que pacotes que agrupam diagramas de uma funcionalidade do sistema. Antes de iniciar a descrição dos módulos funcionais do sistema, é importante ressaltar que ao longo do modelo, dois Padrões de Projeto (Design Pattern) como definidos em [Gamma] serão amplamente utilizados:

• Delegation (Delegação) que é um padrão de projeto fundamental, que permite a delegação de atividades a uma classe agregada a primeira;

• Factory Method (Fábrica), que resumidamente permite criar objetos desejados utilizando métodos que retornam os objetos (definição extraída do material didático da matéria de Fundamentos de Engenharia de Software);

Imediatamente a seguir os Módulos Funcionais serão descritos, principalmente através de seus diagramas.

2.1.1 Gerenciador de Banner A funcionalidade “banner” é responsável pela apresentação de informações (notícias) provenientes de um acesso a internet ou puramente a um conjunto de informações disponibilizadas em disco (disquete) em no dispositivo de vídeo da máquina de bebidas. Por sua vez o Banner Manager é responsável pelo gerenciamento desta funcionalidade, ou seja, é através deste que os métodos que os serviços desta funcionalidade são requisitados.

2.1.1.1 Diagrama de Classes do Gerenciador de Banner A classe GerenciadorBanner implementa os métodos necessários para que as funcionalidades deste módulo sejam atendidas.

5

Figura 3:Diagrama de Classes do Gerenciador de Banner

Lista de atributos da classe GerenciadorBanner: • private CtrlIO[] dispositivoLeitura • private CtrlIO[] dispositivoEscrita

Os dois atributos listados a seguir definem os dispositivos de onde o GerenciadorBanner coleta as notícias bem como onde deve apresentá-las. Lista de métodos da classe GerenciadorBanner:

• public GerenciadorBanner(GerenciadorTarefas gerenciadorTarefas) – utilizado pelo Gerenciador de Tarefas para criação do GerenciadorBanner.

• public boolean inicializacao() – este método é usado para a inicialização do objeto.

• public boolean liberaBanner() – utilizado pelo GerenciadorTarefas para iniciar a apresentação das notícias.

• public boolean cancelaBanner() – utilizado pelo GerenciadorTarefas para interromper o processo de notícias quando outro evento demanda a notificação do usuário, como bebida pronta ou mostrar saldo atual do usuário.

• public String buscaNoticia(int contadorNoticia) – coleta notícia a partir do dispositivo de leitura especificado.

• public boolean informaDispositivoIO(CtrlIO dispositivoEscrita, CtrlIO dispositivoLeitura) – Denifição dos dispositivos.

• public void mostraBanner() – envia notícias ao dispositivo de escrita. • public boolean temporiza() – define-se temporizador para notícia poder ser

lida pelo usuário, se um evento de cancelamento de banner não for recebido um novo ciclo é inicado.

2.1.1.2 Diagrama de Sequência do Gerenciador de Banner O diagrama abaixo ilustra o momento em que o Gerenciador de Tarefas está criando/instanciando o Gerenciador de Banner, além do ciclo completo para a apresentação de uma notícia, desde o momento que o Gerenciador de Tarefas libera o Gerenciador de Banner para iniciar a sua atividade, passando pela busca da

6

informação e exibição da mesma, encerrando no momento que o Gerenciador de Tarefas interrompe as atividades deste módulo funcional.

Figura 4: Diagrama de Seqüência do Gerenciador de Banner

2.1.1.3 Diagrama de Atividades do Gerenciador de Banner Através do diagrama de atividade é possível mostrar a lógica desta funcionalidade, conforme ilustrado na figura abaixo e anteriormente detalhado.

7

Figura 5: Diagrama de Atividades do Gerenciador de Banner

2.1.2 Seletor de Botões As bebidas, bem como demais funcionalidades desta máquina serão selecionadas/escolhidas/ordenadas através de botões, para tanto foi criada uma classe que modela um botão. Para criar e gerenciar este conjunto de botões, que funcionalmente falando, correspondem aos controladores de botões, foi criado um Gerenciador de Botões (ou Seletor de Botões). Para garantir o funcionamento adequado desta estrutura responsável pelo tratamento dos botões do sistema foi necessário criar algumas regras, serão mostradas junto ao diagrama de classes.

2.1.2.1 Diagrama de Classes do Seletor de Botões

8

Para garantir que um botão possa ser combinado a outro(s) durante a solicitação de um serviço (bebida, etc...) foram utilizados alguns atributos, cuja explicação/ detalhamento se faz necessário neste momento. É importante ressaltar que a classe SeletorBotoes tem o papel de Factory (Padrão de Projeto), através da qual os vários botões do sistema (controladores de botões) são instanciados e cuja referência a estes ficam armazenadas em uma lista para posterior requisição por parte dos outros módulos funcionais do sistema.

Figura 6: Diagrama de Classes do Gerenciamento de Botões

Conforme ilustrado na figura acima, os atributos da classe Botao

• private Botao[] botoesCombinados; • private Botao[] botoesExcludentes;

são usados respectivamente para indicar com qual outro botão este pode ser combinado e com qual outro ele não pode ser combinado, desta forma a validação de um pedido pode ser executada, sempre levando em consideração estas duas listas de botões. Lista de métodos da classe SeletorBotao:

• public SeletorBotao(GerenciadorTarefas gerenciadorTarefas) • public boolean criarBotoes()

9

• public boolean removerBotoes() • public boolean notificaMudancaEstado(Botao botao, boolean selecionado) • public boolean verificaRegrasBotao(Botao botao) • public boolean liberaBotao(Botao botao) • public Botao[] getListaBotoes() • public Botao criarBotao (String nome)

Lista de métodos da classe Botao:

• public Botao(SeletorBotao seletor, String nome, boolean combinado) • public boolean isCombinado() • public String getNome() • public boolean isSelecionado() • public void selecionaBotao() • public void liberaBotao() • public Botao[] getListaBotoesExcludentes() • public void addBotaoExcludentes(Botao botao) • public void limpaListBotaoExludente() • public Botao[] getListaBotoesCombinados() • public void addBotaoCombinado(Botao botao) • public void limpaListaBotaoCombinado() • public void notificaMudancaEstado()

2.1.2.2 Diagrama de Sequência do Seletor de Botões No diagrama abaixo, assim como na grande maioria destes diagramas de seqüência, a primeira parte ilustra a criação/ instanciação do Seletor de Botões comandado pelo Gerenciador de tarefas, e em um segundo momento (nível), a criação/ instanciação dos Botões, por intermédio do Seletor de Botões, como ilustra a figura abaixo.

10

Figura 7: Diagrama de Seqüência do Gerenciamento de Botões

No diagrama acima também é ilustrada a mudança de estado de um dado botão e com isso uma seqüência de atividades é inicada para processar este evento (passos 5.* a 6.* no diagrama)

2.1.3 Gerenciador de Configuração Este módulo funcional é responsável pela configuração do sistema, através da classe Configurador, que oferece as funcionalidades abaixo relacionadas

11

• Alterar parâmetros do sistema • Fazer o reset de contadores • Apagar os alarmes • Atualizar Receitas na Base de Dados

2.1.3.1 Diagrama de Classes do Gerenciador de Configuração A classe Configurador é quem implementa as funcionalidades no tópico anterior citadas.

Figura 8:Diagrama de Classes do Gerenciador de Configuração

Lista de métodos da classe Configurador:

• public Configurador(GerenciadorTarefas gerenciadorTarefas) • public boolean informaGDB(gdb : GerenciadorDB) • public boolean alteraConfiguracao(configuracao : String) • public boolean zeraContadores() • public boolean apagaAlarmes() • public boolean atualizarReceitasNoDB(receitas : String[])

2.1.3.2 Diagrama de Sequência do Gerenciador de Configuração O diagrama de sequência abaixo mostra a criação/ instanciação da classe Configurador e ilustra a execução de algumas funcionalidades disponíveis para este módulo funcional.

12

Figura 9: Diagrama de Sequência do Gerenciador de Configuração

2.1.4 Gerenciador de Database O Gerenciador de Database provê ao sistema as funcionalidades de acesso e manipulação da Base de Dados do Sistema, com o auxílio do Gerencidor de IO e de Tarefas, obviamente.

2.1.4.1 Diagrama de Classes do Gerenciador de Database Através da classe GerenciadorDB que as funcionalidades descritas no tópico acima serão executadas.

13

Figura 10: Diagrama de Classes do Gerenciador de Database

Lista de atributos da classe GerenciadorDB:

• private : CtrlIO : dispositivoArmazenamento Lista de métodos da classe GerenciadorDB:

• GerenciadoDB(gerenciadorTarefas : GerenciadorTarefas, io : CtrlIO) • private boolean inicializacao() • public ArrayList getConfiguracao() • public boolean atualizaConfiguracao (textos : ArrayList) • public ArrayList getContadores() • public boolean atualizaContadores(textos : ArrayList) • public ArrayList getListaAlarmes() • public boolean addAlarme(alarme : String) • public boolean apagaAlarmes() • public ArrayList getReceita(nomeBebida : String)

2.1.4.2 Diagrama de Sequência do Gerenciador de Database Após a instanciação do Gerenciador de Database, os passos para o armazenamento de uma falha na Base de Dados é ilustrada como um dos casos de uso deste módulo funcional, conforme mostra a figura abaixo.

14

Figura 11: Diagrama de Sequência do Gerenciador de Database

2.1.5 Preparador de Bebidas Este módulo funcional é reponsável pela principal funcionalidade do sistema, que é preparar as bebidas ordenadas pelo usuário do sistema, de acordo com as características e relacionamentos detalhados abaixo, através dos diagramas.

2.1.5.1 Diagrama de Classes do Preparador de Bebidas No diagrama de classes abaixo é possível ver o relacionamento entre a classe que será responsável pela preparação das bebidas (PreparadorBebidas) e as demais classes que auxiliarão a primeira durante o processo de preparação.

15

Figura 12: Diagrama de Classes do Preparador de Bebidas

Lista de atributos da classe PreparadorBebida:

• - private gdb : GerenciadorDB = null • - gerenciadorTarefas : GerenciadorTarefas = null • - gerenciadorAtuadores : GerenciadorAtuadores = null • - gereciadorSensores : GerenciadorSensores = null • - gerenciadorFalhas : GerenciadorFalhas = null • - gerenciadorIO : GerenciadorIO = null

Lista de métodos da classe PreparadorBebida:

• public PreparadorBebidas(gerenciadorTarefas : GerenciadorTarefas, gdb : GerenciadorDB, gerenciadorSensores : GerenciadorSensores, gerenciadorAtuadores : GerenciadorAtuadores)

• public boolean verificaExtras() • public boolean prepararBebida(nomeBebida : String) • public processaReceita(receita : ArrayList) :

16

• public boolean controlarMistura(receita : ArrayList) Lista de métodos da classe Bebida:

• public Bebida() • public Bebida(nome : String) • public getNome() : String • public setNome(nome : String) : void

Lista de métodos da classe Receita:

• public Receita() • public boolean addIngrediente(ingrediente : Ingrediente) : boolean • public boolean removeIngrediente(ingrediente : Ingrediente) : boolean

Lista de métodos da classe Ingrediente:

• public Ingrediente() • public Ingrediente(nomeIngrediente : String, numeroPorcoes : int) • public setNomeIngrediente(nomeIngrediente : String) : void • public getNomeIngrediente() : String • public setNumeroPorcoes(numeroPorcoes : int) : void • public getNumeroPorcoes() : int • public toString() : String

Através dos diagramas a seguir será possível entender os passos e estados do processo de preparação de uma bebida, porém esxistem alguns detalhes nas entrelinhas que se fazem necessária uma explicação. No passo onde o PreparadorBebidas busca a receita da bebida no DB, de posse das STRINGS que compoem a receita, estas serão usadas para a instanciação da classe Receita (inicializada com os dados do DB), através da função addReceita(ArrayList) para uso interno durante a preparação da bebida, onde cada uma das linhas (STRINGS) será um Ingrediente, cuja conversão é de responsabilidade da função parseIngrediente (String).

2.1.5.2 Diagrama de Atividades do Preparador de Bebidas O diagrama abaixo mostra a lógica do preparador de bebida desde a recepção de uma tarefa a partir do Gerenciador de Tarefas, passando pela busca da receita da bebida, verificação das quantidades disponíveis de ingredientes, créditos para que a bebida possa ser preparada. Depois de todas as validações anteriormente citadas, o próximo passo é controlar a mistura dos ingredientes e então informar o usuário sobre o resultado da operação.

17

Figura 13: Diagrama de Atividades do Preparador de Bebidas

É importante ressaltar que durante todo o processo de preparação de uma bebidas, as falhas que ocorram serão notificadas através do Gerenciador de Falhas.

2.1.5.3 Diagrama de Sequência do Preparador de Bebidas

18

O diagrama de sequência abaixo, mostra a preparação de uma bebida do ponto de vista da sequencialidade das operações a serem executadas por este módulo funcional, conforme é possivel ver na figura a seguir.

Figura 14: Diagrama de Sequência do Preparador de Bebidas

No diagrama acima, foi focado o caso positivo, ou seja, sem a ocorrência de erros que invibilizasse a preparação da bebida. Porém no caso negativo, ao invés da busca pelo gerenciador de IO, através do qual o resultado da operação é mostrado, o gerenciador de falha será acionado para armazenar e mostrar a falha ocorrida durante o processo de proparação da Bebida.

2.1.5.4 Máquina de Estados do Preparador de Bebidas O diagrama abaixo apresenta a máquina de estados deste módulo funcional, através do qual é possível conhecer mais detalhadamente o comportamento deste.

19

Figura 15: Máquina de Estados do Preparador de Bebidas

2.1.6 Gerenciador de Falhas O Gerenciador de Falhas tem com função mostrar e armazenar as falhas do sistema. Este módulo funcional pode ser acessado a todo instante através do Gerenciador de Tarefas que é capaz de forncer oferecer uma referência a este módulo a medida que os demais módulos requisitarem. O Gerenciador de falhas depende diretamente do Gerenciador de IO e do Gerenciador de DB.

2.1.6.1 Diagrama de Classes do Gerenciador de Falhas Através do diagrama de classes é possível ver os métodos disponibilizados para o gerenciamento de falhas no sistema

Figura 16: Diagrama de Classes do Gerenciador de Falhas

20

Lista de atributos da classe Ingrediente:

• - gerenciadorTarefas : GerenciadorTarefas = null • - output : CtrlIO = null • - gdb : GerenciadorDB = null

Lista de métodos da classe GerenciadorFalhas:

• public GerenciadorFalhas(gerenciadorTarefas : GerenciadorTarefas, output : CtrlIO, gdb : GerenciadorDB)

• public notificaFalha(texto : String) • public Temporiza()

2.1.6.2 Diagrama de Sequência do Gerenciador de Falhas O diagrama de sequência abaixo oferece a visão de sequencialidade dos passos executados pelo Gerenciador de Falhas durante o seu acionamento.

Figura 17:Diagrama de Sequência do Gerenciador de Falhas

2.1.7 Gerenciador de IO Este módulo funcional por sua vez é responsável pela gerência dos dispositivos de entrada e saída (I/O) do sistema, entre eles: Vídeo, Internet e Disco. Este módulo tem papel fundamental na no funcionamento de um grande número de módulos do sistema, pois como citado acima, ele prove o acesso aos dispositivos de IO, aos quais todos os demais módulos dependem.

21

2.1.7.1 Diagrama de Classes do Gerenciador de IO Do ponto de vista de padrões, o Gerenciador de IO desempenha o papel de factory para os varios dispositivos de IO do sistema, ou seja, de acordo com uma regra de deteção de tipos de dispositivo, o gerenciador cria as diversas instâncias de objetos (diferentes ou não) e armazena em uma lista do tipo CtrlIO, propiciando assim que os objetos tenham seus métodos acessados sem que haja a necessidade de saber qual o tipo específico do objeto (polimorfismo). A Figura 18 mostra o relacionamento entre o Gerenciador de IO e a estrutura hierarquica de classes dos dispositivos de IO.

Figura 18: Diagrama de Classes do Gerenciador de IO

Lista de atributos da classe GerenciadorIO:

• - video : CtrlIO = null • - internet : CtrlIO = null • - disco : CtrlIO = null • - gerenciadorTarefas : GerenciadorTarefas

Lista de métodos da classe GerenciadorIO:

• public GerenciadorIO(gerenciadorTarefas : GerenciadorTarefas) • public boolean autoTest(dispositivo : String) • public getCtrlIO(dispositivo : String) : CtrlIO • public boolean escreveTexto(texto : String, posicao : int, dispositivo : String) • public leTexto(posicao : int, dispositivo : String) • public boolean criaControladoresIO() • public boolean removerControladoresIO() • public getDispositivoArmazenamento() : CtrlIO {return disco;}

22

Lista de métodos da classe CtrlIO: • public CtrlIO(tipo : String) • public boolean autoTest() : boolean • public escreveTexto(texto : String) : boolean {return false;} • public leTexto(posicao : int) : String {return false;}

Lista de métodos da classe CtrlVideo:

• public CtrlVideo() {CtrlIO ("Video");} • public boolean autoTest() • public boolean escreveTexto(texto : String, posicao : int)

Lista de métodos da classe CtrlDisco:

• public CtrlDisco() : void {CtrlIO ("Disco");} • public boolean autoTest() • public boolean escreveTexto(texto : String, posicao : int) • public String leTexto(posicao : int)

Lista de métodos da classe CtrlInternet:

• public CtrlInternet() : void {CtrlIO ("Internet");} • public boolean autoTest() • public String leTexto(posicao : int)

2.1.7.2 Diagrama de Sequência do Gerenciador de IO O diagrama abaixo é usado para representar a sequência de passos executados durante a criação/instanciação do Gerenciador de IO, bem como o papel de factory que este tem com relação aos vários dispositivos de IO (comforme explicado no tópico acima).

23

Figura 19: Diagrama de Sequência do Gerenciador de IO

2.1.8 Gerenciador de Relatórios Através deste módulo funcional é possível gerar relatórios como:

• Parâmetros de configuração da máquina • Contadores • Lista de Falhas do Sistema

Conforme mostra o diagrama de classes do Gerenciador de Relatório.

24

2.1.8.1 Diagrama de Classes do Gerenciador de Relatórios O diagrama de classe da Figura 20 lista métodos utilizados pelo repositor do sistema para geração de relatórios de configuração, falhas. etc.

Figura 20: Diagrama de Classes do Gerenciador de Relatórios

Lista de atributos da classe GerenciadorRelatorio: • private dispositivoSaida : CtrlIO = null • private gdb : GerenciadorDB = null

Lista de métodos da classe GerenciadorRelatorio:

• public GerenciadoRelatorio(gerenciadorTarefas : GerenciadorTarefas) • public boolean informaDispositivosIO(dispositivoSaida : CtrlIO) • public boolean referenciaGDB(gdb : GerenciadorDB) • public boolean mostraConfiguracao() • public boolean mostraContadores() • public boolean mostraFalhas()

2.1.8.2 Diagrama de Sequência do Gerenciador de Relatório O Diagrama abaixo tem o papel de ilustrar, de maneira sequencial todos os passos deste a instanciação do Gerenciador de Relatórios, até a representação das funcionalidades deste módulo funcional

25

Figura 21: Diagrama de Sequência do Gerenciador de Relatório

2.1.9 Gerenciador de Sensores Este módulo tem a função de gerenciar um conjunto de controladores, que gerenciam dispositivos que podem ser considerados como subsistemas externos desta máquina, os Sensores, que são vistos como caixas pretas.

2.1.9.1 Diagrama de Classes do Gerenciador de Sensores Assim como em outros módulos funcionais deste sistema, o Gerenciador de Sensores atua como uma fábrica de objetos (padrão de projeto Factory), onde os objetos são as classes sensores (na verdade, classes controladoras de sensores), comforme mostra o diagrama da Figura 22.

26

Figura 22: Diagrama de Classes do Gerenciador de Sensores

Lista de métodos da classe GerenciadorSensores:

• public GerenciadorSensores(gerenciadorTarefas : GerenciadorTarefas) • public boolean criarSensores() • public getListaSensores() : Sensor[] • public getSensor(nome : String) : Sensor • public addSensor(nomeSensor : String) : Sensor • public boolean removeSensor(sensor : Sensor)

Lista de métodos da classe Sensor:

• public String getNome() • public int getTipo() : int • public Sensor(nome : String, tipo : int) • public int getQuantidade() • public boolean setController(controller : void)

Lista de métodos da classe SensorSeco:

• public int getQuantidade() • public SensorSeco(nome : String) {Sensor (nome, 1);}

Lista de métodos da classe SensorIngrediente:

• public SensorIngrediente(nome : String) {SensorSeco (nome);} • public int getQuantidade()

Lista de métodos da classe SensorMolhado:

• public getQuantidade()

27

• public SensorMolhado(nome : String) {Sensor (nome, 2);} Lista de métodos da classe LeitorNivelAgua:

• public LeitorNivelAgua(nome : String) : void {SensorMolhado (nome);} • public int getQuantidade()

Lista de métodos da classe SensorEspecial:

• public int getQuantidade() • public SensorEspecial(nome : String) {Sensor (nome, 3);}

Lista de métodos da classe LeitorPresencaCopo:

• public LeitoPresencaCopo(nome : String) {SensorEspecial (nome);} • public int getQuantidade()

Lista de métodos da classe LeitorTemperatura:

• public LeitoTemperatura(nome : String) {SensorEspecial (nome);} • public int getQuantidade()

Lista de métodos da classe LeitorCreditos:

• public LeitorCreditos(nome : String) {SensorEspecial (nome);} • public int getQuantidade()

Lista de métodos da classe ContadorCopos:

• public ContadorCopos(nome : String) {SensorEspecial (nome);} • public int getQuantidade()

2.1.9.2 Diagrama de Sequência do Gerenciador de Sensores O papel do diagrama abaixo é mostrar, de forma sequencial, os passos desde a criação dete gerenciador, até a ilustração da execução de uma funcionalidade deste módulo, como podemos ver na figura abaixo.

28

Figura 23: Diagrama de Sequência do Gerenciador de Sensores

2.1.10 Gerenciador de Atuadores O gerenciador de Atuadores deve ser tratado neste sistema de forma analogo ao que acontece com o Gerenciador de Sensores.

2.1.10.1 Diagrama de Classes do Gerenciador de Atuadores

29

Este gerenciador, além de ter a caraterísticas e funcionalidades para atuar sobre u determinado dispositivo, agrega as funcionalidades de um sensor, conforme apresenta o diagrama abaixo. De maneira analoga ao gerenciador de Sensores, esta classe também implementa o Padrão Factory.

Figura 24: Diagrama de Classes do Gerenciador de Atuadores

Lista de atributos da classe GerenciadorAtuadores:

• private listaAtuadores : Atuador[]

30

Lista de métodos da classe SensorEspecial:

• public GerenciadorAtuadores(gerenciadorTarefas : GerenciadorTarefas) • public boolean criarAtuadores() • public getListaAtuadores() : Atuador[] • public getAtuador(nome : String) : Atuador

Lista de métodos da classe Atuador:

• public Atuador(nome : String) • public int getQuantidade() • public boolean decrementa() • public getSensor() : Sensor • public boolean setController(controller : void)

Lista de métodos da classe ControladorCartao:

• public ControladorCartao(nome : String) {sensor = new LeitorCreditos(nome);}

• public getQuantidade() : int {return sensor.getQuantidade;} • public boolean decrementa() • public criarSensorLeitorCreditos() : Sensor • private criarSensor(nome : String) : Sensor

Como o Atuador pode agragar as funcionalidades de Sensor, então imediatamente abaixo serão listadas as características da classe Sensor. Lista de métodos da classe Sensor:

• public String getNome() • public int getTipo() • public Sensor(nome : String, tipo : int) • public int getQuantidade() • public boolean setController(controller : void)

Lista de métodos da classe SensorEspecial:

• public int getQuantidade() • public SensorEspecial(nome : String) {Sensor (nome, 3);}

Lista de métodos da classe LeitorCreditos

• public LeitorCreditos(nome : String) {SensorEspecial (nome);} • public int getQuantidade()

2.1.10.2 Diagrama de Sequência do Gerenciador de Atuadores O diagrama abaixo mostra, de forma sequencial, os passos desde a criação dete gerenciador, até a ilustração da execução de uma funcionalidade deste módulo.

31

Figura 25: Diagrama de Sequência do Gerenciador de Atuadores

2.1.11 Gerenciador de Tarefas Não foi a toa que este módulo recebeu o nome de Gerenciador de tarefa , pois ele tem um papel fundamental no sistema, sendo responsável pelo gerenciamento de toda a máquina, criando, delegando, controlando os demais módulos. Durante o startup do sistema, este módulo será o primeiro a ser criado e a partir dele os demais módulos serão instanciados, tomando forma o sistema.

2.1.11.1 Diagrama de Classes do Gerenciador de Tarefas O diagrama de classes abaixo apresenta a visão geral dos relacionamento do Gerenciador de Tarefas com os demais módulos (classes) do sistema. Evidencia-se a interdependência entre as mesmas, facilitando então o entendimento do funcionamento da Máquina de Café Multiproduto.

32

33

Figura 26: Diagrama de Classes Geral do Modelamento

Como este tópico da especificação é destinado ao módulo funcional Gerenciador de Tarefas, a figura abaixo apresenta a classe GerenciadorTarefas.

34

Figura 27: Diagrama de Classes do Gerenciador de Tarefas

A Figura 27 apresenta especificamente a classe GerenciadorTarefas. Lista de atributos da classe GerenciadorTarefas:

• private SeletorBotao seletorBotao = null; • private GerenciadorIO gerenciadorIO = null; • private GerenciadorBanner gerenciadorBanner = null; • private Configurador gerenciadorConfiguracao = null; • private GerenciadorDB gdb = null; • private GerenciadorFalhas gerenciadorFalhas = null; • private GerenciadorRelatorio gerenciadorRelatorios = null; • private GerenciadorSensores gerenciadorSensores = null; • private GerenciadorAtuadores gerenciadorAtuadores = null; • private SeletorBotao seletorBotao; • private GerenciadorIO gerenciadorIO; • private PreparadorBebidas preparadorBebidas; • private Configurador configurador; • private GerenciadorFalhas gerenciadorFalhas; • private GerenciadorDB gerenciadorDB; • private GerenciadorSensores gerenciadorSensores;

35

• private GerenciadorBanner gerenciadorBanner; • private GerenciadorAtuadores gerenciadorAtuadores; • private GerenciadorRelatorio gerenciadorRelatorio;

Lista de métodos da classe GerenciadorTarefas:

• public GerenciadorTarefas() - construtor • public boolean criarModulosFuncionais() – responsável pela instanciação dos

demais módulos funcionais apresentados na Figura 26 • public boolean notificaMudancaEstadoBotao(botao : Botao, selecionado :

boolean) – interage com SeletorBotao pra indicar que um botão foi selecionado.

• public armazenaMudancaEstadoBotao(botao : Botao, estado : boolean)- usado para armazenar estado de botões selecionados, para compor a sequência de botões e validar características da bebida,

• public boolean processaEvSeletorBotao()- este método é responsável pelo processamento (validação) do evento gerado pelo SeletorBotao com a mudança de estado de um botão, que resultará em uma tarefa.

• public notificaFalha(texto : String)- A partir de um evento recebido dos sensores, GerenciadorBanner, PreparadorBebidas notificando situação não desejada o GerenciadorTarefas irá notificar o GerenciadorFalhas através desse método.

• public criarGerenciadorIO() : GerenciadorIO • public getDispositivoArmazenamento() : CtrlIO • public getSensor(nomeSensor : String) : Sensor • public addSensor(nomeSensor : String) : Sensor • public boolean removeSensor(sensor : Sensor) • public getAtuador(nomeAtuador : String) : Atuador • public getGDB() : GerenciadorDB • public boolean solicitaLiberacaoBanner(prioridade : int) • public boolean liberaBanner() – libera o início das atividades do gerenciador

de banner. • public getGerenciadorIO() : GerenciadorIO • public boolean alteraConfiguracao(configuracao : String) • public boolean apagaHistoricoAlarmes() – tarefa administrativa relacionada ao

gerenciador de falhas. • public boolean reinicializaContadores()

2.1.11.2 Máquina de Estados do Gerenciador de Tarefas O diagrama abaixo apresenta a máquina de estados deste módulo funcional, através do qual é possível conhecer mais detalhadamente sua lógica .

36

Figura 28: Máquina de Estados do Gerenciador de Tarefas

Os diagramas apresentados neste documento estão contidos no modelo da Máquina de Café Multiproduto, contruído a partir da ferramenta JUDE UML ModelingTool versão 2.5.1 destribuido pela ChangeVision (http://jude.change-vision.com)

3 RESTRIÇÕES DO SISTEMA Como superficialmente comentado, este projeto não abordará detalhadamente alguns blocos funcionais devido a complexidade e a não-pertinência com os objetivos deste trabalho, entre eles citamos:

• A conversão das Strings que fazem parte da receita das bebidas na classe Receitas e similarmente na classe Ingredientes esta fora do escopo do nosso modelo;

o Funcionamento dos sensores: será tratado como uma caixa preta da qual será apenas reportada suas interfaces com o sistema;

o Acesso a Internet: para a apresentação de conteúdos dinâmicos no visor da máquina, é necessário que esta tenha acesso a rede, no entanto não trataremos como isto é feito;

o Misturador: Os mecanismos do processo de preparação de bebidas serão tratados como caixa preta;

o Dinheiro: Não foi considerado uso de moedas ou notas; o Quantidades de ingredientes: Não foi criada a possibilidade do repositor

ajustar quantidades de ingredientes como água, pó, etc;

37

o Configuração da máquina: será abordada de modo superficial, mostrando a sequência de passos sem entrar no detalho de como exatamente será feito;

4 CONCLUSÃO A utilização da linguagem UML torna mais transparente o processo de desenvolvimento de sistemas. Através dela consegue-se especificar de forma visual os requisitos expostos pelo cliente do sistema e deixa claro para equipe de desenvolvimento os problemas que o sistema deve resolver. Embora percebemos que o Diagrama de seqüência, de atividades e o de classe foram recursos importantíssimos para o modelamento deste problema, a ponto de termos construído estes 3 para todos os módulos funcionais, é importante ressaltar que devido a lógica do negócio a máquina de estados é o recurso mais adequado para representar o comportamento sistêmico da Máquina de Café multiproduto.

5 REFERÊNCIAS [Gamma] Design Patterns: Elements of Reusable Object-Oriented Software, Erich Gamma e outros, Addison Wesley, 1995. [Alhir] Learning UML, Sinan Si Alhir, O'Reilly, 2003.