4.4 MODELAGEM DO SOFTWARE
4.3.1 Diagrama de Casos de Uso
O diagrama de casos de uso aqui apresentado tem como objetivo descrever o contexto de uso do programa, bem como seu comportamento geral e foi elaborado seguindo as especificações do Item 2.3.2. A Figura 21 mostra o diagrama de casos de uso do OA RAX. O ator envolvido é o usuário, que pode ser o estudante, ou qualquer outra pessoa. O usuário deverá interagir diretamente com o software e o sistema executará tarefas mediante a solicitação do ator usuário. Inicialmente, o usuário deverá escolher alguma opção do menu principal. As opções serão: “Clique aqui para começar!”, obter ajuda, e obter informações sobre o programa. Os casos de uso são especificados a seguir:
Ver aplicação prática dos Raios-X: Assim que o usuário escolher a opção “Clique aqui para começar!”, no menu inicial, será exibida a tela com ilustração de uma aplicação prática dos Raios-X.
Escolher as explicações que deseja ver: Na tela de aplicação, o usuário deverá clicar em cima dos botões espalhados ao longo da tela, para obter explicações, passo a passo, de como o exame de Raio-X é realizado. Devem ser exibidas caixas de diálogo ao lado de cada botão correspondente.
Ir para a tela com simulação do Tubo de Raios-X: assim que o usuário escolher a opção “Clique Aqui!” será direcionado a tela de exemplificação do exame de Raios-X.
Alterar os parâmetros da simulação: na tela da simulação, o usuário deverá alterar os parâmetros da simulação para que esta seja iniciada. O sistema deverá calcular os parâmetros de saída sempre que houver alteração nos parâmetros de entrada. O sistema também deverá alterar o comportamento dos objetos da simulação sempre que os parâmetros de entrada forem alterados.
Obter Ajuda: Sempre que o usuário escolher a opção “Ajuda” no menu inicial, a tela com instruções de uso do sistema deve ser aberta.
Obter Informações: Sempre que o usuário escolher a opção “Sobre” no menu inicial, a tela com instruções sobre o sistema deve ser aberta.
Figura 21 Diagrama de casos de uso para o OA RAX.
4.3.2 Diagrama de Classes
O diagrama de classes do software foi elaborado considerando o conjunto de requisitos do sistema e seguindo as especificações do Item 2.3.3. Como o OA RAX é uma simulação, foi necessária uma atenção especial na parte responsável por criar os componentes gráficos. exibi-los e controlá-los ao longo da execução do software, de acordo com os valores de entrada dos parâmetros alterados pelos usuários. Considerando a natureza do software e o uso do Java 2D, identificamos a necessidade de classes para as seguintes operações:
Carregar imagens e associá-las a sprites, que podem ter uma única imagem ou um conjunto de imagens.
Exibir sprites, escolhendo uma de suas imagens associadas, em uma determinada posição da tela.
Oferecer objetos de cena compostos por um Sprite e tendo um comportamento associado de acordo com as ações do usuário no sistema.
Criar telas que contenham um conjunto de objetos de cena e sejam atualizadas a cada instante, pintando novos componentes ou repintando os componentes já existentes de acordo com seus estados atualizados, a fim de criar animações e elementos com comportamento dinâmico.
Realizar os cálculos e repassá-los a todas as entidades que precisem desses resultados para atualizar o próprio comportamento.
Gerenciar a criação e exibição de telas, criando um fluxo de navegação entre elas.
Com base nas operações listadas, foram modeladas 20 classes cujos atributos, operações e relacionamentos são ilustrados no diagrama de classes da Figura 22. Essas classes podem ser agrupadas do seguinte modo:
BaseGrafica: composta pela interface imprimível, que é implementada pelas classes Background e Sprite, que são generalizadas pelas classes Sprite_Animado e Background_Imagem. Essas classes oferecem toda a base para a criação de componentes impressos na tela em uma dada posição.
Componentes: composto pela classe Objeto_cena e demais classes que generalizam ela. A classe Objeto_Cena, que é responsável por criar objetos com
um comportamento associado, que é implementado através do método update. As demais classes desse conjunjo são Botao, Turbina, Eletrons e OndaRaioX. Elas sobrescrevem o método update e implementam métodos auxiliares a fim de apresentar um comportamento específico a cada atualização de tela.
Modelo: composto apenas pela classe Calculos, que é responsável por calcular as grandezas descritas na Tabela 2, do Item 4.2.
View: composto pelas classes Tela e PainelControleSimulacao e TuboRaioX, que extendem a classe padrão JPanel do Swing. As classes TelaMaquinaRaioX, TelaSobre, TelaMen e TelaAjuda, que também estão nesse grupo, são generalizações da classe Tela. E a classe JanelaPrincipal é uma extensão da classe JFrame do Swing.
A arquitetura de desenvolvimento do OA RAX, que é descrita no diagrama de classes, se baseia no padrão arquitetura para desenvolvimento de software Model-view- controller (MVC), que prega a separação entre a lógica da aplicação, e a lógica de apresentação, através de um sistema de três camadas: camada de visualização, camada de controle e a camada lógica da aplicação (MARTINS 2009). A Camada lógica da aplicação, conhecida por Model, é responsável pela geração, manipulação e armazenamento dos dados. A Camada de apresentação, chamada de View, é basicamente a interface gráfica do programa (MARTINS 2009). A camada de controle, chamada Controller, é camada intermediária entre a camada de apresentação e a lógica.
Fonte: próprio autor.
5 CODIFICAÇÃO DO OA RAX
Nesta seção serão feitas algumas considerações sobre o código do OA RAX a fim de explicar a lógica empregada. O código segue as especificações do modelo de classes e as classes desenvolvidas estão divididas em cinco pacotes de acordo com suas funcionalidades, conforme foi definido no Item 4.3.2: BaseGrafica, Componentes, Modelo, OARAX, e view. Há ainda um pacote, chamado imagens, que contém as imagens utilizadas no programa.
A classe Controlador, no pacote OARAX, tem as funções de criar as telas do sistema, gerenciar o fluxo de navegação entre elas e fazer interface entre a tela da simulação e a classe Calculos, responsável por fazer os cálculos necessários para a simulação. Esta classe possui como atributos uma instância da classe Calculos e instâncias das seguintes classes:
JanelaPrincipal: é a classe que implementa a janela do sistema. Como o sistema possui apenas uma janela, ela é instanciada apenas uma vez. Essa classe é uma extensão do JFrame, classe padrão do Swing, que é a moldura da janela aberta no sistema operacional.
TelaMenu: é a classe que implementa o JPanel responsável por agrupar, exibir e atualizar os componentes da tela inicial do OA RAX.
TelaAjuda: é a classe que implementa o JPanel responsável por agrupar, exibir e atualizar os componentes da tela de Ajuda do OA.
TelaSobre: é a classe que implementa o JPanel responsável por agrupar, exibir e atualizar os componentes da tela com informações sobre o OA RAX e seus autores.
TelaMaquinaRaioX: é a classe que implementa o JPanel responsável por agrupar, exibir e atualizar os componentes da tela que mostra uma aplicação prática dos Raios-X através da ilustração de um exame de Raios-X.
ControladorTuboRaioX: é a classe que controla e atualiza o JPanel TuboRaioX, responsável por agrupar e exibir os componentes que simulam o tubo de Raios- X na tela com a simulação da produção dos Raios-X.
PainelControleSimulacao: é a classe que implementa o JPanel responsável por agrupar, exibir os parâmetros de entrada da simulação e atualizar os valores de saída, na tela da simulação da produção dos Raios-X.
As classes que representam as telas são JPanels pois, no Swing, para exibirmos vários componentes organizadamente, é preciso usar um painel para agrupar esses componentes, que é o JPanel (DEITEL; DEITEL 2010). A classe PainelControleSimulacao foi criada de maneira automatizada através da ferramenta do Swing no NETBeans IDE. As demais telas da lista acima que implementam JPanels herdam da classe Tela e possuem como atributos um conjunto de imagens de background e um conjunto de objetos da classe Objeto_Cena, que implementa os componentes da tela. Os métodos dessas classes são o método paint, mouseClicked, e mouseMoved, esses dois últimos são responsáveis por iniciar ações que ocorrem quando o mouse é clicado e movido na tela respectivamente, e possuem implementações próprias em cada uma dessas classes. O método paint é padrão de componentes de interface gráfica do Java2D, e foi reescrito conforme pode ser visto na Figura 23. Na Parte 1, uma cópia da lista de imagens de background, denominada backgroundList, é criada para cada componente, e se essa lista contiver objetos, então, ela será percorrida e cada objeto encontrado será impresso na tela. Na Parte 2, uma cópia da lista de Objetos_Cena, denominada gameObjectList, é criada para cada componente, e se essa lista contiver objetos, então, ela será percorrida e cada objeto encontrado terá seu estado atualizado, chamando o método update deste objeto, e será impresso na tela.
Fonte: próprio autor.
A classe Controlador gerencia o fluxo entre as telas através do método abrirTela que recebe como parâmetro, um valor numérico inteiro, denominado opcaoEscolhida, que pode assumir qualquer valor de 1 a 5, e cada dos seus valores corresponde a uma solicitação para abrir uma tela do sistema. Antes de chamar a tela solicitada é necessário retirar a tela que está sendo exibida da janela do sistema, para isso é utilizada uma variável, denominada opcaoAnterior, que guarda o número correspondente à esta tela. Um exemplo desse processo é se o usuário estiver na tela com informações sobre o OA RAX, cujo número associado é 4, e pressionar o botão que retorna ao menu, cujo número associado é 1, então o método abrirTela do Controlador será chamado recebendo como parâmetro o valor 1, e como opcaoAnterior será igual a 4, o objeto telaSobre será retirado da janela do sistema e em seguida será criada uma nova instância desse objeto para quando o usuário resolver voltar a esta mesma tela. Na Figura 24 são mostrados os comandos necessários para este processo.
Fonte: próprio autor.
Fonte: próprio autor.
Continuando o exemplo anterior, para exibir a tela do menu principal é chamado o método carregarMenu, em seguida, a telaPrincipal, que é adicionada à janela do sistema, e a variável opcaoAnterior passa a ter o valor associado a tela do menu principal, conforme é mostrado na Figura 25. O método carregarMenu tem a função de instanciar o background e todos os componentes da tela principal, conforme pode ser visto na Figura 26. Para criar um background para a tela é necessário criar uma instância da classe Background_Imagem, associar uma imagem (sprite) a esse background e adicioná-lo à lista de backgrounds da tela. Para criar um objeto de cena o primeiro passo é criar o sprite que será associado a ele, o que é feito criando uma
Figura 24 Remoção de uma tela da janela principal do sistema.
instância da classe SpriteAnimated e associando a esse sprite uma imagem. Para controlar possíveis erros no carregamento da imagem que servirá de sprite, a parte do código responsável pelo carregamento dessa imagem é adicionado em um try catch, que é uma operação comum em Java utilizada para tratar uma exceção, que representa uma situação que normalmente não ocorre e representa algo de inesperado no sistema (DEITEL; DEITEL 2010). A classe SpriteAnimated possui um método chamado carregarSprite que recebe como parâmetro o caminho do arquivo de imagem que será carregado, a quantidade de colunas e linhas que essa imagem deve ser dividida caso o sprite possua algum efeito de animação. A quantidade de seções da imagem do sprite que deve ser considerada no momento da animação é informada através do método animate. O processo de criação de objetos de cena se repete para cada objeto que se deseja apresentar na tela e é análogo para todas as telas do sistema.
Fonte: próprio autor.
A tela da simulação é um pouco mais complexa que as demais, pois é composta por dois JPanels diferentes, um para gerenciar a parte da tela onde o usuário seleciona os valores para os parâmetros visualizando os resultados dos respectivos cálculos, PainelControleSimulacao, e outro JPanel apresenta a animação da produção dos Raios- X, TuboRaioX. Esses dois painéis não se comunicam diretamente. Toda vez que o usuário altera os valores dos parâmetros voltagem aplicada ao cátodo e voltagem aplicada ao elétron, os métodos do Controlador calcularVariaveisEletron e
calcularIntensidadeCorrente são acionados e retornam os valores dos cálculos correspondentes.
A animação da simulação, que é implementada no JPanel TuboRaioX, é gerenciada pela classe ControladorTuboRaioX que funciona como um controlador específico para a animação devido a sua complexidade. Assim, o Controlador não interage diretamente com o JPanel da animação da simulação mas com o seu controlador, diferentemente do que é seguido para as demais telas. A classe ControladorTuboRaioX utiliza o conceito de thread, que é um recurso muito utilizado em Java quando se deseja executar duas coisas em paralelo (DEITEL; DEITEL 2010). O uso de um controlador específico para a animação da simulação através da implementação de thread garante que essa parte do programa seja executada em um fluxo paralelo, evitando que o programa trave as demais funcionalidades da própria simulação. Para utilizar trheads na classe ControladorTuboRaioX foi preciso que ela generalizasse a classe Thread, que é padrão do Java, e sobrescrevesse seu método run, que deve conter as ações a serem executadas no fluxo paralelo. A Figura 27 mostra a implementação do método run e do método iniciarSimulação que é chamado a partir dele. No método iniciarSimulacao é criado um contador para atualizar o JPanel TuboRaioX a cada 50 milisegundos. Esse processo de atualização só é parado caso o usuário clique no botão que retorna a tela principal. Quando isso acontece, o Controlador solicita a interrupção da thread e é chamado o método System.out.flush, que libera os recursos do sistema alocados.
Fonte: próprio autor
Outro ponto da implementação que vale a pena ser comentado é a classe Calculos, responsável por realizar os cálculos necessários. Essa classe possui todas as variáveis correspondentes às listadas na modelagem teórica da simulação, no Item 4.2. Além disso, há um método específico para cada grandeza que se deseja calcular e um método chamado exponenciar, responsável por tratar os resultados obtidos a fim de garantir a legibilidade dos mesmos. Para facilitar as operações realizadas, cada uma das variáveis passa a ser expressa como um vetor de duas posições, onde a primeira posição armazena o valor calculado e a segunda posição o expoente necessário para representação da grandeza em notação científica. O cálculo da Energia cinética do elétron incidente 𝐾, cuja formulação é expressa na Tabela 3, é implementado no método energiaCineticaEletronIncidente, que é mostrado na Figura 28. Na sequência que pode ser vista nessa figura, o cálculo só é realizado se o valor da voltagem aplicada ao elétron que é representado pela variável Vi for diferente de zero. Como 𝐾 = 𝑉 × 1,6 × 10−19 , na primeira posição de K é calculado 𝑉 × 1,6 e na segunda posição é passada o expoente da representação. Em seguida é chamado o método exponenciar, cuja implementação pode ser vista na Figura 29. Esse método recebe como parâmetro um vetor e se o valor da primeira posição desse vetor for menor que 1 e diferente de infinito, enquanto o resultado nessa posição do vetor for menor que 1 ele será multiplicado por 10 e o valor da segunda posição do vetor será acrescido de -1. Se o valor da primeira posição desse vetor for maior que 10, enquanto o resultado for maior que 10 ele será dividido por 10 e o valor da segunda posição do vetor será acrescido de +1.
Fonte: próprio autor.
Fonte: próprio autor.
6 VERIFICAÇÃO E VALIDAÇÃO DO OA RAX
As seções a seguir se destinam a apresentar os testes realizados para verificação do OA RAX e o processo de validação realizado através da avaliação do professor coautor e da pesquisa de campo realizada.