Título: Desenvolvimento de geradores de aplicação configuráveis por linguagens de padrões Aluno: Edison Kicho Shimabukuro Junior Orientador: Prof. Dr. Paulo Cesar Masiero Co-Orientadora: Prof a. Dr. Rosana T. Vaccare Braga Nível: Mestrado Programa de pós-graduação: Programa de Pós-Graduação em Ciências de Computação e Matemática Computacional - Universidade de São Paulo Email de contato do aluno: kicho@icmc.usp.br Email de contato do(s) masiero@icmc.usp.br orientador(es): rtvb@icmc.usp.br Ano de ingresso no programa: 2004 Época prevista de conclusão: 03/2006 Data da aprovação da 23/03/2005 proposta de dissertação: Table 1. Dados do trabalho Resumo. A engenharia de software de linhas de produtos almeja o aumento da produtividade e a construção de diversos sistemas em um domínio particular. Os riscos associados à implementação de uma linha de produtos podem aumentar em função do custo e da complexidade da construção dos artefatos necessários na linha de produtos. Um dos artefatos produzidos na linha de produtos são os geradores de aplicação. Essas ferramentas são implementadas em uma das últimas etapas do processo de desenvolvimento de uma família de produtos e normalmente são construídas de forma específica, ou seja, elas não podem ser reutilizadas em outros domínios sem modificações em sua estrutura interna. Este trabalho apresenta um gerador de aplicação baseado em linguagem de padrões configurável, ou seja, um gerador de aplicações que pode ser especializado por meio de uma linguagem de padrões, sem necessidade de recompilação, para diversos domínios diferentes. Com essa abordagem, um gerador de aplicação pode ser reutilizado em linhas de produtos distintas, possibilitando o aumento da produtividade em diversas fases do processo de desenvolvimento, tais como: codificação, documentação e testes, sem os custos encontrados no desenvolvimento de geradores de aplicação específicos. Palavras-chave: Engenharia de Software de Linhas de Produtos, Geradores de Aplicação, Padrões de Software, Linguagens de Padrões.
Geradores de aplicação configuráveis por linguagens de padrões Edison K. Shimabukuro Jr 1, Rosana T. Vaccare Braga 1, Paulo Cesar Masiero 1 1 Instituto de Ciências Matemáticas e de Computação Universidade de São Paulo (USP) Caixa Postal 668 13.560-970 São Carlos SP Brazil 1. Introdução {kicho,rtvb,masiero}@icmc.usp.br A indústria de software tem como uma de suas principais metas a construção de sistemas de alta qualidade e baixo custo. Nesse ambiente de alta competitividade, diversos sistemas são desenvolvidos para suprir as necessidades do mercado. Dentre esses sistemas, muitos apresentam mais similaridades do que diferenças [Greenfield and Short 2004]. Mesmo com a demanda por produtos similares, o processo usual adotado pelas organizações é a produção de aplicações individuais para posterior desenvolvimento de variações do mesmo sistema. Embora esta seja uma solução que atinja o seu objetivo, esta abordagem apresenta a necessidade de grandes investimentos em projeto, codificação e testes em todos os sistemas construídos [Weiss and Lai 1999, Greenfield and Short 2004, Czarnecki and Eisenercker 2002]. A engenharia de software de linhas de produtos pode ser utilizada para responder a essa demanda por produtos similares, apoiando a configuração e montagem de componentes, integração e automação do processo de produção, desenvolvimento de ferramentas que configuram e automatizam tarefas repetitivas e padronização de processos [Greenfield and Short 2004, Weiss and Lai 1999]. Com essas técnicas, uma organização pode atingir níveis mais elevados de produtividade e construir sistemas sob demanda de forma mais eficaz. O desenvolvimento de geradores de aplicação normalmente é realizado em uma das últimas etapas do processo de implementação de uma linha de produtos. Essas ferramentas são construídas com o objetivo de automatizar a implementação de artefatos de software, tais como: código fonte, documentação e casos de testes. Os principais problemas com a utilização dessas ferramentas são a complexidade do seu desenvolvimento e o seu alto acoplamento com os artefatos da linha de produtos, ou seja, elas são específicas para uma linha de produtos. Essas características fazem com que essas ferramentas sejam caras de desenvolver e pouco reutilizáveis por linhas de produtos diferentes. Este trabalho apresenta um gerador de aplicação baseado em linguagem de padrões configurável para um domínio específico. Esse gerador de aplicação pode ser configurado, sem a necessidade de recompilação, para realizar a transformação de uma especificação de entrada em artefatos de software. Essa ferramenta pode ser reutilizada em linhas de produtos diferentes, fornecendo apoio para a geração de artefatos e apresentando um baixo custo no processo de configuração em relação à abordagem tradicional de desenvolvimento de geradores de aplicação específicos. Este trabalho está organizado da seguinte maneira: Na Seção 2 é apresentada a fundamentação teórica deste trabalho. Na Seção 3 é apresentada a arquitetura e o pro-
cesso de configuração e utilização de um gerador de aplicação baseado em linguagens de padrões configurável. Finalmente, na Seção 4 são apresentadas as considerações finais deste trabalho. 2. Fundamentação Teórica Os principais assuntos abordados neste trabalho são padrões e linguagens de padrões de software, geradores de aplicação, componentes, frameworks e linhas de produtos. A seguir são apresentados os principais conceitos relacionados com padrões, linguagens de padrões e geradores de aplicação. 2.1. Padrões e Linguagens de Padrões Construir software não é uma tarefa fácil. Desenvolvedores experientes possuem maior facilidade na atividade de construção de software por possuírem conhecimento de soluções recorrentes que podem ser aplicadas em diversas situações similares. Tais soluções podem ser documentadas adequadamente no formato de padrões. Um padrão pode ser visto como a descrição de uma solução de um problema recorrente em um determinado ambiente para facilitar a sua utilização diversas vezes, sem no entanto, implementar a solução da mesma forma duas vezes [Alexander 1979]. Na engenharia de software, padrões encapsulam as melhores soluções baseadas em anos de desenvolvimento de aplicações, observação e experiência. Para encontrar a melhor solução, o desenvolvedor deve entender o problema, o contexto e as forças que governam esse problema [Harrison et al. 1999]. Dessa forma, os padrões ajudam na construção de sistemas confiáveis, seguindo os passos de outras construções de sistemas de sucesso [Harrison et al. 1999]. Nenhum padrão é uma entidade isolada e cada padrão é apoiado por outros padrões [Alexander 1979]. Uma linguagem de padrões é um conjunto de padrões, e os relacionamentos entre esses padrões são utilizados sistematicamente para resolver problemas. Uma linguagem de padrões fornece sugestões sobre como os padrões podem ser combinados para a solução de problemas específicos. Essas sugestões descrevem o processo de aplicação dos padrões, ou apenas definem restrições que a aplicação possui, como por exemplo, a ordem na qual os padrões devem ser aplicados [Greenfield and Short 2004]. 2.2. Geradores de aplicação O termo gerador de aplicação pode assumir diferentes significados, tais como: compiladores, pré-processadores, meta-funções que geram classes e procedimentos, wizards e geradores de código [Czarnecki and Eisenercker 2002]. Por exemplo, um wizard é um programa gráfico que recebe uma especificação em alto nível de abstração e a transforma em artefatos de software. Algumas ferramentas CASE (do inglês Computer Aided Software Engineering) geram uma parte do código de uma aplicação, utilizando como entrada diagramas e especificações que são inseridos na ferramenta pelo engenheiro de aplicação. Os compiladores são geradores de código, uma vez que recebem uma informação em um certo nível de abstração, tais como a linguagem Java ou C++, e transformam essa informação em uma linguagem de mais baixo nível, tais como código objeto, bytecode ou código de máquina [Czarnecki and Eisenercker 2002].
De maneira geral, o conceito de gerador de aplicação que será utilizado neste trabalho assume o significado de uma ferramenta que realiza as seguintes tarefas [Czarnecki and Eisenercker 2002]: valida a especificação de entrada e relata erros ou avisos de inconsistências, completa a especificação utilizando as configurações padrões, realiza otimizações e gera a implementação. Os geradores de aplicação podem ser baseados em uma linguagem de padrões. Geradores de aplicação baseados em linguagens de padrões são ferramentas que possuem o fluxo de execução baseado em uma linguagem de padrões [Braga and Masiero 2003]. O fluxo de execução dessas ferramentas conduz o engenheiro de aplicação por uma seqüência de etapas. Em cada etapa, a ferramenta fornece meios para o engenheiro de aplicações inserir informação sobre um padrão. No fim da execução dessa seqüência de etapas, a ferramenta possui as informações sobre todos os padrões aplicados e assim, ela pode utilizar essas informações para gerar artefatos de software. 3. Geradores de aplicação configuráveis por linguagens de padrões Como foi apresentado na Seção 1, quando se desenvolvem geradores de aplicação de forma específica, eles se tornam caros e, muitas vezes, o risco associado ao seu desenvolvimento dificulta ou impossibilita sua construção e utilização. A principal motivação para a construção de um gerador de aplicação configurável baseado em linguagens de padrões é evitar os custos do desenvolvimento de geradores de aplicações específicos e facilitar a sua modificação para a geração de diferentes artefatos durante o processo de desenvolvimento e manutenção de software. O ciclo de vida de um gerador de aplicação configurável (Figura 1) apresenta três fases: a fase de desenvolvimento, a fase de configuração e a fase de utilização. Na fase de desenvolvimento o gerador de aplicação configurável é projetado e implementado; na fase de configuração ele é especializado por um engenheiro de domínio para uma instância de um gerador de aplicação específico; na terceira fase, o gerador de aplicação especializado é utilizado por um engenheiro de aplicação para a geração de artefatos de aplicações específicas. Para que um gerador de aplicação baseado em linguagem de padrões tenha a capacidade de gerar artefatos para diferentes aplicações sem a necessidade de recompilação, ele deve ser configurado de acordo com as características da linguagem de padrões e dos artefatos de software que implementam as aplicações, tais como o código fonte necessário para realizar a composição de componentes ou instanciações de um framework, implementação de casos de testes específicos e geração de documentos específicos, tais como documentos de requisitos de usuário e documentos da UML [Booch et al. 2000]. Como ilustrado na Figura 2, para configurar o gerador de aplicação deve-se inserir na ferramenta o meta-modelo da linguagem de padrões e os templates dos artefatos de software. O meta-modelo da linguagem de padrões especifica quais padrões a ferramenta deve apresentar para o engenheiro de aplicação, quais são os relacionamentos e dependências entre os padrões e quais são os dados que a ferramenta deve coletar de cada padrão. Os templates são documentos de texto que representam o corpo dos artefatos que devem ser gerados, tais como código-fonte e casos de teste. Eles possuem marcações especiais que devem ser substituídas por dados provenientes da entrada do usuário para a obtenção dos diferentes arquivos de saída produzidos pelo gerador de aplicações.
Figure 1. Ciclo de vida de um gerador configurável Figure 2. Configuração do gerador de aplicação configurável Após o processo de configuração, o gerador de aplicação estará pronto para produzir artefatos de software com base na especificação de entrada fornecida pelo engenheiro de aplicação e assim oferecer apoio a linhas de produtos diferentes. 4. Considerações Finais Existem na literatura diversas abordagens para a construção de geradores de aplicação. Essas abordagens permitem a construção de geradores de aplicação que podem ser utilizados em domínios específicos, tais como o gerador MOmoC [Bichler 2003] e o gerador específico de domínio P3 [Batory et al. ]. Braga (2003) desenvolveu um gerador de aplicação específico baseado na linguagem de padrões GRN [Braga et al. 1999], denominado GREN-Wizard [Braga and Masiero 2003], que é utilizado para a instanciação do framework GREN [Braga 2003]. Após a conclusão desse trabalho, a autora propôs a construção de um Wizard genérico que pudesse ser utilizado para a instanciação de diversos pares de linguagens de padrões e frameworks. Este trabalho se caracteriza pela extensão dessa proposta, visando o desenvolvimento de um gerador de aplicação configurável por linguagens de padrões para a instanciação de frameworks e geração de outros
artefatos de software, tais como documentos UML, documentos de usuário, casos de testes e código fonte. Com a abordagem proposta neste trabalho, pretende-se diminuir a curva de investimento necessária para o desenvolvimento e utilização de geradores de aplicação em linhas de produtos diferentes. Essa diminuição será obtida pela substituição da fase de desenvolvimento de geradores de aplicação em linhas de produtos diferentes pela configuração de um gerador de aplicação configurável para atender às necessidades de cada linha de produtos. Para realizar essa tarefa, é necessário codificar um gerador de aplicações configurável e definir o seu processo de desenvolvimento, configuração e utilização. Atualmente já existe um protótipo dessa ferramenta e o processo de desenvolvimento está em fase de implementação. A ferramenta será utilizada na instanciação do framework GREN associado com a linguagem de padrões GRN [Braga et al. 1999] e mais um estudo de caso que utilizará composição de componentes para a construção de uma aplicação específica. Os principais resultados que serão observados na validação serão: o esforço necessário para que o engenheiro de domínio configure o gerador, a flexibilidade e extensibilidade da ferramenta, e a qualidade dos artefatos gerados. References Alexander, C. (1979). The Timeless Way of Building. Oxford University Press. Batory, D., Chen, G., Robertson, E., and Wang, T. Design wizards and visual programming environments for genvoca generators. IEEE Trans. Softw. Eng. Bichler, L. (2003). OOPSLA. A flexible code generator for mof-based modeling languages. Booch, G., Rumbaugh, J., and Jacobson, I. (2000). The Unified Modeling Language User Guide. Addison-Wesley. Braga, R. T. V. (2003). Um Processo para Construção e Instanciação de Frameworks baseados em uma Linguagem de Padrões para um Domínio Específico. PhD thesis, Instituto de Ciências Matemáticas e de Computação, Universidade de São Paulo. Braga, R. T. V., Germano, F. S. R., and Masiero, P. C. (1999). A pattern language for business resource management. In Proceedings of the 6th Annual Conference on Pattern Languages of Programs, Monticello, Illinois, EUA, volume 7, pages 1 33. Braga, R. T. V. and Masiero, P. C. (2003). Building a wizard for framework instantiation based on a pattern language. 9th International Conference on Object-Oriented Information Systems (OOIS 03), Genebra, Suiça. Lecture Notes on Computer Science, pages 95 106. Czarnecki, K. and Eisenercker, U. W. (2002). Generative Programming. Addison-Wesley. Greenfield, J. and Short, K. (2004). Software Factories - Assembling Applications with Patterns, Models, Frameworks, and Tools. Wiley Publishing, Inc. Harrison, N., Foote, B., and Rohnert, H. (1999). Pattern Languages of Program Design 4. Addison-Wesley. Weiss, D. M. and Lai, C. T. R. (1999). Software Product-Line Engineering. Addison- Wesley.