Manual de Uso da FAFOOPS
A seguir listamos todas as características implementadas pela FAFOOPS destacando a forma de utilização dos mesmos. Obviamente que esses recursos da FAFOOPS estão, direta e totalmente, voltados para as características da linguagem formal FOOPS, implicando assim que o uso da FAFOOPS por um engenheiro depende do conhecimento do mesmo com relação a linguagem formal FOOPS. Em vários pontos, a seguir, fazemos referência a número de requisitos que elicitamos para a FAFOOPS e que estão de alguma forma sendo implementados. Todos esses requisitos podem ser encontrados na documentação referente à FAFOOPS.
Na FAFOOPS, existem duas formas distintas, de acessar as funções disponibilizadas: através dos menus, ou através do botões suspensos. Através dos menus, o usuário da FAFOOPS poderá acessar todas as funções da ferramenta. Adicionalmente, os menus, sempre estão visíveis e disponíveis ao especificador, não alterando de forma alguma, mesmo que a FAFOOPS esteja em modos de trabalho diferentes.
Os botões suspensos, por sua vez, possuem características diferentes dos menus. Primeiramente, que seu uso, não tem por objetivo disponibilizar um meio para que o usuário acesse todas as funções da ferramenta, mas sim, criar um mecanismo rápido (sem a necessidade de navegar em menus e sub-menus) e intuitivo (através do uso de ícones) de acessar as principais funções da ferramenta. Na FAFOOPS, os botões suspensos foram utilizados dentro da proposta citada acima, ou seja, disponibilizar um meio de acesso rápido e intuitivo aos principais recursos da ferramenta. Contudo, uma observação fundamental aqui, é que, devido a FAFOOPS fazer uso de vários modos de trabalho diferentes, os botões suspensos da ferramenta não fixos, ou seja, os botões disponibilizados ao especificador, dependem do modo de trabalho que ele esteja utilizando. Ratificando, o que foi dito, temos que quando o usuário estiver no modo de trabalho ``Editor de Módulo'', os botões suspensos apresentados pela ferramenta serão relacionados a este modo de trabalho. O mesmo ocorre para os demais modos de trabalho, ``Diagrama de Módulos'' e ``Diagrama de Classes''. A figura 5.3, destaca, os menus e os botões suspensos da FAFOOPS.
A figura 5.4 apresenta a parte do menu da FAFOOPS destinada para que o usuário possa navegar entre os diferentes modos de trabalhos. É importante destacar estas opções, pois toda a ferramenta é configurada, automaticamente, para trabalhar sobre o modo de trabalho que estiver selecionado.
Nesta seção visamos apresentar todas as funcionalidades existentes na FAFOOPS. Mais do que, simplesmente listar estas funções implementadas, iremos também, simultaneamente, destacar as decisões de desenho que tangenciaram cada uma dessas funções e relacionar as mesmas aos requisitos elicitados por nós para a FAFOOPS. Todas as decisões de desenho, que implicaram na não implementação de recursos para a FAFOOPS, ou mesmo, implicaram na implementação parcial dos mesmos, serão discutidos separadamente, na próxima seção, desta página.
A FAFOOPS implementa a noção de projetos, como definido no requisito R1. Sendo assim, a FAFOOPS permite que seus usuários possam trabalhar na especificação de diversos sistemas diferentes, bastando, para isto, criar um projeto independente para cada um desses sistemas. Desta forma, sempre que for necessário trabalhar sobre um dado sistema, basta que o projeto correspondente ao mesmo seja aberto.
Existem várias funções distintas, disponibilizadas pela FAFOOPS, que o usuário pode utilizar no contexto de projetos. Elas são: criar um novo projeto, abrir um projeto existente, salvar um projeto, fechar o projeto aberto para liberar a ferramenta para que outro projeto possa ser editado, visualizar e editar propriedades do projeto, criar um novo projeto a partir de um existente (salvar como), realizar um backup automatizado de um projeto e por último excluir um projeto existente.
Por razões de tempo, decidimos por implementar somente as funções associadas a projeto que viabilizassem ao engenheiro utilizar a interface em vários projetos distintos. Desta forma a FAFOOPS está disponibilizando dentre as funções apresentadas em seu menu, as seguintes funções básicas:
Daí, resolvemos definir um recurso que viabilizasse esta comunicação FAFOOPS - FOOPS, mesmo que de forma rudimentar. Este meio de comunicação se dá através da função ``Interação'' apresentada no menu ``Projeto''. Esta função faz uso da janela apresentada na figura 5.5, onde o usuário pode definir quais módulos devem ser submetidos para o FOOPS (Lista de módulos denominada ``Módulos Selecionados'') a partir de uma lista de módulos existentes no projeto atual (denominada ``Módulos Disponíveis''). Um módulo pode ser selecionado para ser submetido através do botão ``Selecionar'', ver figura 5.5. A remoção de um módulo da lista de módulos a serem submetidos ao FOOPS é realizada através do botão ``Remover'' na figura 5.5.
Além de definir quais módulos devem ser submetidos ao FOOPS, através desta janela o especificador pode definir a ordem na qual esses módulos devem ser submetidos, fator este que é muito importante, pois o FOOPS exige que exista um precedência de carga entre os módulos. Esta ordem em que os módulos devem ser submetidos ao FOOPS pode ser alterada por intermédio dos botões ``Subir'' e ``Descer'', apresentados em 5.5. É importante registrar que a ordem de carga desses módulos no FOOPS é de cima para baixo na listagem.
Depois que o usuário definir quais módulos do projeto devem ser submetidos ao FOOPS e em que ordem isso deve ocorrer ele deve clicar no botão salvar, isto fará com que a FAFOOPS gere um arquivo com o nome do projeto e extensão ``.foo'' onde todas essas informações sobre carga dos módulos são armazenadas de uma forma que o FOOPS compreenda. Assim quando o especificador executar o FOOPS e for avaliar a especificação que ele desenvolveu na FAFOOPS basta que ele digite no FOOPS o comando in seguido pelo nome deste arquivo gerado pela FAFOOPS, que desta forma toda a carga dos módulos ocorrerá automaticamente. Obviamente que esta forma de interação com o FOOPS é bastante limitada e portanto é digna de futuras atualizações.
O módulo, para a linguagem FOOPS, é a unidade básica para construção de uma especificação. Ou seja, uma especificação em FOOPS é um conjunto de módulos que no seu total (considerando suas hierarquias e componentes) determinam os requisitos de um sistema.
Sendo assim, para um especificador FOOPS, é fundamental visualizar o sistema através de um diagrama que apresente os módulos e todas as hierarquias existentes entre os mesmos, para que assim ele consiga racionar de forma modular (o que é fundamental para especificar sistemas grandes), direcionando seu raciocínio somente nas propriedades importantes no momento de planejar o sistema como um todo.
Este recurso da FAFOOPS, denominado Diagrama de Módulos, é definido e especificado no nosso requisito R6. Lá discutimos detalhadamente a importância deste Diagrama de Módulos e suas possíveis conseqüências benéficas.
Em [Soc92] é definida uma notação gráfica para visualizar uma especificação FOOPS através dos módulos e teorias que a compõem e das hierarquias existentes entre os mesmos.
A FAFOOPS fez uso desta notação gráfica para apresentar o Diagrama de Módulos. Como pode ser notado na figura 5.6 um módulo ou uma teoria são representados no diagrama através de um retângulo. Logo MES, HORA, DATA e INTERVALOTEMPO são exemplos de módulos na especificação do SAR [Dar92] visualizada na FAFOOPS.
Outra notação gráfica utilizada é a seta tracejada que vai de um módulo A em direção a um outro módulo B. Esta seta indica que o módulo A é importado pelo módulo B. Em nossa figura 5.6 podemos notar que no SAR, o módulo DATA importa o módulo MES, pois para definirmos uma data necessitamos da noção de mês. O mesmo ocorre com o módulo INTERVALOTEMPO (cujo nome na figura 5.6, aparece cortado, devido ao seu comprimento) que especifica que um intervalo de datas é composto por duas datas, uma data inicial que deve ser menor ou igual a uma data final. Obviamente que o módulo INTERVALOTEMPO necessita da especificação de uma data (módulo DATA) para ser definido.
Uma característica que adicionamos à notação listada em [Soc92] é uma pequena descrição que é apresentada no canto inferior direito de cada módulo. Esta descrição é uma indicação de que tipo de módulo ou teoria está sendo representado pelo retângulo. Basicamente na linguagem FOOPS podemos ter: um módulo funcional (fmod), um módulo orientado a objetos (omod), uma teoria funcional (fth) ou uma teoria orienta a objetos (oth). Logo a descrição diz em qual dos quatro tipos listados acima o módulo ou teoria representado pelo retângulo se encaixa. Recorrendo novamente a figura 5.6 podemos notar por exemplo que o módulo INTERVALOTEMPO é um módulo funcional (fmod) enquanto que o módulo REUNIAO é um orientado a objetos (omod). Este recurso, agregado por nos ao diagrama de módulos, foi definido e justificado no requisito R6.6 da FAFOOPS.
Iremos descrever, agora, as funções de nossa ferramenta formal, relacionadas ao Diagrama de Módulos, que foram implementadas. Estas funções são listadas e explicadas detalhadamente abaixo. As funções, definidas nos requisitos da FAFOOPS, mas que não forem descritas abaixo, são funções não implementadas. Adiante, na seção 5.5.4 iremos discutir cada uma delas.
Na figura 5.8, temos a mensagem que a FAFOOPS apresenta para o usuário, logo após ele clicar no segundo módulo, portanto logo em seguida a ele indicar qual é o módulo importado e importador. Repare que, na figura 5.7, nos havíamos selecionado o módulo DATA para ser importado e o módulo PARTICIPANTE como importador. Repare que a figura 5.8 declara exatamente esta situação. Note também que na mensagem são apresentados quatro opções ao especificador: importar o módulo DATA com a diretriz using, ou importar o módulo DATA com a diretriz protecting, ou importar o módulo DATA com a diretriz extending, ou finalmente cancelar a operação de importar o módulo DATA. Estas opções vão de encontro as diferentes formas de importar um módulo disponibilizada pelo FOOPS.
É notável que criar hierarquia entre módulos sem ter que editar códigos de especificações torna o trabalho do usuário da FAFOOPS muito mais interessante. Este recurso adicionado a possibilidade de criar módulos também sem ter que editar especificações permite ao usuário criar toda a estrutura (esqueleto) da especificação de um sistema, sem ter que perder a visão sistêmica da especificação tendo que detalhar o código de cada um dos módulos. Esta é mais uma característica da FAFOOPS que vai de encontro ao requisito R6, referente ao Diagrama de Módulos.
Apesar de a unidade básica para construção de uma especificação FOOPS ser o módulo, esta linguagem apresenta uma propriedade extremamente interessante para o usuário, que é o suporte a orientação à objetos. A OO (orientação a objetos) traz várias vantagens para o especificador, principalmente na forma como pensar e organizar as partes (componentes) do sistema.
A FAFOOPS, como interface do FOOPS, também fornece mecanismos para que o engenheiro possa trabalhar utilizando a OO em suas especificações. Estes mecanismos basicamente giram em torno de um recurso especial da FAFOOPS que é o Diagrama de Classes. Este diagrama é a representação gráfica de todas as classes e subclasses (juntamente com algumas de suas propriedades) definidas na especificação. Disponibilizando assim ao especificador um visão abstrata que se concentra nos aspectos OO e despresa outros elementos da linguagem FOOPS como: módulos, hierarquias entre módulos, sorts, funções, etc.
A seguir, como para o Diagrama de Módulos, iremos descrever todas as funções disponibilizadas pela FAFOOPS para este modo de trabalho. Já podemos adiantar que existem ainda poucas funções e recursos na FAFOOPS que apóiem o seu usuário a pensar e especificar utilizando todo o poder da OO, na seção 5.5.5 iremos falar detalhadamente sobre estas limitações.
Na figura 5.9, temos um exemplo de Diagrama de Classes gerado pela FAFOOPS para o sistema SAR (Apêndice A e [Dar92]). Como é notável na figura, uma classe no diagrama é representada por um retângulo que possui uma barra horizontal em sua parte superior. Acima desta barra temos o nome da classe na qual o retângulo está representando. Abaixo temos uma lista dos atributos definidos na especificação para tal classe. Sendo assim temos que em nosso exemplo Reuniao, Participante, PartImportante, PartComum e PartReuniao são classes. Já, intervalodata, duracao e iniciador, por sua vez, são atributos da classe Reuniao (como pode ser observado abaixo da barra horizontal superior da classe Reuniao).
Adicionalmente temos que as hierarquias entre as classes também são representadas no diagrama. Recorrendo novamente a figura 5.9 podemos verificar a existência de duas setas partindo das classes PartImportante e PartComum e chegando na classe Participante. Elas indicam que ambas as classes PartImportante e PartComum são subclasses da classe Participante. Vale ressaltar as classes PartImportante e PartComum, não fazem parte realmente da especificação formal do SAR, nos criamos as mesmas, temporariamente no SAR, somente para exemplificar o que estamos dizendo aqui.
A notação utilizada acima vai de encontro à notação proposta em [Boo00] que descreve a linguagem para modelagem OO conhecida como UML. Na seção 5.5.5, como já mencionado, iremos enumerar mais propriedades de uma especificação OO que deveriam, mas não são apresentadas na FAFOOPS.
Existem somente três funções vinculadas ao Diagrama de Classes (e, portanto, a gerência das classes e subclasses da especificação) na FAFOOPS. A seguir, iremos enumerá-las e explicá-las detalhadamente.
Como para criar uma classe necessitamos inserir a respectiva codificação no interior da especificação de um módulo, a FAFOOPS foi projetada para sempre assumir o módulo ativo (ou selecionado) para ser o módulo no qual a nova classe será definida. Esta decisão de desenho procura seguir o padrão do FOOPS no qual toda operação que lhe é enviada é aplicada sobre o módulo ativo do FOOPS no momento da requisição.
A FAFOOPS não permite que uma classe seja criada em um módulo funcional, quando este problema ocorrer, a FAFOOPS irá identificar o problema e alertar seu usuário sobre o ocorrido.
E ainda para ajudar o especificador no momento de criar suas classes a FAFOOPS apresenta em seu rodapé sempre o nome do projeto aberto e o nome do módulo ativo no projeto naquele momento. Assim, o usuário sempre poderá saber em qual módulo a nova classe será criada.
Este é o recurso da FAFOOPS do qual o especificador provavelmente mais fará uso. Ele é denominado de Editor de Módulos e tem por objetivo disponibilizar um editor inteligente, que apóie ao máximo o engenheiro, no momento de escrever suas especificações. Esta codificação da especificação é um das tarefas mais lentas e complexas para o especificador. Sua complexidade é proporcional a complexidade das linguagens formais em si, que fazem uso de inúmeras expressões, comandos e regras de sintaxe e semântica para disponibilizar poderes para especificar precisamente os requisitos dos sistemas do mundo real.
Sendo assim, como advogado em R10, é fundamental para o especificador ter um editor integrado com o ambiente de seu método formal e que seja totalmente voltado para apoiar as peculiaridades da linguagem formal que ele utiliza, de forma que ele alcance uma maior facilidade e produtividade em seu trabalho.
A seguir, detalharemos todos os recursos do Editor de Módulos da FAFOOPS, destacando também pontos a serem futuramente desenvolvidos. Um primeira visão do Editor de Módulos da FAFOOPS é apresenta na figura 5.10. Nesta figura temos o editor ativo na FAFOOPS com a especificação do módulo Reuniao do SAR.
Abaixo, segue uma lista das funções disponibilizadas atualmente pela FAFOOPS ao especificador, em se tratando do Editor de Módulos. Algumas destas funções são usuais em qualquer editor de texto, porém, em sua grande maioria, estas funções apóiam o engenheiro a trabalhar especificamente com a linguagem formal FOOPS. No requisito R10, temos a definição de todas as propriedades e funcionalidades correspondente ao Editor de Módulos.
Adicionalmente é importante destacar que esta característica da FAFOOPS também é válida durante a edição da especificação. Sendo assim, ao se terminar de digitar uma palavra no editor, caso esta palavra seja reservada a mesma ficará imediatamente em negrito. Isto traz uma vantagem ao especificador, pois quando ele digitar uma palavra reservada e o editor não a coloca-la em negrito, então temos a indicação de um erro de digitação (sintaxe).
Por exemplo, sempre que desejamos criar um sort temos que digitar a palavra sort seguida pelo nome desejado para o sort e por um ponto final ``.''. Já com estas funções, basta que o especificador tecle CTRL + S simultaneamente para que a expressão-padrão do FOOPS para criação de um sort seja inserida na especificação e o cursor fique posicionado no ponto ideal para digitação do nome do mesmo.
Na figura 5.11, temos a relação completa de todas as teclas de atalho do editor com o respectivo tipo de elemento que será criado na especificação caso a mesma seja pressionada. A janela apresentada na figura 5.11 pode sempre ser consultada pelo especificador através do subitem de menu ``Inserir Especificação'' do item de menu ``Editor''.
A figura 5.12 apresenta exatamente esta tela. Assim que o especificador terminar de selecionar os dados que ele deseja basta que ele pressione ENTER para que esta tela se feche e o respectivo comando de importação seja criado na especificação.
Nesta seção visamos apresentar diversas decisões de desenho que tomamos com relação a FAFOOPS. Com algumas exceções, como o próximo item listado abaixo, que discute decisões relacionadas a linguagem de programação e plataforma, todos os demais itens, nesta seção, estão voltados principalmente para um caminho. Este caminho é, discutir decisões de projeto, que de alguma forma conduziram a não implementação, ou mesmo implementação parcial, de funções especificadas através dos requisitos elicitados para a FAFOOPS. Com isto, deixaremos claro ao leitor, os pontos desta ferramenta que necessitam de serem desenvolvidos ou melhorados. Vale ressaltar que, todas essas decisões de desenho, que limitaram a funcionalidade da FAFOOPS, foram tomadas principalmente em decorrência da falta de tempo.
FAFOOPS foi desenvolvida utilizando a linguagem Java (SDK 2.0 - JFC/Swing). A opção pela linguagem Java foi, primeiramente, de encontro à possibilidade de implementação da FAFOOPS em uma arquitetura cliente-servidor que, viabilizasse o seu uso em estações clientes Windows, Linux, e assim por diante, tornando, desta forma, a ferramenta totalmente multiplataforma - do lado cliente - e também multiusuária (Com Java poderíamos desenvolver tanto o lado cliente quanto o lado servidor da ferramenta, utilizando a mesma linguagem de programação).
Outro ponto que nos conduziu para a linguagem Java foi a intenção de implementar a FAFOOPS para trabalhar em ambiente Web, dado que existem vários recursos que Java disponibiliza para aplicações Web, como Applets, Sevlets, JSP, dentre outros. Assim, o especificador poderia trabalhar em um browser e especificar seus sistemas com todos os benefícios agregados à Internet. Esta opção de implementação chegou a ser inicialmente implementada por nós, entretanto, nós desistimos desta abordagem, pois atualmente a criação de GUI's (Interfaces Gráficas com o Usuário) com as propriedades que a FAFOOPS exige é bastante limitada em um ambiente como o da Internet.
A FAFOOPS, na forma como se encontra - uma aplicação que trabalha em conjunto com FOOPS em uma única estação de trabalho (monousuária) - está preparada para ser atualizada para implementar uma arquitetura cliente-servidor que viabilize à mesma ser totalmente multiplataforma e multiusuária.
Como mencionado na introdução desta página, muitas das decisões de desenhos que tomamos não são definitivas, em decorrência da pouca disponibilidade de tempo. Uma das principais decisões dentre essas, diz respeito à forma como a FAFOOPS interage com o FOOPS. Foi definido como um requisito da FAFOOPS (R4) que ela deveria implementar toda a interação com o FOOPS de forma automática e transparente, de forma a garantir que o usuário não tivesse a percepção de que o FOOPS e a FAFOOPS são ambientes distintos. Contudo durante o desenho da interface decidimos por não implementar esta interação, adotando um abordagem não definitiva, onde a FAFOOPS ficou independente do FOOPS, permitindo que o especificador gere suas especificações em um ambiente gráfico mas que no momento de validar e verificar suas especificações ele tenha que recorrer ao FOOPS por conta própria, submetendo ao mesmo os textos de especificação gerados no FAFOOPS. Em 5.4.1 detalhamos a função ``Interagir FOOPS'' que é uma função paliativa que apóia o especificador no momento de submeter as suas especificações desenvolvidas no FAFOOPS para o FOOPS.
Sendo assim além da possibilidade de um módulo (ou teoria) importar outro (através da diretriz using, extending e protecting), existem as seguintes outras formas de relacionamento:
As três últimas formas de relacionamento descritas acima não são representadas atualmente no diagrama de módulos, apesar da importância das mesmas no momento de construir e compreender especificações FOOPS completamente. Por conseguinte, estes são recursos que terão que ser adicionados nas próximas versões da FAFOOPS. O requisito R6.3, declara exatamente esta questão para a FAFOOPS.
Vamos enumerar agora algumas derivações do requisito correspondente ao Editor do Módulo (requisito R10) que não foram implementadas. Sempre lembrando que o fator tempo foi responsável por estas decisões.