Suporte ao Desenvolvimento e Uso de Componentes Flexíveis Ricardo Pereira e Silva Eng., M.Sc. Universidade Federal de Santa Catarina – Depto. de Infomática e Estátistica Roberto Tom Price Eng., M.Sc., S.Phil. Universidade Federal do Rio Grande do Sul – Instituto de Informática Resumo O artigo apresenta a descrições de como a abordagem de desenvolvimento orientado a componentes constata-se como um poderoso veículo de reuso. São tratados os aspectos de descrição de adaptação de componentes. É demonstrada a abordagem de descrição de componentes no ambiente SEA, que suporta o desenvolvimento e o uso de artefatos de software reusáveis. As idéias deste artigo são de fundamental importância, tendo caráter demonstrativo deste assunto de maior relevância para o bom desenvolvimento de software reusável, assunto este que não teve condições de ser abordado durante as aulas da disciplina de Engenharia de Software, e que agora nos será apresentado. Suporte ao Desenvolvimento e Uso de Componentes Flexíveis 1. Introdução O objetivo de construir aplicações a partir da composição de artefatos de software já vem sendo difundido desde o fim da década de 60, durante a “crise do software”. Na década passada, chegou-se a pensar que a orientação a objetos era o mecanismo adequado para promover o reuso. Mas verificou-se, posteriormente, que o reuso não é característica inerente da abordagem OO. A abordagem de desenvolvimento orientado a componentes determina que uma aplicação seja constituída a partir de um conjunto de módulos interligados. Segundo Kozacynski, um dos principais estímulos a abordagem de desenvolvimento baseado em componentes é a disponibilidade de mecanismos de interconexão de componentes. Um destes mecanismos é CORBA, que permite interconectar componentes independente da linguagem, plataforma de execução e localização física dos componentes. Além de CORBA, tem-se SOM, COM e JavaBeans, como padrões “de fato” de interconexão de componentes. Estes mecanismos de interconexão, mesmo solucionando a questão da heterogeneidade entre elementos que necessitam interagir, apresentam queda de desempenho, exigindo que este aspecto seja avaliado para a sua adoção. Outros problemas relacionados a componentes são os de busca e seleção de componentes para reuso. Geralmente, componentes necessitam ser adaptados antes de serem utilizados. 2. Abordagens de descrição da interface de componentes A forma mais comum de descrever um componente é a descrição de sua interface. Porém, os mecanismos de descrição de interface, geralmente, produzem apenas uma visão externa, incapaz de descrever suas funcionalidades e como estes interagem. Em geral, a interação de um componente com o meio externo pode ser bidirecional, isto é, o componente pode receber invocações de métodos mas também pode originar invocações. Murer estabelece três níveis de informação de interoperabilidade de componentes: Nível de interface: uso de linguagem para descrever como estruturalmente os componentes podem ser agrupados. Nível originador: que tipos e versões de componentes podem trabalhar juntos. Nível semântico: descrição completa da funcionalidade do componente. As propostas mais recentes ressaltam a necessidade da descrição de uma interface não ser feita exclusivamente através da relação de assinaturas de métodos fornecidos e requeridos, mas também da definição da dinâmica da interação. Reuse contract é uma descrição de interface para um conjunto de componentes participantes que colaboram entre si. Várias das propostas de descrição de interface de componentes carecem de formalismo, o que é necessário para descrever precisamente a interação entre componentes, tais como formalismos algébricos, que tem sido usados para descrever protocolos de comunicação e sistemas distribuídos. De acordo com Canal, o uso da álgebra é adequado a abordagem de componentes, pois permite a avaliação de propriedades, como equivalência, inexistência de deadlock e outras. 3. A necessidade de descrever a funcionalidade de componentes Dois componentes a serem interconectados são estruturalmente compatíveis se o conjunto de métodos invocados através da interface de um está disponível na da interface do outro. A conexão destes componentes, todavia pode produzir resultados não previstos. Além de compreender a estrutura e o comportamento da interface de um componente, é necessário compreender-se exatamente o que o componente faz, como opera, antes de qualificá-lo como adequado para o reuso. 4. Abordagens de adaptação de componentes Raramente os componentes são reutilizados da mesma maneira como foram desenvolvidos, geralmente eles necessitam ser adaptados para se moldarem aos requisitos do sistema a que serão acoplados. Têm-se utilizado duas abordagens de adaptação de componentes: alteração ou empacotamento. O empacotamento cria uma visão externa diferente para o componente, ao invés de modificá-lo. Outra alternativa é interconectar componentes antes incompatíveis através de um componente intermediário denominado cola. O relacionamento de cola é isolado dos componentes e definido separadamente. A definição deste componente intermediário consiste na criação de objetos ponto de vista, que são observadores de componentes existentes, sendo que: mais de um ponto de vista pode ser associado a um componente. o estado de um ponto de vista é alterado, quando ocorre a alteração do estado do componente observado. um ponto de vista atua como interface entre o componente e o meio com que ele interage, permitindo alteração e adaptação da interface original, bem como a extensão de funcionalidades. pontos de vista podem ser criados, destruídos, acoplados ou desacoplados dinamicamente. A alteração de um componente pode se tornar uma tarefa menos árdua se o componente for desenvolvido para ser alterado, como os arcabouços de componente, um componente que prevê o acoplamento de outros componentes e que é modificado a partir da troca dos componentes a ele acoplados. 5. Abordagem proposta de descrição de componentes A abordagem de descrição de componentes apresentada neste artigo é utilizada no ambiente SEA, onde o paradigma OO foi adotado para desenvolver frameworks, componentes e aplicações. Desta forma, os componentes são definidos como estruturas de classes, que reutilizam uma interface, selecionada de uma biblioteca de interfaces de componentes. Esta interface possui uma especificação individual que descreve sua estrutura e sua dinâmica comportamental. Esta especificação de interfaces em separado permite que a interface seja reusada em vários componentes, produzindo uma família de componentes compatíveis comportamental e estruturalmente. 5.1. Especificação estrutural de interface de componente Um componente possui uma interface única, que pode prever a conexão a mais de um componente, onde cada conexão utiliza um canal. A especificação estrutural de uma interface de componente relaciona os métodos fornecidos e os requeridos, e a associação destes a cada canal da interface. No ambiente SEA, a estrutura de uma interface é produzida através do relacionamento de assinaturas de métodos e canais, e da definição do relacionamento entre estes. O ambiente embute na classe que implementa a interface esta estrutura, mais precisamente nos seus atributos. 5.2. Especificação comportamental de interface de componente O que deve-se saber neste item é se existem ou não restrições associadas a ordem em que são invocados os métodos, em caso positivo, devem fazer parte da modelagem da interface. Para que fosse majorada a compreensibilidade e com a necessidade de formalismo, adotou-se o uso de redes de Petri para a modelagem do comportamento da interface de componentes, pois apresenta o formalismo algébrico e notação gráfica. O comportamento de um conjunto de componentes interligados é obtido a partir da união das redes de Petri que descrevem suas interfaces. Outras vantagens da adoção de redes de Petri: permite analisar propriedades de interfaces individuais e arquiteturas de componentes (possibilidade de avaliar a existência de deadlock ou de transições que nunca são disparadas). 6. Aplicação da abordagem de frameworks para a produção de componentes flexíveis Caso um componente seja projetado prevendo futuras modificações, e havendo suporte para modificá-lo, existe a possibilidade de diminuir-se a complexidade da alteração da estrutura de componentes, viabilizando-se a criação de componentes flexíveis. Um framework OO é uma estrutura de classes que estão inter-relacionadas, constituindo uma implementação inacabada, para um domínio de aplicações. A principal vantagem dos frameworks é a reutilização de projeto, além do reuso do código, sendo necessário conhecer apenas parte das classes envolvidas. Como desvantagem tem-se a complexidade de desenvolvimento e de utilização. Um framework desenvolvido para produzir componentes corresponde a uma estrutura de classes que apresenta partes mantidas flexíveis, para que se adapte a diferentes requisitos. A vantagem desta abordagem é que pode-se obter componentes distintos a partir de um esforço menor que o necessário para desenvolver cada um de maneira isolada. 7. Suporte ao desenvolvimento e uso de componentes flexíveis no ambiente SEA Este ambiente possui funcionalidades que facilitam o desenvolvimento de componentes flexíveis e a produção de novos a partir de sua alteração. 7.1. SEA, um ambiente para o desenvolvimento e uso de artefatos reutilizáveis de software SEA é um ambiente que suporta o desenvolvimento e o uso de artefatos reutilizáveis de software, considerando os seguintes requisitos: Suporte a edição gráfica de modelos – facilitam a compreensão de especificações de software. Suporte a edição semântica – a geração de código exige que um ambiente assegure consistência semântica das especificações. Esta garantia, vem da adoção dos seguintes meios: o Define-se um metamodelo par cada tipo de especificação, que estabelece os elementos da especificação e as relações semânticas entre eles. o Cada editor do ambiente sujeita-se as restrições do metamodelo associado. SEA dispõe de algumas funcionalidades de suporte a edição semântica, como: o Ações de refatoração. o Propagação de efeitos das ações de edição. Suporte ao reuso de artefatos de software – suporte ao reuso de frameworks, de componentes, de interfaces de componentes, estruturas de projeto pré-elaboradas e mantidas em biblioteca, etc. Flexibilidade – possibilita a evolução de um ambiente. Inclusão de novas características e funcionalidades com menor esforço e sem efeitos colaterais inesperados. 7.2. A estrutura de uma especificação de componente SEA utiliza as seguintes técnicas de modelagem propostas em UML: Diagrama de casos de uso. Diagrama de atividades. Diagrama de classes. Diagrama de seqüência. Diagrama de estados. Diagrama de corpo de método (este não previsto em UML). Extensões de SEA em relação a UML: Representação de conceitos do domínio de frameworks. Suprimento de lacunas semânticas, como nos estados e na ordem dos casos de uso. Possibilidade de descrição do corpo dos métodos na especificação de projeto. Expressão da ligação semântica entre elementos de uma especificação. Possibilidade das especificações serem tratadas como hiperdocumentos. 7.3. O desenvolvimento e uso de componentes flexíveis no ambiente SEA O ambiente SEA dispõe de um conjunto de editores que possibilitam especificar componentes como estruturas de classes. Dá suporte a adaptação de frameworks, e ao desenvolvimento de hiperdocumentos de orientação ao uso de frameworks. Suporta a especificação de interfaces de componentes e de arquiteturas de componentes, e permite a verificação de consistência de especificações de projeto e geração semi-automática de código. 8. Conclusão Este artigo apresentou a abordagem adotada no ambiente SEA para o desenvolvimento e uso de componentes. Foi apresentado o uso da abordagem de frameworks para o desenvolvimento de componentes. Neste ambiente, componentes e arquiteturas de componentes são produzidos como especificações de projeto que são submetidas a verificação de consistência e traduzidas para linguagem de programação. O suporte disponível atualmente traz soluções para alguns dos problemas identificados na abordagem de desenvolvimento orientado a componentes.