29.01.2014 Views

integrando padrões através de meta-modelos - Departamento de ...

integrando padrões através de meta-modelos - Departamento de ...

integrando padrões através de meta-modelos - Departamento de ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE<br />

CENTRO DE CIÊNCIAS EXATAS E DA TERRA<br />

DEPARTAMENTO DE INFORMÁTICA E MATEMÁTICA APLICADA<br />

PROGRAMA DE PÓS-GRADUAÇÃO EM SISTEMAS E COMPUTAÇÃO<br />

INTEGRANDO PADRÕES<br />

ATRAVÉS DE META-MODELOS<br />

LYRENE FERNANDES DA SILVA<br />

DISSERTAÇÃO DE MESTRADO<br />

Orientadora: Virgínia C. Carneiro <strong>de</strong> Paula<br />

2002


Lyrene Fernan<strong>de</strong>s da Silva<br />

INTEGRANDO PADRÕES<br />

ATRAVÉS DE META-MODELOS<br />

Dissertação apresentada ao <strong>Departamento</strong> <strong>de</strong> Informática<br />

e Matemática Aplicada da Universida<strong>de</strong> Fe<strong>de</strong>ral do Rio<br />

Gran<strong>de</strong> do Norte, como requisito parcial à obtenção do<br />

título <strong>de</strong> Mestre em Sistemas e Computação.<br />

Área <strong>de</strong> concentração: Engenharia <strong>de</strong> Software<br />

Orientadora: Profª. Virgínia C. Carneiro <strong>de</strong> Paula<br />

Universida<strong>de</strong> Fe<strong>de</strong>ral do Rio Gran<strong>de</strong> do<br />

Norte<br />

Natal<br />

Universida<strong>de</strong> Fe<strong>de</strong>ral do Rio Gran<strong>de</strong> do Norte<br />

2002


Aos meus pais, Edilson e Graça,<br />

que empenham suas vidas na<br />

realização <strong>de</strong> meus i<strong>de</strong>ais.<br />

iii


SUMÁRIO<br />

LISTA DE FIGURAS ............................................................................................. VII<br />

LISTA DE TABELAS................................................................................................ X<br />

RESUMO...................................................................................................................XI<br />

ABSTRACT............................................................................................................. XII<br />

1. INTRODUÇÃO ...................................................................................................1<br />

1.1 OBJETIVOS ...........................................................................................................3<br />

1.2 ESTRUTURA DA DISSERTAÇÃO..............................................................................4<br />

2. ESTADO DA ARTE............................................................................................6<br />

2.1 ARQUITETURA DE SOFTWARE ...............................................................................6<br />

2.1.1 Estilos ou Padrões Arquiteturais...................................................................9<br />

2.1.2 Visões .........................................................................................................16<br />

2.2 LINGUAGENS UTILIZADAS ..................................................................................18<br />

2.2.1 UML...........................................................................................................19<br />

2.2.2 Linguagem <strong>de</strong> Especificação Z....................................................................21<br />

2.2.3 Utilizando UML e Z....................................................................................21<br />

2.3 CORBA.............................................................................................................22<br />

2.3.1 Consi<strong>de</strong>rações Iniciais................................................................................22<br />

2.3.2 Arquitetura <strong>de</strong> Gerenciamento <strong>de</strong> Objetos ..................................................24<br />

2.3.3 Estrutura <strong>de</strong> CORBA ..................................................................................27<br />

2.3.4 Objetos <strong>de</strong> uma Aplicação ..........................................................................30<br />

2.4 CONCLUSÕES .....................................................................................................31<br />

3. UM META-MODELO PARA MODELAR UMA FAMÍLIA DE<br />

APLICAÇÕES DISTRIBUÍDAS..............................................................................33<br />

3.1 METODOLOGIA...................................................................................................34<br />

3.2 NOTAÇÃO E TERMINOLOGIA ...............................................................................36<br />

3.3 UM META-MODELO PARA MODELAR ESTILOS .....................................................37<br />

3.3.1 Estrutura Estática.......................................................................................43<br />

iv


3.3.2 Estrutura Dinâmica ....................................................................................54<br />

3.3.3 Estereótipos................................................................................................57<br />

3.4 UM META-MODELO PARA MODELAR ARQUITETURAS EM CAMADAS....................59<br />

3.4.1 Estrutura Estática.......................................................................................59<br />

3.4.2 Estrutura Dinâmica ....................................................................................62<br />

3.4.3 Variações do Estilo Camadas .....................................................................63<br />

3.5 UM META-MODELO PARA MODELAR APLICAÇÕES BASEADAS EM CORBA..........66<br />

3.5.1 Estrutura Estática.......................................................................................67<br />

3.5.2 Estrutura Dinâmica ....................................................................................80<br />

3.6 UM META-MODELO PARA MODELAR UMA FAMÍLIA DE APLICAÇÕES DISTRIBUÍDAS<br />

................................................................................................................................82<br />

3.6.1 Estrutura Estática.......................................................................................83<br />

3.6.2 Estrutura Dinâmica ....................................................................................88<br />

3.7 CONCLUSÕES .....................................................................................................89<br />

4. ESTUDO DE CASO..........................................................................................90<br />

4.1 DEFINIÇÃO DO ESTUDO DE CASO ........................................................................90<br />

4.2 UTILIZANDO O META-MODELO PARA MODELAR UMA FAMÍLIA DE APLICAÇÕES<br />

DISTRIBUÍDAS..........................................................................................................91<br />

4.3 CONCLUSÕES .....................................................................................................98<br />

5. TRABALHOS CORRELATOS..........................................................................100<br />

5.1 HOFMEISTER, NORD E SONI..............................................................................100<br />

5.2 DI NITTO E ROSENBLUM...................................................................................101<br />

5.3 EGYED, MEHTA E MEDVIDOVIC........................................................................102<br />

5.4 BUSCHMANN, MEUNIER, ROHNERT, SOMMERLAD E STAL .................................102<br />

5.5 GAMMA, HELM, JOHNSON E VLISSIDES.............................................................103<br />

5.6 CONCLUSÕES ...................................................................................................103<br />

6. CONCLUSÕES E TRABALHOS FUTUROS ...................................................104<br />

6.1 RESULTADOS OBTIDOS.....................................................................................105<br />

6.1.1 Definição dos Meta-mo<strong>de</strong>los.....................................................................105<br />

6.1.2 Mo<strong>de</strong>lagem dos Meta-mo<strong>de</strong>los em UML ...................................................107<br />

6.1.3 Especificação dos Meta-mo<strong>de</strong>los em Z......................................................107<br />

6.2 TRABALHOS FUTUROS......................................................................................107<br />

v


6.2.1 Extensões para os Próprios Meta-mo<strong>de</strong>los e a Abordagem em Geral........108<br />

6.2.3 Extensões Quanto a Ferramentas..............................................................108<br />

REFERÊNCIAS BIBLIOGRÁFICAS ...................................................................110<br />

ANEXO A - ANÁLISE DA UML COMO LINGUAGEM DE DESCRIÇÃO DE<br />

ARQUITETURA.....................................................................................................115<br />

ANEXO B - ESPECIFICAÇÃO FORMAL EM Z DO META-MODELO PARA<br />

MODELAR ESTILOS. ...........................................................................................118<br />

ANEXO C - ESPECIFICAÇÃO FORMAL EM Z DO META-MODELO PARA<br />

MODELAR ARQUITETURAS EM CAMADAS..................................................122<br />

ANEXO D - ESPECIFICAÇÃO FORMAL EM Z DO META-MODELO PARA<br />

MODELAR APLICAÇÕES BASEADAS EM CORBA – CORBA COMO UM<br />

CONECTOR DA ARQUITETURA. ......................................................................126<br />

ANEXO E - ESPECIFICAÇÃO FORMAL EM Z DO META-MODELO PARA<br />

MODELAR APLICAÇÕES BASEADAS EM CORBA – CORBA COMO UM<br />

COMPONENTE DA ARQUITETURA. ................................................................130<br />

ANEXO F - ESPECIFICAÇÃO FORMAL EM Z DO META-MODELO PARA<br />

MODELAR UMA FAMÍLIA DE APLICAÇÕES DISTRIBUÍDAS COM<br />

MIDDLEWARE CORBA. .......................................................................................135<br />

vi


LISTA DE FIGURAS<br />

FIGURA 1-1 - Transformação do conhecimento durante o <strong>de</strong>senvolvimento <strong>de</strong><br />

software.................................................................................................................1<br />

FIGURA 1-2 - Primeira abordagem <strong>de</strong> refinamento.......................................................3<br />

FIGURA 2-1 - Diagrama <strong>de</strong> caixas e linhas representando uma arquitetura. ..................8<br />

FIGURA 2-2 - Duas abordagens <strong>de</strong> refinamento. ........................................................12<br />

FIGURA 2-3 - Uma arquitetura em camadas para aplicações <strong>de</strong> negócio.....................14<br />

FIGURA 2-4 - O mo<strong>de</strong>lo <strong>de</strong> referência da OMA. ........................................................25<br />

FIGURA 2-5 - Relação entre a arquitetura OMA e a arquitetura em camadas..............26<br />

FIGURA 2-6 - Mo<strong>de</strong>lo <strong>de</strong> referencia OMA - Uso <strong>de</strong> interfaces. ..................................26<br />

FIGURA 2-7 - Requisição enviada <strong>através</strong> do ORB. ...................................................27<br />

FIGURA 2-8 - Estrutura <strong>de</strong> um ORB. .........................................................................28<br />

FIGURA 2-9 - Modos <strong>de</strong> invocação <strong>de</strong> operações. ......................................................31<br />

FIGURA 3-1 - Relação entre os <strong>meta</strong>-mo<strong>de</strong>los <strong>de</strong>senvolvidos.....................................35<br />

FIGURA 3-2 - Elementos <strong>de</strong> mo<strong>de</strong>lo UML utilizados. ................................................37<br />

FIGURA 3-3 - Meta-mo<strong>de</strong>lo da visão conceitual da arquitetura...................................37<br />

FIGURA 3-4 - Mudanças nas agregações existentes no <strong>meta</strong>-mo<strong>de</strong>lo..........................38<br />

FIGURA 3-5 - Exemplo das agregações modificadas no <strong>meta</strong>-mo<strong>de</strong>lo. .......................39<br />

FIGURA 3-6 - Estrutura estática <strong>de</strong> um <strong>meta</strong>-mo<strong>de</strong>lo para especificar estilos..............43<br />

FIGURA 3-7 - Esquema Configuração........................................................................45<br />

FIGURA 3-8 - Esquema Componentes........................................................................46<br />

FIGURA 3-9 - Esquema Porta_rec. .............................................................................47<br />

FIGURA 3-10 - Esquema Porta_exp. ..........................................................................48<br />

FIGURA 3-11 - Esquema Conectores..........................................................................49<br />

FIGURA 3-12 - Esquema PapelIN. .............................................................................51<br />

FIGURA 3-13 - Esquema Papel OUT..........................................................................52<br />

FIGURA 3-14 - Esquema Proprieda<strong>de</strong> ........................................................................54<br />

FIGURA 3-15 - Diagrama <strong>de</strong> seqüência para conexão assíncrona................................55<br />

FIGURA 3-16 - Diagrama <strong>de</strong> seqüência para conexão síncrona...................................55<br />

FIGURA 3-17 - Diagrama <strong>de</strong> seqüência para conexão síncrona...................................56<br />

FIGURA 3-18 - Diagrama <strong>de</strong> seqüência para a ligação entre papéis. ...........................56<br />

FIGURA 3-19 - Diagrama <strong>de</strong> estados para conexão assíncrona. ..................................56<br />

vii


FIGURA 3-20 - Diagrama <strong>de</strong> estados para conexão síncrona.......................................57<br />

FIGURA 3-21 - Diagrama <strong>de</strong> estados para conexão síncrona <strong>de</strong>ferida. ........................57<br />

FIGURA 3-22 - Estereótipos para representação <strong>através</strong> <strong>de</strong> caixas e linhas. ................58<br />

FIGURA 3-23 - Instanciação para criar um <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar arquiteturas em<br />

camadas...............................................................................................................59<br />

FIGURA 3-24 - Exemplo da organização <strong>de</strong> camadas. ................................................60<br />

FIGURA 3-25 - Esquema Configuração_camadas.......................................................61<br />

FIGURA 3-26 - Estrutura estática do <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar arquiteturas <strong>de</strong><br />

software em camadas...........................................................................................62<br />

FIGURA 3-27 - Esquema Configuração_Camadas......................................................64<br />

FIGURA 3-28 - Instanciação para criar um <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar aplicações<br />

baseadas em CORBA. .........................................................................................66<br />

FIGURA 3-29 - Exemplo <strong>de</strong> arquitetura em que CORBA é um conector.....................68<br />

FIGURA 3-30 - Estrutura estática do <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar aplicações baseadas no<br />

middleware CORBA. ..........................................................................................69<br />

FIGURA 3-31 - Esquema da Configuração_CORBA. .................................................70<br />

FIGURA 3-32 - Esquema do Componente CORBA. ...................................................71<br />

FIGURA 3-33 - Esquema da Porta Divulgadora..........................................................71<br />

FIGURA 3-34 - Esquema Conectores_C. ....................................................................72<br />

FIGURA 3-35 - Esquema PapelIN_C..........................................................................72<br />

FIGURA 3-36 - Exemplo <strong>de</strong> arquitetura em que CORBA é um componente. ..............73<br />

FIGURA 3-37 - Estrutura estática do <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar aplicações baseadas no<br />

middleware CORBA. ..........................................................................................74<br />

FIGURA 3-38 - Esquema da Configuração_CORBA. .................................................77<br />

FIGURA 3-39 - Diagrama <strong>de</strong> seqüência para conexão assíncrona................................80<br />

FIGURA 3-40 - Diagrama <strong>de</strong> seqüência para conexão síncrona...................................80<br />

FIGURA 3-41 - Diagrama <strong>de</strong> seqüência para conexão síncrona...................................81<br />

FIGURA 3-42 - Instanciação para criar um <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar aplicações<br />

baseadas em CORBA e no estilo camadas. ..........................................................82<br />

FIGURA 3-43 - Classe e esquema da Configuração_Camadas. ...................................83<br />

FIGURA 3-44 - Classe e esquema da Configuração_CORBA. ....................................84<br />

FIGURA 3-45 - Classe Configuração_Camadas_CORBA...........................................84<br />

FIGURA 3-46 - Esquema da Configuração_Camadas_CORBA. .................................85<br />

viii


FIGURA 3-47 - Classe e esquema do Componente na<br />

Configuração_Camadas_CORBA........................................................................86<br />

FIGURA 3-48 - Classe e esquema do conector na Configuração_Camadas_CORBA. .87<br />

FIGURA 3-49 - Classe e esquema do Papel_IN na Configuração_Camadas _CORBA.<br />

............................................................................................................................87<br />

FIGURA 3-50 - Estrutura estática do <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar uma família <strong>de</strong><br />

aplicações distribuídas.........................................................................................88<br />

FIGURA 4-1 - Diagrama <strong>de</strong> casos <strong>de</strong> uso para a aplicação Caixa Eletrônico. ..............90<br />

FIGURA 4-2 - Arquitetura da aplicação Caixa Eletrônico. ..........................................94<br />

FIGURA 4-3 - Arquitetura da aplicação Caixa Eletrônico. ..........................................95<br />

FIGURA 4-4 - Classes da aplicação Caixa Eletrônico. ................................................96<br />

FIGURA 4-5 - Diagrama <strong>de</strong> objetos para a aplicação Caixa Eletrônico. ......................97<br />

FIGURA 4-6 - Diagrama <strong>de</strong> sequência para a função Saldo do Caixa Eletrônico.........98<br />

ix


LISTA DE TABELAS<br />

TABELA 2-1 - Comparação <strong>de</strong> termos <strong>de</strong> arquitetura <strong>de</strong> software...............................10<br />

TABELA 3-1 - CORBA como conector X CORBA como componente.......................79<br />

TABELA 4-1 - Descrição dos casos <strong>de</strong> uso .................................................................91<br />

x


RESUMO<br />

A área <strong>de</strong> arquitetura <strong>de</strong> software vem <strong>de</strong>sempenhando um papel fundamental no<br />

<strong>de</strong>senvolvimento <strong>de</strong> sistemas. Seu objetivo inicial <strong>de</strong> oferecer uma visão geral do<br />

sistema, dando suporte ao gerenciamento <strong>de</strong> projetos, expandiu-se enormemente, e a<br />

tendência atual é <strong>de</strong> que ela reduz o gap existente entre a análise e a implementação,<br />

cobrindo todas as fases do <strong>de</strong>sign.<br />

Isto significa, porém, que é necessário aproximar ou tornar fácil a evolução dos<br />

mo<strong>de</strong>los construídos em cada fase do <strong>de</strong>senvolvimento para a fase seguinte, sem que<br />

nenhum <strong>de</strong>talhe se perca ou se <strong>de</strong>turpe. Assim, torna-se possível <strong>de</strong>senvolver sistemas<br />

que retratam uma realida<strong>de</strong> pretendida, que satisfazem a usuários e a clientes, e que, por<br />

outro lado, ajudam a equipe <strong>de</strong> <strong>de</strong>senvolvimento por prover aspectos favoráveis à<br />

manutenibilida<strong>de</strong> e reusabilida<strong>de</strong>.<br />

Esta dissertação apresenta um <strong>meta</strong>-mo<strong>de</strong>lo para projetar arquiteturas em<br />

camadas <strong>de</strong> aplicações baseadas em CORBA (Common Object Request Broker<br />

Architecture). O <strong>meta</strong>-mo<strong>de</strong>lo retrata uma arquitetura com seus componentes,<br />

conectores e possíveis combinações entre eles, projetada em uma linguagem <strong>de</strong> fácil<br />

entendimento e aprendizagem, a UML (Unified Mo<strong>de</strong>ling Language). Ele oferece, ao<br />

usuário (o projetista), facilida<strong>de</strong>s para enten<strong>de</strong>r e <strong>de</strong>senvolver aplicações <strong>de</strong>sta família<br />

<strong>de</strong> sistemas, pois é um mo<strong>de</strong>lo pronto para ser instanciado, resultando na arquitetura<br />

<strong>de</strong>talhada <strong>de</strong> aplicações específicas e genéricas, ou refinado, resultando em mo<strong>de</strong>los que<br />

agregam características que os aproxima da implementação e po<strong>de</strong>m ser, igualmente,<br />

instanciados ou refinados.<br />

xi


ABSTRACT<br />

The area of software architecture is playing a fundamental role in the <strong>de</strong>velopment of<br />

systems. Its initial objective of offers a general view of the system, supporting the<br />

administration of projects, expan<strong>de</strong>d vastly, and the current ten<strong>de</strong>ncy is that it reduces<br />

the existent gap between the analysis and the implementation, covering all the phases of<br />

the <strong>de</strong>sign.<br />

This means, however, that is necessary to approximate or to turn easy the<br />

evolution of the mo<strong>de</strong>ls built in each phase of the <strong>de</strong>sign for the following phase,<br />

without any <strong>de</strong>tail getting lost or changed. This way, it is possible to <strong>de</strong>velop systems<br />

that <strong>de</strong>pict an inten<strong>de</strong>d reality, that satisfy users and customers, and that, on the other<br />

hand, help the <strong>de</strong>velopment team, by providing favorable aspects to the manutenability<br />

and reusability.<br />

This dissertation presents a <strong>meta</strong>-mo<strong>de</strong>l to project architectures in layers of<br />

applications based on CORBA (Common Object Request Broker Architecture). The<br />

<strong>meta</strong>-mo<strong>de</strong>l portrays an architecture with its components, connectors and possible<br />

combinations among them, projected in a language of easy un<strong>de</strong>rstanding and learning,<br />

UML (Unified Mo<strong>de</strong>ling Language). It offers, to the user (the <strong>de</strong>signer), means to<br />

un<strong>de</strong>rstand and to <strong>de</strong>velop applications of this family of systems, because it is a ready<br />

mo<strong>de</strong>l to be instanced, resulting in the <strong>de</strong>tailed architecture of specific and generic<br />

applications, or refined, resulting in mo<strong>de</strong>ls that join characteristics that approximates<br />

them of the implementation and they can be, equally, instanced or refined.<br />

xii


1. INTRODUÇÃO<br />

Sistemas <strong>de</strong> Software estão cada vez mais presentes no cotidiano das pessoas.<br />

Ativida<strong>de</strong>s comuns, como fazer um trabalho escolar, correspon<strong>de</strong>r-se com amigos e até<br />

se divertir, ou complexas, como ativida<strong>de</strong>s científicas, industriais, comerciais e<br />

militares, são realizadas por meio <strong>de</strong> software. A nossa <strong>de</strong>pendência e a popularida<strong>de</strong> da<br />

tecnologia impulsionam a construção <strong>de</strong> sistemas complexos, heterogêneos, que <strong>de</strong>vem<br />

ser executados em múltiplas plataformas e prover serviços ininterruptos. A <strong>de</strong>manda por<br />

software que atenda a estes requisitos cresce rapidamente, exigindo que as comunida<strong>de</strong>s<br />

<strong>de</strong> engenheiros e pesquisadores elaborem técnicas, métodos e ferramentas que aju<strong>de</strong>m<br />

no <strong>de</strong>senvolvimento <strong>de</strong>le.<br />

Gran<strong>de</strong> parte das pesquisas na área <strong>de</strong> engenharia <strong>de</strong> software tem enfocado<br />

técnicas que diminuam o gap existente entre o mundo real e o mo<strong>de</strong>lo computacional<br />

que o implementa. Muitas <strong>de</strong>stas técnicas se baseiam na criação <strong>de</strong> mo<strong>de</strong>los e <strong>de</strong><br />

linguagens menos ou mais abstratas, tentando oferecer ao projetista uma maneira<br />

gradual <strong>de</strong> transformar requisitos em software, e assim retratar <strong>de</strong> maneira fiel uma<br />

realida<strong>de</strong> pretendida, como mostramos na FIG. 1-1.<br />

Mundo<br />

Real<br />

Engenharia <strong>de</strong><br />

Requisitos<br />

Design<br />

Implementação<br />

FIGURA 1-1 - Transformação do conhecimento durante o <strong>de</strong>senvolvimento <strong>de</strong> software.<br />

No ciclo <strong>de</strong> vida do software, as fases <strong>de</strong> análise, <strong>de</strong>sign, implementação e<br />

manutenção são realizadas com a construção <strong>de</strong> mo<strong>de</strong>los. Após <strong>de</strong>finir os problemas e<br />

levantar soluções conceituais, durante a análise, inicia-se a fase <strong>de</strong> <strong>de</strong>sign, responsável<br />

por mapear os conceitos para soluções computacionais. Tais soluções são, a princípio,<br />

abstratas e <strong>de</strong>vem ser refinadas até um nível passível <strong>de</strong> implementação. Estando pronto<br />

para ser utilizado (executado), o software <strong>de</strong>ve está apto a ser modificado para<br />

acomodar novos requisitos ou mesmo alterar os existentes. Oferecer modificabilida<strong>de</strong><br />

ao software garante um maior tempo útil para ele.<br />

1


A arquitetura <strong>de</strong> um sistema é um dos primeiros mo<strong>de</strong>los a serem elaborados<br />

durante a fase <strong>de</strong> <strong>de</strong>sign. Ela oferece um maior entendimento da aplicação por dividi-la<br />

em um conjunto <strong>de</strong> componentes que interagem entre si, para realizar parte <strong>de</strong> uma, uma<br />

ou várias funcionalida<strong>de</strong>s do sistema [52]. Além disso, a área <strong>de</strong> arquitetura <strong>de</strong> software<br />

coloca a disposição métodos que garantem menores custos e tempo no<br />

<strong>de</strong>senvolvimento. Ela emprega uma abordagem focada em reusabilida<strong>de</strong> <strong>de</strong><br />

componentes ou estilos arquiteturais já existentes, e permite que vários times trabalhem<br />

paralelamente em partes (subsistemas) diferentes do sistema.<br />

Desta forma, a complexida<strong>de</strong> intrínseca dos sistemas <strong>de</strong> software atuais po<strong>de</strong> ser<br />

melhor gerenciada. A divisão <strong>de</strong> um sistema em subsistemas menores e menos<br />

complexos provê uma maneira <strong>de</strong> fazer com que o <strong>de</strong>senvolvedor concentre seus<br />

esforços em partes especializadas em algum serviço, permitindo que eles sejam<br />

completos e validados. Entretanto, projetar a arquitetura <strong>de</strong> um sistema é uma tarefa<br />

complexa, que envolve conhecimentos do domínio, <strong>de</strong> tecnologias <strong>de</strong> <strong>de</strong>sign e <strong>de</strong><br />

implementação.<br />

Padrões e visões são, comumente, utilizados para alcançar os benefícios<br />

propostos pela arquitetura <strong>de</strong> software [27]. As visões representam os diferentes<br />

interesses (funcionais, não-funcionais e organizacionais) dos participantes do projeto,<br />

<strong>de</strong>nominados stakehol<strong>de</strong>rs. Elas ajudam a gerenciar a complexida<strong>de</strong> intrínseca aos<br />

sistemas [27]. Os <strong>padrões</strong> retratam soluções para problemas específicos recorrentes<br />

durante o <strong>de</strong>sign ou implementação <strong>de</strong> um sistema. Vários <strong>de</strong>les já foram documentados<br />

e disponibilizados, <strong>de</strong> maneira a popularizar soluções existentes [6][21]. Durante o<br />

<strong>de</strong>sign, eles po<strong>de</strong>m ter um nível <strong>de</strong> generalida<strong>de</strong> mais alto ou mais baixo, e são<br />

<strong>de</strong>nominados, respectivamente, padrão arquitetural (ou estilos) e padrão <strong>de</strong> <strong>de</strong>sign.<br />

A disponibilização <strong>de</strong> <strong>padrões</strong> retrata o reuso da experiência adquirida para<br />

resolução <strong>de</strong> um problema a um certo nível <strong>de</strong> generalida<strong>de</strong>. A utilização <strong>de</strong> <strong>padrões</strong> no<br />

<strong>de</strong>senvolvimento <strong>de</strong> sistemas requer metodologia e perspicácia. Na FIG. 1-2, vemos que<br />

conduzir o <strong>de</strong>senvolvimento a partir <strong>de</strong> um estilo, passando pela arquitetura <strong>de</strong> um<br />

produto até o <strong>de</strong>sign <strong>de</strong>talhado <strong>de</strong>le é uma tarefa árdua, pois o gap existente entre estas<br />

tarefas <strong>de</strong> <strong>de</strong>sign é extenso, e garantir a consistência entre eles é difícil. Esta tarefa é<br />

igualmente árdua cada vez que um produto diferente tem que ser <strong>de</strong>senvolvido.<br />

Na FIG. 1-2 [18], vemos como uma arquitetura <strong>de</strong> família (ou estilo) é refinada<br />

para a mo<strong>de</strong>lagem <strong>de</strong> um produto específico. Ao instanciar a arquitetura da família<br />

obtém-se a arquitetura <strong>de</strong> um produto, que por sua vez <strong>de</strong>ve ser refinada para que se<br />

2


alcance um nível mais <strong>de</strong>talhado <strong>de</strong> <strong>de</strong>sign (<strong>de</strong>sign do produto ou arquitetura <strong>de</strong>talhada<br />

do produto), e assim mais próximo da implementação. Entretanto, é difícil garantir que<br />

após este refinamento a arquitetura <strong>de</strong>talhada do produto é consistente com a arquitetura<br />

da família daquele produto.<br />

Arquitetura da Família Fácil<br />

Instanciação<br />

Difícil<br />

Arquitetura do Produto<br />

Difícil<br />

Refinamento<br />

Design do Produto<br />

Feito uma vez<br />

Feito várias vezes<br />

FIGURA 1-2 - Primeira abordagem <strong>de</strong> refinamento.<br />

Outro fator que po<strong>de</strong> dificultar a garantia da consistência entre estes mo<strong>de</strong>los é a<br />

linguagem ou linguagens utilizadas para representá-los. Diferentes mo<strong>de</strong>los são,<br />

normalmente, construídos por especialistas diferentes, em linguagens <strong>de</strong> representação<br />

diferentes. Esta atitu<strong>de</strong> tem o benefício <strong>de</strong> que os mo<strong>de</strong>los são mais a<strong>de</strong>quadamente<br />

mo<strong>de</strong>lados. Entretanto, isto compromete a comunicação e interação entre os projetistas,<br />

e gera a ativida<strong>de</strong> extra <strong>de</strong> ter que traduzir uma linguagem para outra, expondo-se a<br />

cometer outros erros.<br />

Neste trabalho, estamos tratando especificamente da família <strong>de</strong> aplicações<br />

estruturadas em camadas que utilizam CORBA como plataforma <strong>de</strong> middleware. Esta<br />

família <strong>de</strong> sistemas é caracterizada pelo estilo camadas e pelas restrições arquiteturais<br />

impostas por CORBA. CORBA fornece uma solução para a questão <strong>de</strong> distribuição e<br />

interoperabilida<strong>de</strong> entre sistemas, estando mais relacionado às características do nível<br />

<strong>de</strong> implementação. Entretanto, algumas características <strong>de</strong> implementação <strong>de</strong>vem ser<br />

consi<strong>de</strong>radas em níveis iniciais do <strong>de</strong>sign, pois po<strong>de</strong>m influenciar ou afetar as <strong>de</strong>cisões<br />

<strong>de</strong> mais alto nível [15]. Decisões que, se não consi<strong>de</strong>radas antecipadamente, po<strong>de</strong>m<br />

resultar em implementações que não retratam a arquitetura, e assim, gerar sérios<br />

problemas durante a fase <strong>de</strong> manutenção do software.<br />

1.1 Objetivos<br />

O presente trabalho apresenta um <strong>meta</strong>-mo<strong>de</strong>lo para o <strong>de</strong>sign <strong>de</strong>talhado <strong>de</strong> uma família<br />

<strong>de</strong> sistemas. Esta família representa o conjunto <strong>de</strong> aplicações estruturadas em camadas e<br />

3


que são distribuídas utilizando o middleware CORBA. Nós adotamos o estilo camadas<br />

porque ele é uma solução globalmente aceita para estruturar um sistema <strong>de</strong> software<br />

[27][29][52] e CORBA por ser um padrão para interoperabilida<strong>de</strong> d sistemas<br />

distribuídos.<br />

O <strong>meta</strong>-mo<strong>de</strong>lo retrata uma arquitetura com seus componentes, conectores e<br />

possíveis combinações entre eles, projetada em uma linguagem <strong>de</strong> fácil entendimento e<br />

aprendizagem, a UML (Unified Mo<strong>de</strong>ling Language). Ele objetiva facilitar o <strong>de</strong>sign <strong>de</strong><br />

arquiteturas <strong>de</strong> software, por resolver ou esclarecer todas as restrições impostas por um<br />

ou mais estilos e aproximar o <strong>de</strong>sign da arquitetura a fases mais <strong>de</strong>talhadas do <strong>de</strong>sign.<br />

Com o <strong>meta</strong>-mo<strong>de</strong>lo, queremos que o tempo e os custos <strong>de</strong> <strong>de</strong>senvolver uma aplicação<br />

distribuída sejam reduzidos por não haver o (re) trabalho <strong>de</strong> se i<strong>de</strong>ntificar e <strong>de</strong>screver<br />

cada um dos fatores <strong>de</strong>finidos nele.<br />

A documentação do <strong>meta</strong>-mo<strong>de</strong>lo consiste <strong>de</strong> um conjunto <strong>de</strong> artefatos, que<br />

juntos oferecem todo o entendimento necessário para elaborar a arquitetura <strong>de</strong> um<br />

sistema <strong>de</strong>sta família. Os artefatos são os seguintes: <strong>de</strong>scrição estática <strong>através</strong> do<br />

diagrama <strong>de</strong> classes da UML; especificação formal <strong>de</strong>sta estrutura estática na linguagem<br />

<strong>de</strong> especificação Z; e <strong>de</strong>scrição dinâmica <strong>através</strong> dos diagramas <strong>de</strong> seqüência e <strong>de</strong><br />

estados. Para exemplificar como e quando utilizar o <strong>meta</strong>-mo<strong>de</strong>lo, nós realizamos um<br />

estudo <strong>de</strong> caso e mostramos as facilida<strong>de</strong>s oferecidas pelo <strong>meta</strong>-mo<strong>de</strong>lo proposto.<br />

A dissertação e os artefatos construídos fornecem subsídios para criação <strong>de</strong> uma<br />

ferramenta apta a permitir a construção e validação <strong>de</strong> arquiteturas baseadas em estilos,<br />

e especificamente no estilo camadas e CORBA. Veja, a seguir, a estrutura e organização<br />

<strong>de</strong>sta dissertação.<br />

1.2 Estrutura da Dissertação<br />

Esta dissertação está estruturada e organizada da seguinte maneira:<br />

Capítulo 2: Estado da Arte – Neste capítulo apresentamos as principais tecnologias que<br />

estão envolvidas na elaboração da dissertação. São elas: Arquitetura <strong>de</strong> Software;<br />

CORBA e; as Linguagens, UML e Z, que foram utilizadas para documentar o <strong>meta</strong>mo<strong>de</strong>lo.<br />

Expomos os conceitos fundamentais peculiares a cada uma <strong>de</strong>las e como estes<br />

nos ajudaram a atingir os objetivos propostos.<br />

4


Capítulo 3: Um Meta-mo<strong>de</strong>lo para Mo<strong>de</strong>lar uma Família <strong>de</strong> Aplicações Distribuídas –<br />

Neste capítulo apresentamos a metodologia utilizada para elaborar o <strong>meta</strong>-mo<strong>de</strong>lo e os<br />

vários artefatos construídos durante o <strong>de</strong>senvolvimento <strong>de</strong>le e <strong>de</strong>stacamos a sua<br />

flexibilida<strong>de</strong> e utilida<strong>de</strong>.<br />

Capítulo 4: Estudo <strong>de</strong> Caso – Neste capítulo apresentamos um estudo <strong>de</strong> caso para<br />

<strong>de</strong>monstrar como utilizar o <strong>meta</strong>-mo<strong>de</strong>lo no <strong>de</strong>senvolvimento <strong>de</strong> aplicações práticas.<br />

Capítulo 5: Trabalhos Correlatos – Neste capítulo apresentamos alguns trabalhos que<br />

possuem os mesmos objetivos ou influenciam esta dissertação, e as diferenças entre<br />

eles.<br />

Capítulo 6: Conclusões e Trabalhos Futuros – Neste capítulo apresentamos nossas<br />

conclusões, os resultados que obtivemos com o a construção do <strong>meta</strong>-mo<strong>de</strong>lo e os<br />

futuros trabalhos que po<strong>de</strong>m ser <strong>de</strong>senvolvidos a partir <strong>de</strong>ste trabalho <strong>de</strong> dissertação.<br />

5


2. ESTADO DA ARTE<br />

Este trabalho <strong>de</strong> dissertação foi influenciado por trabalhos em várias áreas: arquitetura<br />

<strong>de</strong> software e seus estilos e visões; reuso <strong>de</strong> software; sistemas distribuídos com<br />

middleware CORBA; <strong>padrões</strong> <strong>de</strong> <strong>de</strong>sign; e mo<strong>de</strong>lagem e especificação <strong>de</strong> software. O<br />

foco <strong>de</strong> nossa dissertação está em arquitetura <strong>de</strong> software. Elaborar <strong>meta</strong>-mo<strong>de</strong>los como<br />

o que estamos propondo ajuda o arquiteto a <strong>de</strong>sempenhar suas ativida<strong>de</strong>s <strong>de</strong> <strong>de</strong>sign e <strong>de</strong><br />

gerenciamento.<br />

Neste capítulo, apresentamos o embasamento teórico que fundamenta este<br />

trabalho <strong>de</strong> dissertação. Os conceitos e as características relevantes <strong>de</strong> cada uma das<br />

tecnologias envolvidas são apresentados. Mostramos como estas tecnologias<br />

influenciam e/ou colaboram para elaboração do <strong>meta</strong>-mo<strong>de</strong>lo que estamos propondo.<br />

2.1 Arquitetura <strong>de</strong> Software<br />

A arquitetura <strong>de</strong> software retrata uma solução computacional <strong>de</strong> alto nível <strong>através</strong> <strong>de</strong><br />

componentes computacionais. Ela surgiu para diminuir o gap existente entre a análise e<br />

o <strong>de</strong>sign por representar, <strong>através</strong> <strong>de</strong>stes componentes, todos os requisitos funcionais e<br />

não-funcionais <strong>de</strong>scobertos durante a análise [52]. Os requisitos funcionais são aqueles<br />

relacionados à funcionalida<strong>de</strong> do sistema e os requisitos não funcionais são requisitos<br />

associados aos atributos <strong>de</strong> qualida<strong>de</strong> do sistema, tais como, usabilida<strong>de</strong>, segurança,<br />

reusabilida<strong>de</strong>, flexibilida<strong>de</strong> etc.<br />

A arquitetura <strong>de</strong> software é responsável por mapear o mo<strong>de</strong>lo conceitual do<br />

mundo real para um mo<strong>de</strong>lo computacional, passível <strong>de</strong> ser refinado e implementado<br />

em fases posteriores. O mo<strong>de</strong>lo do mundo real é o mo<strong>de</strong>lo do domínio, ele representa<br />

um problema a ser resolvido computacionalmente. Nesta dissertação, utilizamos o<br />

termo mundo real para <strong>de</strong>notar todas as necessida<strong>de</strong>s e elementos do domínio a serem<br />

implementados por um software. O mo<strong>de</strong>lo computacional é o mo<strong>de</strong>lo dos elementos e<br />

solução implementada para o problema proposto. Com a arquitetura, o mundo real po<strong>de</strong><br />

ser representado <strong>de</strong> maneira mais fiel, dando origem a sistemas mais reais.<br />

Atualmente, a área <strong>de</strong> arquitetura <strong>de</strong> software engloba mais que um mo<strong>de</strong>lo <strong>de</strong><br />

alto nível. Pesquisas mais recentes têm colocado a arquitetura <strong>de</strong> software como meio<br />

<strong>de</strong> chegar à implementação, dando suporte a todas as fases <strong>de</strong> <strong>de</strong>sign existentes entre a<br />

6


análise e a implementação [12][27]. Desta forma, a arquitetura <strong>de</strong>ixa <strong>de</strong> ser somente um<br />

mo<strong>de</strong>lo inicial abstrato e passa a representar mo<strong>de</strong>los genéricos que retratam este<br />

mo<strong>de</strong>lo inicial em níveis mais baixos, em termos <strong>de</strong> subsistemas. Ela passa a ser um<br />

mo<strong>de</strong>lo com vários níveis <strong>de</strong> abstração, se for visto sob a visão do sistema completo. O<br />

nível mais alto <strong>de</strong>nominado arquitetura <strong>de</strong> software e os níveis subseqüentes até um<br />

nível muito baixo que possa ser diretamente implementado, <strong>de</strong>nominado <strong>de</strong> arquitetura<br />

<strong>de</strong>talhada. Nós utilizaremos esta terminologia para <strong>de</strong>signar estes diferentes níveis <strong>de</strong><br />

arquitetura.<br />

A arquitetura <strong>de</strong> um sistema computacional é uma estrutura ou conjunto <strong>de</strong><br />

estruturas que incluem componentes <strong>de</strong> software, suas proprieda<strong>de</strong>s, externamente<br />

visíveis, e os relacionamentos entre estes componentes [52].<br />

• Componentes são entida<strong>de</strong>s computacionais ou <strong>de</strong> armazenamento <strong>de</strong> dados. Em<br />

uma arquitetura eles po<strong>de</strong>m ser tão pequenos quanto um simples procedimento<br />

ou tão gran<strong>de</strong>s como uma aplicação inteira [35]. Alguns exemplos são: módulos,<br />

subsistemas, sistemas, objetos, processos, bibliotecas, bancos <strong>de</strong> dados etc. Eles<br />

interagem <strong>através</strong> <strong>de</strong> pontos <strong>de</strong> interação <strong>de</strong>nominados, portas. As portas são<br />

elementos dissociados dos componentes que as possuem.<br />

• Relacionamentos são representados pelos conectores. Os conectores são<br />

entida<strong>de</strong>s usadas para mo<strong>de</strong>lar as interações entre componentes e as regras que<br />

governam estas interações. Eles po<strong>de</strong>m ser implementados como dispositivos<br />

compiláveis separadamente dos componentes, mas também po<strong>de</strong>m se manifestar<br />

como variáveis compartilhadas, buffers, estrutura <strong>de</strong> dados dinâmica, seqüência<br />

<strong>de</strong> chamadas <strong>de</strong> procedimento, protocolos cliente-servidor, pipes etc [35]. Eles<br />

interagem <strong>através</strong> <strong>de</strong> pontos <strong>de</strong> interação <strong>de</strong>nominados <strong>de</strong> papéis. Os papéis,<br />

assim como as portas, são elementos dissociados dos conectores que os<br />

possuem.<br />

• Proprieda<strong>de</strong>s são informações que indicam o comportamento (a semântica) dos<br />

componentes, e como eles estão aptos a interagir com o mundo externo.<br />

A arquitetura é um mo<strong>de</strong>lo <strong>de</strong> alto nível <strong>de</strong> generalida<strong>de</strong> que fornece, <strong>através</strong> <strong>de</strong><br />

seus componentes e interconexões, um melhor entendimento das partes que constituirão<br />

o software, <strong>de</strong> como elas se relacionam entre si e <strong>de</strong> como estão organizadas,<br />

fornecendo a estrutura global do sistema e <strong>de</strong> seus subsistemas constituintes. Isto<br />

possibilita ao projetista: gerenciar a complexida<strong>de</strong> do sistema; gerenciar o projeto do<br />

7


sistema; tomar certas <strong>de</strong>cisões <strong>de</strong> <strong>de</strong>sign e implementação, antecipadamente; e prevenir<br />

e/ou remediar problemas que po<strong>de</strong>m acontecer durante o <strong>de</strong>sign, implementação e<br />

manutenção. Para tanto, o arquiteto <strong>de</strong>ve ter um conhecimento geral sobre: as diversas<br />

fases <strong>de</strong> <strong>de</strong>sign; as tecnologias que po<strong>de</strong>m ser utilizadas em cada uma das fases; o<br />

contexto no qual o sistema está inserido; a Organização (Empresa ou Companhia) e seus<br />

interesses; e maneiras <strong>de</strong> li<strong>de</strong>rar e gerenciar a equipe <strong>de</strong> <strong>de</strong>senvolvimento [7][27].<br />

Normalmente, arquiteturas são documentos informais, representados <strong>através</strong> <strong>de</strong><br />

diagramas <strong>de</strong> caixas-e-linhas e textos explicativos. Porém, estes diagramas não possuem<br />

a semântica nem a sintaxe bem <strong>de</strong>finidas, como por exemplo a arquitetura na FIG. 2-1.<br />

Para dar suporte à <strong>de</strong>scrição, análise e testes <strong>de</strong> arquiteturas, surgiram nos últimos anos<br />

várias linguagens especificamente para estes propósitos, <strong>de</strong>nominadas ADLs<br />

(Architecture Description Language). As ADLs são linguagens usualmente formais que<br />

tiveram origem nos anos 70 com as linguagens <strong>de</strong> interconexão <strong>de</strong> módulos (MIL) [1].<br />

Como exemplos, temos: Rapi<strong>de</strong> [31], Unicom [51], ZCL [45], C2 [36], Darwin [33],<br />

Wright [1] etc. Muitas <strong>de</strong>las têm ferramentas que dão suporte a análise <strong>de</strong> vários<br />

aspectos arquiteturais e, assim, ajudam o arquiteto a realizar suas tarefas.<br />

P1<br />

P5<br />

A<br />

B<br />

C<br />

P2 P3 P4<br />

D<br />

FIGURA 2-1 - Diagrama <strong>de</strong> caixas e linhas representando uma arquitetura.<br />

Por outro lado, existem as linguagens <strong>de</strong> mo<strong>de</strong>lagem <strong>de</strong> objetos que têm tido<br />

sucesso na representação tanto <strong>de</strong> implementações quanto <strong>de</strong> domínios, provendo uma<br />

maneira natural <strong>de</strong> transformar esta mo<strong>de</strong>lagem em implementação, <strong>de</strong>ntre elas, a UML.<br />

Mas, discute-se se estas linguagens são a<strong>de</strong>quadas para <strong>de</strong>scrição arquitetural [25][37].<br />

Na Seção 2.2, apresentamos a UML e mostramos como ela se a<strong>de</strong>qua aos propósitos da<br />

arquitetura <strong>de</strong> software.<br />

A arquitetura <strong>de</strong> software fornece uma abstração que permite a reusabilida<strong>de</strong> <strong>de</strong><br />

componentes com alto ou com baixo nível <strong>de</strong> generalida<strong>de</strong>, provendo o reuso <strong>de</strong><br />

estruturas inteiras. Estruturas que po<strong>de</strong>m estar relacionadas a um domínio, a uma<br />

família <strong>de</strong> produtos ou a semântica <strong>de</strong> componentes e conectores coexistentes em uma<br />

8


arquitetura [6][21]. Na Seção 2.1.1, nós <strong>de</strong>talhamos estas estruturas. Além disto, uma<br />

arquitetura po<strong>de</strong> ser analisada sob diferentes perspectivas, ou visões [2][27]. Na Seção<br />

2.1.2, nós apresentamos uma abordagem sobre visões arquiteturais.<br />

2.1.1 Estilos ou Padrões Arquiteturais<br />

Como <strong>de</strong>finido por Christopher Alexan<strong>de</strong>r em [6] e [11] “Cada padrão <strong>de</strong>creve um<br />

problema que ocorre repetidamente outras vezes em nosso ambiente, e então <strong>de</strong>screve o<br />

núcleo da solução para aquele problema, <strong>de</strong> maneira que se possa reutilizar esta<br />

solução um milhão <strong>de</strong> vezes <strong>de</strong>pois, sem o esforço inicial”.<br />

Os <strong>padrões</strong> são bastante utilizados em todas as fases da engenharia <strong>de</strong> software.<br />

Inicialmente, nos anos 60 a 80 as pesquisas estavam focadas no nível <strong>de</strong> implementação<br />

e <strong>padrões</strong> <strong>de</strong> programação foram largamente estudados e <strong>de</strong>finidos [52]. Agora que o<br />

nível <strong>de</strong> implementação é um nível bem entendido o foco passou a ser estruturas mais<br />

abstratas. O conceito <strong>de</strong> <strong>padrões</strong> po<strong>de</strong> ser, novamente, aplicado <strong>de</strong> maneira a prover<br />

maiores facilida<strong>de</strong>s nesta fase mais abstrata.<br />

Com a construção <strong>de</strong> arquiteturas e a experiência adquirida nesta ativida<strong>de</strong>,<br />

<strong>padrões</strong> arquiteturais foram i<strong>de</strong>ntificados e empregados em diversos sistemas e<br />

domínios [22][27]. Um padrão arquitetural ou estilo <strong>de</strong>fine uma família <strong>de</strong> sistemas em<br />

termos <strong>de</strong> sua organização estrutural [6][22]. Ele <strong>de</strong>fine o vocabulário <strong>de</strong> componentes e<br />

conectores que po<strong>de</strong>m ser usados em instâncias daquele estilo, juntamente com um<br />

conjunto <strong>de</strong> restrições <strong>de</strong> como eles po<strong>de</strong>m ser combinados.<br />

O uso <strong>de</strong> estilos proporciona diversas vantagens para a fase <strong>de</strong> <strong>de</strong>sign tais como,<br />

documenta a experiência <strong>de</strong> projetos <strong>de</strong> arquiteturas já provadas, provê vocabulário e<br />

entendimento comum, ajuda a construir arquiteturas <strong>de</strong> software complexas e<br />

heterogêneas, provê um esqueleto <strong>de</strong> comportamento funcional e ajuda a gerenciar a<br />

complexida<strong>de</strong> <strong>de</strong> sistemas [6]. Eles estão sendo largamente utilizados, puros ou híbridos<br />

[52]. Estilos arquiteturais puros são os próprios estilos em sua forma primária.<br />

Arquiteturas híbridas ou heterogêneas são aquelas que integram vários estilos para<br />

<strong>de</strong>scrição do sistema. A maioria dos sistemas é <strong>de</strong>scrita por uma arquitetura<br />

heterogênea.<br />

O uso <strong>de</strong> estilos <strong>de</strong>pen<strong>de</strong> exclusivamente das características (requisitos <strong>de</strong><br />

qualida<strong>de</strong>) que o sistema ou subsistema <strong>de</strong>verá apresentar (SHAW, GARLAN, e<br />

BUSCHMANN in [5]) [30]. Não se <strong>de</strong>ve, em hipótese alguma, escolher um estilo e<br />

9


adaptar o sistema a este estilo, pois <strong>de</strong>sta forma, o mo<strong>de</strong>lo obtido não retrata a realida<strong>de</strong><br />

pretendida. Os exemplos <strong>de</strong> estilos mais conhecidos são: Pipe and Filters, Camadas,<br />

Cliente-Servidor, Repositórios, Eventos <strong>de</strong>ntre outros.<br />

Há duas outras categorias <strong>de</strong> <strong>padrões</strong> no contexto da arquitetura [27]:<br />

• Arquitetura <strong>de</strong> referência ou Arquitetura <strong>de</strong> software <strong>de</strong> domínio específico –<br />

são estilos que se aplicam a domínios <strong>de</strong> aplicação específicos. Eles <strong>de</strong>finem<br />

como a funcionalida<strong>de</strong> do domínio é mapeada para os elementos da arquitetura.<br />

• Arquitetura <strong>de</strong> linha <strong>de</strong> produto - são estilos que se aplicam a um conjunto <strong>de</strong><br />

produtos <strong>de</strong> uma organização ou companhia.<br />

Estas categorias <strong>de</strong> <strong>padrões</strong> não são mutuamente exclusivos. Uma arquitetura <strong>de</strong><br />

referência, uma arquitetura <strong>de</strong> linha <strong>de</strong> produto e uma arquitetura <strong>de</strong> software po<strong>de</strong>m<br />

utilizar um estilo arquitetural em seu projeto. Similarmente, uma arquitetura <strong>de</strong> linha <strong>de</strong><br />

produto ou uma arquitetura <strong>de</strong> software po<strong>de</strong>m ser baseadas em uma arquitetura <strong>de</strong><br />

referência. E uma arquitetura <strong>de</strong> software po<strong>de</strong> ser parte <strong>de</strong> uma linha <strong>de</strong> produto<br />

usando a arquitetura <strong>de</strong> linha <strong>de</strong> produto para o seu <strong>de</strong>sign. Na TAB. 2-1, apresentamos<br />

um resumo das características <strong>de</strong> cada um <strong>de</strong>stes termos, <strong>de</strong>finidos em [27].<br />

Termo<br />

Estilo ou padrão arquitetural<br />

(geralmente não está relacionada a<br />

um domínio específico)<br />

Arquitetura <strong>de</strong> referência ou<br />

arquitetura <strong>de</strong> domínio específico<br />

(aplicada a um domínio particular)<br />

Arquitetura <strong>de</strong> linha <strong>de</strong> produto<br />

(aplicada a um conjunto <strong>de</strong> produtos<br />

em uma organização)<br />

Arquitetura <strong>de</strong> software (aplicada a<br />

um sistema ou produto)<br />

TABELA 2-1<br />

Comparação <strong>de</strong> termos <strong>de</strong> arquitetura <strong>de</strong> software.<br />

Define tipos <strong>de</strong><br />

elementos e<br />

como eles<br />

interagem<br />

Define um<br />

mapeamento <strong>de</strong><br />

funcionalida<strong>de</strong><br />

para elementos<br />

da arquitetura<br />

Define<br />

instâncias <strong>de</strong><br />

elementos <strong>de</strong><br />

arquitetura<br />

Sim Algumas vezes Não<br />

Sim Sim Não<br />

Sim Sim Algumas vezes<br />

Sim Sim Sim<br />

10


Assim, um padrão po<strong>de</strong> ser instanciado, resultando em um outro padrão. Em<br />

[23], Garlan <strong>de</strong>fine uma abordagem <strong>de</strong> refinamento baseada em estilos. Nesta<br />

abordagem, usa-se a idéia <strong>de</strong> sub-estilo e tenta-se i<strong>de</strong>ntificar se um sistema projetado<br />

baseado num estilo X po<strong>de</strong>ria ser projetado baseado em outro estilo Y. A idéia <strong>de</strong> subestilos<br />

(super-estilos) é a mesma utilizada na orientação a objetos para sub-classe<br />

(super-classe). Um sub-estilo é um estilo mais refinado que o estilo a partir do qual ele<br />

foi criado. Muitos dos sub-estilos po<strong>de</strong>m ser entendidos como restrições adicionais na<br />

sintaxe <strong>de</strong> um estilo mais geral [23]. Eles provêem o reuso <strong>de</strong> <strong>de</strong>scrições arquiteturais<br />

existentes e uma organização <strong>de</strong> estilos que po<strong>de</strong>m guiar o arquiteto na seleção <strong>de</strong> um<br />

paradigma apropriado para um domínio <strong>de</strong> aplicação particular [15][16].<br />

Outros termos que permeiam a arquitetura <strong>de</strong> software são: padrão <strong>de</strong> <strong>de</strong>sign e<br />

arquitetura <strong>de</strong> família. Um padrão <strong>de</strong> <strong>de</strong>sign po<strong>de</strong> ou não ser relevante para a arquitetura<br />

<strong>de</strong> software. Quando ele <strong>de</strong>screve as interações entre elementos arquiteturais, consi<strong>de</strong>rase<br />

que ele é parte da arquitetura <strong>de</strong> software. Quando ele <strong>de</strong>screve a estrutura e as<br />

interações <strong>de</strong>ntro dos elementos arquiteturais, ele é parte do <strong>de</strong>sign <strong>de</strong>talhado. A<br />

arquitetura <strong>de</strong> família é um termo utilizado para <strong>de</strong>notar uma arquitetura que representa<br />

um conjunto <strong>de</strong> sistemas que possuem algumas similarida<strong>de</strong>s. Ela po<strong>de</strong> se referir a um<br />

estilo, arquitetura <strong>de</strong> referência ou arquitetura <strong>de</strong> linha <strong>de</strong> produto.<br />

A disponibilização <strong>de</strong> <strong>padrões</strong> em geral retrata o reuso da experiência adquirida<br />

para resolução <strong>de</strong> um problema a um certo nível <strong>de</strong> generalida<strong>de</strong>. Entretanto, utilizar<br />

<strong>padrões</strong> no <strong>de</strong>senvolvimento <strong>de</strong> sistemas requer, em geral, metodologia e perspicácia.<br />

Para <strong>de</strong>senvolver um sistema a partir <strong>de</strong> um estilo é necessário, primeiramente,<br />

instanciar este estilo para elaborar a arquitetura do produto que se <strong>de</strong>seja <strong>de</strong>senvolver,<br />

veja na FIG 2-2a [18]. E <strong>de</strong>pois, <strong>de</strong>talhar esta arquitetura para a obtenção <strong>de</strong> um mo<strong>de</strong>lo<br />

passível <strong>de</strong> ser implementado (arquitetura <strong>de</strong>talhada).<br />

A arquitetura <strong>de</strong>talhada reflete as características da arquitetura do produto mas<br />

também retrata as características intrínsecas das tecnologias <strong>de</strong> implementação<br />

escolhidas para a codificação. Estas características po<strong>de</strong>m influenciar ou afetar as<br />

<strong>de</strong>cisões tomadas durante o <strong>de</strong>sign da arquitetura. Elas são características referentes à<br />

estrutura e ao comportamento dos componentes <strong>de</strong> mais alto nível, po<strong>de</strong>ndo resultar em<br />

implementações que não retratam a arquitetura. Assim, é difícil manter a consistência<br />

entre estas arquiteturas. E é igualmente difícil cada vez que um produto diferente tem<br />

que ser <strong>de</strong>senvolvido, veja na FIG. 2-2a.<br />

11


a)<br />

Estilo<br />

Fácil<br />

Instanciação<br />

Difícil<br />

Arquitetura do Produto<br />

Difícil<br />

Refinamento<br />

Estilo<br />

Refinamento<br />

Difícil<br />

b)<br />

Fácil<br />

Instanciação<br />

Médio<br />

Design Detalhado<br />

do Produto<br />

Arquitetura do Produto<br />

Difícil<br />

Refinamento<br />

Design Detalhado<br />

do Estilo<br />

Fácil<br />

Instanciação<br />

Design Detalhado<br />

do Produto<br />

Feito uma vez<br />

Feito várias vezes<br />

FIGURA 2-2 - Duas abordagens <strong>de</strong> refinamento.<br />

Conduzir o <strong>de</strong>senvolvimento a partir <strong>de</strong> um estilo, passando pela arquitetura <strong>de</strong><br />

um produto até o <strong>de</strong>sign <strong>de</strong>talhado <strong>de</strong>le é uma tarefa árdua. Egyed et al. [18] propõe<br />

uma solução para este problema. A solução consiste em <strong>de</strong>talhar a arquitetura do estilo<br />

(veja na FIG. 2-2b). Esta tarefa é igualmente árdua, porém os artefatos <strong>de</strong>sta arquitetura<br />

<strong>de</strong>talhada tornam o <strong>de</strong>sign <strong>de</strong>talhado do produto uma tarefa amena. Assim, o <strong>de</strong>sign<br />

<strong>de</strong>talhado do estilo po<strong>de</strong> ser reutilizado inúmeras vezes durante o <strong>de</strong>senvolvimento <strong>de</strong><br />

produtos diferentes, garantindo mais facilida<strong>de</strong> no <strong>de</strong>senvolvimento <strong>de</strong>stes produtos e<br />

maior consistência entre o estilo e a arquitetura <strong>de</strong>talhada <strong>de</strong> um produto baseada neste.<br />

Nós adotamos esta solução. Nesta dissertação, <strong>de</strong>finimos a arquitetura e o <strong>de</strong>sign<br />

<strong>de</strong> uma família <strong>de</strong> sistemas <strong>através</strong> <strong>de</strong> um <strong>meta</strong>-mo<strong>de</strong>lo. A família <strong>de</strong> sistemas é<br />

caracterizada pelas proprieda<strong>de</strong>s <strong>de</strong>finidas pelo estilo camadas e pelo middleware<br />

CORBA. O estilo camadas favorece a reusabilida<strong>de</strong> <strong>de</strong> componentes especializados em<br />

fornecer algum tipo <strong>de</strong> serviço como por exemplo, serviços <strong>de</strong> comunicação entre<br />

sistemas, segurança, aplicações específicas etc. A seguir, na Seção 2.1.1.1, maiores<br />

<strong>de</strong>talhes do estilo camadas são apresentados.<br />

2.1.1.1 Estilo Camadas<br />

O estilo camadas organiza o software em camadas hierárquicas. Cada camada é<br />

construída em cima <strong>de</strong> uma outra mais geral [29]. Uma camada po<strong>de</strong> ser, livremente,<br />

<strong>de</strong>finida como um conjunto <strong>de</strong> (sub)sistemas com o mesmo grau <strong>de</strong> generalida<strong>de</strong>.<br />

12


Camadas mais altas são específicas da aplicação, camadas mais baixas são <strong>de</strong> propósitos<br />

gerais, ou seja, utilizadas por diferentes aplicações.<br />

Tradicionalmente, as interações ocorrem somente entre camadas adjacentes.<br />

Cada camada provê serviços para a camada <strong>de</strong> cima e funciona como cliente para a<br />

camada <strong>de</strong> baixo. Os sistemas constituintes <strong>de</strong> cada camada po<strong>de</strong>m ser, também,<br />

estruturados em outras camadas ou seguir algum outro estilo arquitetural existente, puro<br />

ou heterogêneo. Esta <strong>de</strong>cisão <strong>de</strong>pen<strong>de</strong>rá da complexida<strong>de</strong> e características globais <strong>de</strong><br />

cada uma das camadas [52].<br />

Um exemplo clássico <strong>de</strong>ste estilo é o padrão OSI da ISO para re<strong>de</strong>s <strong>de</strong><br />

computadores, on<strong>de</strong> cada camada é responsável por um aspecto específico da<br />

comunicação entre computadores, dos <strong>de</strong>talhes <strong>de</strong> transmissão <strong>de</strong> bits (sinais elétricos)<br />

pelo meio físico até o alto nível lógico da aplicação.<br />

O estilo camadas agrega aos sistemas várias proprieda<strong>de</strong>s <strong>de</strong>sejáveis [52]:<br />

• Oferece suporte ao <strong>de</strong>sign baseado em níveis crescentes <strong>de</strong> abstração - isto<br />

permite implementadores dividirem um problema complexo em uma seqüência<br />

<strong>de</strong> passos incrementais;<br />

• Oferece suporte a mudanças - pois cada camada interage somente com suas<br />

camadas adjacentes, então mudanças em uma camada afetam no máximo duas<br />

outras camadas;<br />

• Oferece suporte ao reuso - diferentes implementações <strong>de</strong> uma mesma camada<br />

po<strong>de</strong>m ser usadas, <strong>de</strong>s<strong>de</strong> que elas possuam as mesmas interfaces para as<br />

camadas adjacentes;<br />

• A segurança po<strong>de</strong> ser suportada por camadas específicas para este serviço.<br />

Porém, sistemas em camadas também possuem algumas <strong>de</strong>svantagens [52]:<br />

• Nem todos os sistemas são facilmente estruturados em camadas;<br />

• Para os sistemas que po<strong>de</strong>m ser estruturados em camadas a questão <strong>de</strong><br />

<strong>de</strong>sempenho é <strong>de</strong>licada, pois há um certo tempo e processamento <strong>de</strong>sperdiçado<br />

na comunicação entre camadas;<br />

• Falhas em uma camada po<strong>de</strong>m tornar o sistema indisponível, já que cada<br />

camada funciona como intermediária para comunicação <strong>de</strong> duas outras camadas.<br />

13


Um exemplo <strong>de</strong> arquitetura para aplicações <strong>de</strong> software é a arquitetura <strong>de</strong> quatro<br />

camadas apresentada por Jacobson et al. [29], mostrada na FIG. 2-3. O número <strong>de</strong><br />

camadas, o nome e o conteúdo <strong>de</strong>las não é fixo, e variam <strong>de</strong> situação para situação, são<br />

elas:<br />

• Sistemas <strong>de</strong> aplicação (ou simplesmente aplicação) - Cada aplicação oferece um<br />

conjunto coerente <strong>de</strong> casos <strong>de</strong> uso para algum usuário final. Aplicações po<strong>de</strong>m<br />

interoperar diretamente com outras <strong>através</strong> <strong>de</strong> suas interfaces ou, também,<br />

interoperar indiretamente <strong>através</strong> <strong>de</strong> algum serviço ou objeto provido por um<br />

sistema em alguma das camadas mais baixas, tais como um Object Request<br />

Broker (ORB), sistema operacional, ou serviços específicos do negócio.<br />

• Sistemas Específicos do Negócio - Contém um número <strong>de</strong> sistemas <strong>de</strong><br />

componentes específicos para o tipo <strong>de</strong> negócio. Tais sistemas <strong>de</strong> componentes<br />

oferecem casos <strong>de</strong> uso e componentes objetos para os <strong>de</strong>senvolvedores<br />

construírem aplicações e são, freqüentemente, reusáveis pelas aplicações<br />

<strong>de</strong>senvolvidas por um domínio <strong>de</strong> reuso particular.<br />

• Middleware - Oferece sistemas <strong>de</strong> componentes que provêm classes <strong>de</strong> utilida<strong>de</strong><br />

e serviços in<strong>de</strong>pen<strong>de</strong>ntes da plataforma tais como computação <strong>de</strong> objeto<br />

distribuído em ambientes heterogêneos. Esta camada contém sistemas <strong>de</strong><br />

componentes para construtores GUI (Graphical User Interface), interfaces para<br />

sistemas gerenciadores <strong>de</strong> banco <strong>de</strong> dados, serviços do sistema operacional<br />

in<strong>de</strong>pen<strong>de</strong>nte <strong>de</strong> plataforma, ORBs e componentes OLE.<br />

• Software do Sistema - Específico da plataforma, contém o software para a<br />

infraestrutura atual tal como sistema operacional, interfaces para hardware<br />

específico e assim por diante.<br />

Sistemas <strong>de</strong> aplicação<br />

Sistemas específicos do negócio<br />

Middleware<br />

Software do sistema<br />

FIGURA 2-3 - Uma arquitetura em camadas para aplicações <strong>de</strong> negócio.<br />

14


Estas camadas são estruturais e representam um sistema, completamente, sob um<br />

ponto <strong>de</strong> vista <strong>de</strong> alta granularida<strong>de</strong>, <strong>de</strong>vendo assim ser refinadas até um nível <strong>de</strong><br />

abstração on<strong>de</strong> sejam, apropriadamente, implementadas em uma linguagem <strong>de</strong><br />

programação. Componentes po<strong>de</strong>m ter níveis <strong>de</strong> granularida<strong>de</strong> diferentes tais como<br />

pequeno, médio e gran<strong>de</strong>. Os pequenos são, em geral, mais fáceis <strong>de</strong> <strong>de</strong>senvolver e mais<br />

difíceis <strong>de</strong> compor. Eles são similares às classes <strong>de</strong> objeto e são, normalmente, <strong>de</strong><br />

propósito geral. Componentes médios e gran<strong>de</strong>s são mais difíceis <strong>de</strong> <strong>de</strong>senvolver porém<br />

a composição <strong>de</strong>les é mais fácil do que a <strong>de</strong> componentes pequenos. Estes são<br />

geralmente <strong>de</strong> propósito específico a um domínio. Componentes maiores são<br />

constituídos <strong>de</strong> componentes menores [19].<br />

Outro exemplo do uso <strong>de</strong>ste estilo é a Arquitetura <strong>de</strong> Gerenciamento <strong>de</strong> Objetos<br />

(OMA) <strong>de</strong>finida pelo OMG (Object Manegement Group) para integrar aplicações<br />

distribuídas. Esta arquitetura fornece o grau <strong>de</strong> transparência <strong>de</strong>sejado para construir<br />

sistemas distribuídos sem se preocupar com problemas complexos tais como a<br />

distribuição e heterogeneida<strong>de</strong> <strong>de</strong> plataformas [8][41][42]. Na Seção 2.3 apresentamos<br />

maiores <strong>de</strong>talhes <strong>de</strong>sta arquitetura.<br />

Na literatura, algumas variantes do estilo camadas são comumente encontradas,<br />

como por exemplo [6]:<br />

• Relaxed Layered System que é menos restritivo sobre a relação entre camadas.<br />

Cada camada po<strong>de</strong> interagir com outras camadas que não estão adjacentes a ela,<br />

imediatamente abaixo ou acima. Uma camada po<strong>de</strong> também ser parcialmente<br />

opaca, isto significa que alguns serviços só são visíveis para a camada<br />

imediatamente superior, mas outros são visíveis para qualquer camada.<br />

• Layering Through Inheritance, on<strong>de</strong> camadas mais baixas são implementadas<br />

como classes básicas. As camadas <strong>de</strong> nível mais alto requisitam serviços das<br />

camadas mais baixas por herdar a implementação <strong>de</strong>stas camadas.<br />

Conseqüentemente, elas po<strong>de</strong>m requisitar serviços das classes básicas. Uma<br />

vantagem <strong>de</strong>ste esquema é que as camadas mais altas po<strong>de</strong>m modificar os<br />

serviços das classes básicas <strong>de</strong> acordo com suas necessida<strong>de</strong>s. Por outro lado, a<br />

relação <strong>de</strong> herança conduz a uma ligação muito forte entre camadas <strong>de</strong> nível<br />

baixo e nível alto.<br />

• Outras variantes po<strong>de</strong>m ser obtidas por modificar o tipo das camadas – que po<strong>de</strong><br />

ser black, white ou gray, o tipo <strong>de</strong> comunicação – push, pull e callback, o modo<br />

<strong>de</strong> comunicação – síncrono, assíncrono, sícrono <strong>de</strong>ferido, ou o sentido da<br />

15


comunicação entre elas – top-down e bottom-up entre camadas adjacentes ou<br />

não-adjacentes.<br />

2.1.2 Visões<br />

Como <strong>de</strong>finido por IEEE Draft Standard 1471, uma visão en<strong>de</strong>reça um ou mais<br />

interesses <strong>de</strong> um stakehol<strong>de</strong>r (<strong>de</strong>senvolvedor, usuário, cliente, etc) do sistema [17].<br />

Genericamente estes interesses são funcionais, não-funcionais e organizacionais. Assim,<br />

uma visão po<strong>de</strong> fornecer informações sobre os requisitos, a organização, as pessoas, a<br />

tecnologia, o histórico <strong>de</strong> mudanças, a estrutura do produto, suas transições etc.,<br />

utilizando-se <strong>de</strong> alguma linguagem para <strong>de</strong>screver seus aspectos <strong>de</strong> interesse, seja esta<br />

uma linguagem natural, gráfica ou formal.<br />

No livro intitulado Applied Software Architecture [27] são <strong>de</strong>finidas quatro<br />

visões arquiteturais. Este livro é fruto da experiência <strong>de</strong> seus autores na área <strong>de</strong><br />

arquitetura <strong>de</strong> software, e constitui um guia <strong>de</strong>talhado e prático para as tarefas <strong>de</strong><br />

arquitetura <strong>de</strong> software. Seus autores tendo como ponto <strong>de</strong> partida os aspectos<br />

necessários para a criação da arquitetura <strong>de</strong> um sistema, criaram quatro <strong>meta</strong>-mo<strong>de</strong>los<br />

retratando estas características, ou visões arquiteturais. Cada uma <strong>de</strong>las po<strong>de</strong> ser<br />

utilizada separadamente e en<strong>de</strong>reça diferentes interesses da arquitetura. São elas:<br />

Visão conceitual – Descreve o sistema em termos <strong>de</strong> seus elementos <strong>de</strong> <strong>de</strong>sign e as<br />

relações entre eles (configuração). Nesta visão, a funcionalida<strong>de</strong> do sistema é mapeada<br />

para os elementos da arquitetura chamados componentes, com a coor<strong>de</strong>nação e troca <strong>de</strong><br />

dados mapeada por elementos chamados conectores. Os componentes e os conectores<br />

possuem pontos <strong>de</strong> interação <strong>de</strong>nominados portas e papéis, respectivamente. Cada porta<br />

e papel está associado a um protocolo que <strong>de</strong>fine como as operações <strong>de</strong> entrada e saída<br />

são or<strong>de</strong>nadas.<br />

A Visão Conceitual é a visão relevante para este trabalho <strong>de</strong> dissertação. A partir<br />

<strong>de</strong>la nós <strong>de</strong>finimos o <strong>meta</strong>-mo<strong>de</strong>lo proposto por esta dissertação. Detalhes <strong>de</strong>sta visão e<br />

da relação <strong>de</strong>la com o <strong>meta</strong>-mo<strong>de</strong>lo são apresentados na Seção 3.3.<br />

Visão <strong>de</strong> módulo – Nesta visão, os componentes e conectores da visão conceitual são<br />

mapeados para subsistemas e módulos, e estes organizados em camadas. O foco <strong>de</strong>sta<br />

16


visão é como a solução conceitual po<strong>de</strong> ser realizada pelas tecnologias e plataformas <strong>de</strong><br />

software atuais.<br />

Os subsistemas correspon<strong>de</strong>m aos componentes conceituais <strong>de</strong> mais alto nível.<br />

São componentes que po<strong>de</strong>m ser <strong>de</strong>compostos em outros componentes e conectores, ele<br />

po<strong>de</strong> conter outros subsistemas ou módulos. Um módulo po<strong>de</strong> correspon<strong>de</strong>r a um único<br />

elemento conceitual (componente, porta, conector, ou papel) ou a um conjunto <strong>de</strong>les,<br />

eles po<strong>de</strong>m ser <strong>de</strong>compostos em outros módulos, mas neste caso o módulo pai é um<br />

container.<br />

Os módulos encapsulam dados e operações para prover/requerer um serviço, que<br />

é <strong>de</strong>finido pela interface que o módulo provê/requer. Camadas organizam os módulos<br />

em uma hierarquia e também provêem/requerem interfaces.<br />

Visão <strong>de</strong> execução – Descreve como módulos são mapeados para os elementos providos<br />

pela plataforma <strong>de</strong> execução, e como estes são mapeadas para a arquitetura <strong>de</strong><br />

hardware. A visão <strong>de</strong> execução <strong>de</strong>fine as entida<strong>de</strong>s <strong>de</strong> tempo <strong>de</strong> execução e seus<br />

atributos.<br />

É necessário realizar uma análise das plataformas <strong>de</strong> hardware e software que<br />

serão utilizadas. Para a plataforma <strong>de</strong> hardware é necessário listar os componentes <strong>de</strong><br />

hardware utilizados no sistema e a topologia e interconexão <strong>de</strong>stes componentes. Para a<br />

plataforma <strong>de</strong> software é necessário conhecer a infraestrutura <strong>de</strong> software que está entre<br />

o produto e a plataforma <strong>de</strong> hardware, geralmente o Sistema Operacional. Então,<br />

mapeia-se os componentes conceituais e módulos para estes elementos da plataforma,<br />

geralmente módulos são assinados para entida<strong>de</strong>s <strong>de</strong> execução, e a maneira que eles se<br />

comunicam.<br />

Visão <strong>de</strong> código – Determina a organização do código fonte <strong>de</strong>ntro <strong>de</strong> código objeto,<br />

bibliotecas e binários por mapear os elementos das visões <strong>de</strong> Módulo e <strong>de</strong> Execução<br />

para componentes <strong>de</strong> código e organizá-los. Tal mapeamento po<strong>de</strong> variar com a<br />

linguagem <strong>de</strong> programação utilizada. O objetivo principal <strong>de</strong>sta visão é facilitar a<br />

construção, integração, instalação e teste do sistema, respeitando a integrida<strong>de</strong> das<br />

outras três visões.<br />

17


Estas quatro visões representam o mínimo a consi<strong>de</strong>rar quando se <strong>de</strong>seja projetar<br />

a arquitetura <strong>de</strong> um sistema <strong>de</strong> software. Em [27], encontramos, também, um processo<br />

para o <strong>de</strong>senvolvimento <strong>de</strong> arquiteturas utilizando estes <strong>meta</strong>-mo<strong>de</strong>los.<br />

Outras visões normalmente consi<strong>de</strong>radas durante todo o <strong>de</strong>sign são as visões<br />

estática e dinâmica. A visão estática, fornece os elementos da arquitetura e como eles<br />

estão relacionados. A visão dinâmica, oferece como estes elementos interagem entre si e<br />

como funcionam.<br />

A notação utilizada para especificar estas visões foi a notação <strong>de</strong>finida pela<br />

UML. Embora a UML seja mais utilizada para <strong>de</strong>screver aspectos do nível mais<br />

<strong>de</strong>talhado do <strong>de</strong>sign, ela dá suporte à <strong>de</strong>scrição da maioria dos conceitos que se <strong>de</strong>sejava<br />

nesta abordagem, e a vantagem <strong>de</strong> usar uma notação padronizada e bem entendida se<br />

sobrepôs à <strong>de</strong>svantagem <strong>de</strong>la não dar suporte a alguns dos conceitos arquiteturais. Na<br />

Seção 2.2, nós apresentaremos um pouco <strong>de</strong>sta linguagem e as vantagens que ela po<strong>de</strong><br />

trazer para o <strong>de</strong>sign <strong>de</strong> arquiteturas <strong>de</strong> software.<br />

2.2 Linguagens Utilizadas<br />

As linguagens <strong>de</strong> representação <strong>de</strong>sempenham um papel fundamental durante o<br />

<strong>de</strong>senvolvimento <strong>de</strong> um sistema <strong>de</strong> software. Elas são responsáveis por transmitir todos<br />

os <strong>de</strong>talhes do <strong>de</strong>sign para os diversos stakehol<strong>de</strong>rs <strong>de</strong> maneira amigável, clara e nãoambígua.<br />

Além <strong>de</strong> documentar todo o <strong>de</strong>sign para futuras manutenções.<br />

Entretanto, uma única linguagem dificilmente apresenta todas estas<br />

características numa intensida<strong>de</strong> satisfatória para todos os stakehol<strong>de</strong>rs. Há diferentes<br />

interesses nas diversas fases do <strong>de</strong>sign e os <strong>de</strong>senvolvedores <strong>de</strong> cada fase estão mais<br />

habituados a certas linguagens estando menos receptivos a outras.<br />

Com o intuito <strong>de</strong> oferecer maior representativida<strong>de</strong> e comunicabilida<strong>de</strong> ao <strong>meta</strong>mo<strong>de</strong>lo<br />

que estamos propondo, nós utilizamos a UML. A UML po<strong>de</strong> ser utilizada nas<br />

diversas fases do <strong>de</strong>sign e é um bom meio <strong>de</strong> comunicação entre os projetistas, tanto por<br />

ser muito difundida quanto por ser facilmente entendida e aprendida.<br />

No entanto, reconhecemos o valor do formalismo para especificar a arquitetura<br />

<strong>de</strong> um sistema específico ou, no nosso caso, <strong>de</strong> estilos arquiteturais. Formalizar um<br />

estilo arquitetural tem, no mínimo, dois propósitos: tornar preciso os vocabulários,<br />

<strong>padrões</strong> e arquiteturas <strong>de</strong> referência agora usados informalmente por projetistas; e para<br />

18


elucidar uma parte do espaço arquitetural por mostrar como diferentes arquiteturas<br />

po<strong>de</strong>m ser tratadas como especializações <strong>de</strong> uma abstração comum [52].<br />

A seguir, apresentamos as linguagens utilizadas neste trabalho <strong>de</strong> dissertação. A<br />

linguagem <strong>de</strong> mo<strong>de</strong>lagem UML, na Seção 2.2.1, e a linguagem <strong>de</strong> especificação formal<br />

Z, na Seção 2.2.2.<br />

2.2.1 UML<br />

A UML (Unified Mo<strong>de</strong>ling Language) surgiu por volta <strong>de</strong> 1995 com o intuito <strong>de</strong><br />

padronizar uma linguagem para mo<strong>de</strong>lagem <strong>de</strong> sistemas. Ela se esten<strong>de</strong> a qualquer tipo<br />

<strong>de</strong> sistema e se propõe a dar suporte a todo o processo <strong>de</strong> <strong>de</strong>senvolvimento <strong>de</strong> software<br />

[4].<br />

A UML é composta por um conjunto <strong>de</strong> nove diagramas com sintaxe e<br />

semântica bem <strong>de</strong>finidas. São eles: Diagrama <strong>de</strong> casos <strong>de</strong> uso, <strong>de</strong> classes, <strong>de</strong> objetos, <strong>de</strong><br />

seqüência, <strong>de</strong> colaboração, <strong>de</strong> estados, <strong>de</strong> ativida<strong>de</strong>s, <strong>de</strong> implantação e <strong>de</strong> componentes.<br />

Cada um <strong>de</strong>les retrata aspectos diferentes do sistema. Conjuntamente eles retratam os<br />

diferentes aspectos (visões) do sistema. Uma <strong>de</strong>scrição <strong>de</strong>talhada da UML po<strong>de</strong> ser<br />

encontrada em [20][46].<br />

A UML vem sendo largamente utilizada pelas diversas subáreas da engenharia<br />

<strong>de</strong> software <strong>de</strong>vido a sua expressivida<strong>de</strong> e flexibilida<strong>de</strong>. Pesquisadores da área <strong>de</strong><br />

arquitetura <strong>de</strong> software têm mostrado gran<strong>de</strong> interesse em integrar a UML às técnicas e<br />

linguagens existentes para <strong>de</strong>scrição <strong>de</strong> arquiteturas [34][48][49]. Ela, também vem<br />

sendo analisada para verificar se ela aten<strong>de</strong> aos requisitos arquiteturais e como ela po<strong>de</strong><br />

ser utilizada para tal propósito [9][25][37].<br />

Entretanto, uma arquitetura apresenta um conjunto <strong>de</strong> características que <strong>de</strong>vem<br />

ser mo<strong>de</strong>ladas por linguagens <strong>de</strong> <strong>de</strong>scrição a<strong>de</strong>quadas, as ADLs, apresentada na Seção<br />

2.1 [10][37]. A UML representa boa parte <strong>de</strong>stas características embora não seja uma<br />

ADL [34][53]. No ANEXO A, apresentamos uma análise comparativa entre UML e as<br />

ADLs.<br />

Um dos aspectos importantes não satisfeito pela UML é quanto à <strong>de</strong>scrição <strong>de</strong><br />

estilos. Este aspecto é en<strong>de</strong>reçado, apenas, parcialmente pela UML. A UML não possui<br />

estilos pré-<strong>de</strong>finidos, e nem mesmo o conceito <strong>de</strong> estilos. Entretanto, <strong>de</strong>vido a sua<br />

flexibilida<strong>de</strong>, a UML é capaz <strong>de</strong> <strong>de</strong>screver qualquer tipo <strong>de</strong> sistema a qualquer nível <strong>de</strong><br />

19


abstração, englobando tanto seus aspectos estáticos quanto dinâmicos. Assim, é possível<br />

representar <strong>meta</strong>-mo<strong>de</strong>los e a partir <strong>de</strong>stes, estilos [53].<br />

Estes <strong>meta</strong>-mo<strong>de</strong>los po<strong>de</strong>m ser instanciados para arquiteturas específicas,<br />

obtendo-se arquiteturas <strong>de</strong>scritas em nível <strong>de</strong> projeto seguindo algum padrão<br />

arquitetural específico. A representação <strong>de</strong> estilos em UML po<strong>de</strong> proporcionar maior<br />

consistência entre arquiteturas <strong>de</strong> software e mo<strong>de</strong>los <strong>de</strong> <strong>de</strong>sign, além <strong>de</strong> oferecer<br />

melhor comunicação entre arquitetos e projetistas.<br />

Para que esta prática traga os benefícios almejados é necessário que os estilos<br />

sejam mo<strong>de</strong>lados <strong>de</strong> maneira bastante fiel, sem que se perca nenhuma das proprieda<strong>de</strong>s<br />

<strong>de</strong>finidas por eles. A <strong>de</strong>scrição <strong>de</strong> restrições é um ponto muito importante para os<br />

estilos. As restrições <strong>de</strong>vem ser <strong>de</strong>scritas <strong>de</strong> maneira precisa, sendo necessário utilizar<br />

linguagens semi-formais ou formais, já que o suporte à <strong>de</strong>scrição <strong>de</strong>stas restrições dado<br />

pela UML é somente <strong>através</strong> <strong>de</strong> “Notas” (elemento <strong>de</strong>finido pela UML).<br />

2.2.1.1 Terminologia<br />

Embora utilize uma notação e terminologia idêntica a utilizada pelo paradigma <strong>de</strong><br />

orientação a objetos, a UML é uma linguagem cujo propósito é mo<strong>de</strong>lar qualquer tipo<br />

<strong>de</strong> sistema, em qualquer nível <strong>de</strong> abstração. Neste caso, um diagrama <strong>de</strong> classes po<strong>de</strong><br />

representar elementos: <strong>de</strong> alta abstração, on<strong>de</strong> seus atributos e métodos representam, <strong>de</strong><br />

maneira geral, as suas características e funcionalida<strong>de</strong>s; ou <strong>de</strong> baixa abstração, prontos<br />

para serem traduzidos em linguagens <strong>de</strong> programação e então, serem executados. Não<br />

há uma concordância em como representar arquiteturas <strong>através</strong> da UML. Em [25] são<br />

apresentadas várias abordagens.<br />

Para retratar um sistema, a UML também utiliza visões. Cada um <strong>de</strong> seus<br />

diagramas, é consi<strong>de</strong>rado uma visão [17], já que representam aspectos e interesses<br />

diferentes. E há também, a visão estática e a visão dinâmica. A primeira representada<br />

pelos diagramas <strong>de</strong> casos <strong>de</strong> uso e <strong>de</strong> classes, e a segunda pelos outros diagramas.<br />

Na UML, o termo componente é utilizado, porém possui uma conotação<br />

diferente da empregada pela arquitetura <strong>de</strong> software. Para a UML um componente é um<br />

elemento <strong>de</strong> código po<strong>de</strong>ndo ser uma biblioteca, um executável, um banco <strong>de</strong> dados etc,<br />

ou seja, po<strong>de</strong> ser o código <strong>de</strong> um único objeto ou <strong>de</strong> um agrupamento <strong>de</strong>les. Enquanto<br />

que, como <strong>de</strong>finimos na Seção 2.1, para a arquitetura <strong>de</strong> software um componente é um<br />

20


elemento computacional abstrato, po<strong>de</strong> até ser um objeto, mas não um código <strong>de</strong><br />

software.<br />

2.2.2 Linguagem <strong>de</strong> Especificação Z<br />

A linguagem Z é uma linguagem formal baseada na teoria dos conjuntos [58]. Z<br />

adiciona a noção básica <strong>de</strong> teoria dos conjuntos a idéia <strong>de</strong> que os objetos em seu<br />

universo po<strong>de</strong>m ser classificados em diferentes tipos, e que não há sobreposição entre<br />

tipos distintos.<br />

Outra característica <strong>de</strong> Z é uma estrutura, conhecida como esquema. Os<br />

esquemas nos permitem agrupar <strong>de</strong>scrições <strong>de</strong> objetos <strong>de</strong>ntro <strong>de</strong> unida<strong>de</strong>s nomeadas que<br />

po<strong>de</strong>m ser referenciadas em todas as partes da especificação [58][59]. Nós utilizamos a<br />

linguagem Z para especificar os elementos arquiteturais <strong>de</strong>finidos no <strong>meta</strong>-mo<strong>de</strong>lo,<br />

<strong>de</strong>stacando as restrições que foram pobremente mo<strong>de</strong>ladas ou não mo<strong>de</strong>ladas pela<br />

UML.<br />

A escolha <strong>de</strong>sta linguagem em lugar <strong>de</strong> uma ADL ou da OCL (Object<br />

Constraints Language) [47], que possui maior integração com a UML, <strong>de</strong>ve-se às suas<br />

características intrínsecas que nos permite atingir o nosso propósito que é especificar<br />

livremente os elementos arquiteturais <strong>através</strong> dos seus atributos e restrições. Para<br />

oferecer suporte a utilização da linguagem Z, nós utilizamos a ferramenta Z-Eves [43]<br />

versão 2.1. Z-Eves permitiu-nos realizar uma verificação <strong>de</strong> tipos da especificação.<br />

Para utilizar uma ADL nós precisaríamos fazer um estudo rigoroso <strong>de</strong> quais<br />

ADLs dão suporte à <strong>de</strong>scrição <strong>de</strong> estilos sem impor um mo<strong>de</strong>lo arquitetural diferente do<br />

<strong>de</strong>finido pela visão conceitual apresentado na Seção 2.1.2. A OCL, por sua vez, é uma<br />

linguagem estereotipada que serviria ao nosso propósito, mas ela não possui as<br />

ferramentas <strong>de</strong> análise que Z possui.<br />

2.2.3 Utilizando UML e Z<br />

Nesta dissertação, utilizamos o diagrama <strong>de</strong> classes da UML para <strong>de</strong>screver e retratar a<br />

estrutura estática do <strong>meta</strong>-mo<strong>de</strong>lo, objeto <strong>de</strong> nosso estudo. Os elementos arquiteturais<br />

<strong>de</strong>finidos em UML foram também <strong>de</strong>finidos em Z. A especificação em Z acrescenta<br />

algumas restrições vitais que não po<strong>de</strong>m ou são pobremente <strong>de</strong>finidas em UML. Os<br />

21


diagramas <strong>de</strong> seqüências e estados da UML foram utilizados para <strong>de</strong>screver a estrutura<br />

dinâmica <strong>de</strong>ste <strong>meta</strong>-mo<strong>de</strong>lo.<br />

A utilização <strong>de</strong>stas duas linguagens objetiva oferecer ao <strong>meta</strong>-mo<strong>de</strong>lo, tanto<br />

facilida<strong>de</strong> <strong>de</strong> entendimento e aprendizagem quanto suporte formal, favorecendo e<br />

facilitando a divulgação do próprio <strong>meta</strong>-mo<strong>de</strong>lo e futuramente a criação <strong>de</strong> ferramentas<br />

que automatizem e integrem estas especificações.<br />

2.3 CORBA<br />

CORBA (Common Object Request Broker Architeture) é uma plataforma <strong>de</strong><br />

middleware que tem a função <strong>de</strong> realizar a comunicação entre aplicações que são<br />

executadas em um ambiente distribuído e heterogêneo [41][42]. CORBA <strong>de</strong>spontou<br />

como padrão e está sendo muito utilizado, uma vez que a necessida<strong>de</strong> <strong>de</strong> se ter uma<br />

tecnologia <strong>de</strong> objetos distribuídos para construção <strong>de</strong> aplicações baseadas no mo<strong>de</strong>lo<br />

cliente/servidor se tornou uma realida<strong>de</strong> nos dias atuais. No mercado, já po<strong>de</strong>m ser<br />

encontradas algumas implementações do padrão CORBA, sendo as mais conhecidas<br />

VisiBroker [57], OrbixWeb [28] e ORBacus [40].<br />

CORBA foi escolhido como plataforma nesse trabalho porque apresenta a<br />

vantagem <strong>de</strong> possibilitar o <strong>de</strong>senvolvimento <strong>de</strong> aplicações cujos componentes são<br />

escritos em diversas linguagens <strong>de</strong> programação e por ser um padrão in<strong>de</strong>pen<strong>de</strong>nte <strong>de</strong><br />

plataformas <strong>de</strong> software. O fato <strong>de</strong> CORBA ser um padrão aberto faz <strong>de</strong>le um mo<strong>de</strong>lo<br />

dominante, uma vez que esta característica facilita a obtenção <strong>de</strong> um maior grau <strong>de</strong><br />

flexibilida<strong>de</strong> e escalabilida<strong>de</strong>, que são requisitos fundamentais para sistemas<br />

distribuídos [32].<br />

Na Seção 2.3.1, apresentamos alguns termos e conceitos utilizados no contexto<br />

<strong>de</strong> CORBA e da arquitetura <strong>de</strong> software que, algumas vezes, assumem significados<br />

diferentes. Nas seções 2.3.3 e 2.3.4, nós <strong>de</strong>talhamos CORBA levando em consi<strong>de</strong>ração<br />

as características relevantes para esta dissertação.<br />

2.3.1 Consi<strong>de</strong>rações Iniciais<br />

CORBA é, geralmente, referenciado como um padrão e não como uma arquitetura, pois<br />

ele apresenta um esquema <strong>de</strong> distribuição genérico, que serve como base para a<br />

22


construção <strong>de</strong> muitas configurações específicas [12]. Como apresentamos na Seção<br />

2.1.1, TAB. 2-1, uma arquitetura <strong>de</strong> software <strong>de</strong>fine instâncias para os seus elementos,<br />

diferentemente <strong>de</strong> CORBA. De acordo com a TAB. 2-1, CORBA po<strong>de</strong> ser referenciado<br />

como um padrão ou como uma arquitetura <strong>de</strong> referência, pois ele <strong>de</strong>fine uma<br />

funcionalida<strong>de</strong> para os seus elementos.<br />

CORBA surgiu no contexto da orientação a objetos. Com o intuito <strong>de</strong> aproveitar<br />

os benefícios <strong>de</strong>ste paradigma, principalmente, a noção <strong>de</strong> encapsulamento dos dados e<br />

da implementação <strong>de</strong> um objeto atrás <strong>de</strong> sua interface [3]. Por estar no âmbito da<br />

orientação a objetos, a terminologia utilizada no contexto <strong>de</strong> CORBA é diferente da<br />

utilizada na Arquitetura <strong>de</strong> software ou, às vezes, é a mesma terminologia porém com<br />

uma conotação diferente. Estes dois contextos possuem níveis <strong>de</strong> abstração diferentes,<br />

mas seus conceitos po<strong>de</strong>m ser relacionados [12]:<br />

• No contexto <strong>de</strong> CORBA, fala-se somente <strong>de</strong> objetos, ou <strong>de</strong> componentes mas,<br />

neste caso, <strong>de</strong>notam um objeto ou o código que o implementa. Os componentes<br />

são objetos escritos em uma linguagem <strong>de</strong> programação prontos para serem<br />

executados. Os objetos po<strong>de</strong>m ser um cliente ou uma implementação <strong>de</strong> objeto<br />

<strong>de</strong>nominada, servidor. Cada componente, em CORBA, tem duas partes<br />

disjuntas, uma funcional e uma que interage com o mundo externo, a interface.<br />

Na arquitetura <strong>de</strong> software um componente é mais que um objeto, como <strong>de</strong>finido<br />

na Seção 2.1, mas assim como CORBA, ela consi<strong>de</strong>ra um componente como<br />

duas partes disjuntas, o componente e seus pontos <strong>de</strong> interação, as portas.<br />

• CORBA impõe um único tipo <strong>de</strong> interação, a semântica <strong>de</strong> chamada <strong>de</strong><br />

procedimento. Através <strong>de</strong>ste tipo <strong>de</strong> interação po<strong>de</strong>-se representar (simular)<br />

qualquer tipo <strong>de</strong> interação. Na arquitetura <strong>de</strong> software, os conectores po<strong>de</strong>m vir<br />

a ser representados por chamadas <strong>de</strong> procedimento, mas po<strong>de</strong>riam ser<br />

representadas <strong>de</strong> outras maneiras também, tais como pipes etc.<br />

Assim, CORBA é uma instância <strong>de</strong> um padrão mais genérico, para a<br />

implementação utilizando o paradigma <strong>de</strong> orientação a objetos, sendo, assim, uma<br />

solução <strong>de</strong> implementação. Como um objeto po<strong>de</strong> representar/simular o comportamento<br />

<strong>de</strong> qualquer tipo <strong>de</strong> componente arquitetural, po<strong>de</strong>-se consi<strong>de</strong>rar um componente em<br />

CORBA como sendo uma entida<strong>de</strong> <strong>de</strong> alta abstração, mas neste caso, para ser<br />

implementado ele tem que ser refinado/instanciado [12].<br />

23


Outro termo comumente utilizado no contexto <strong>de</strong> CORBA e arquitetura <strong>de</strong><br />

software mas com significados diferentes é o termo “Arquitetura <strong>de</strong> CORBA”. A<br />

arquitetura <strong>de</strong> CORBA, no contexto <strong>de</strong> arquitetura <strong>de</strong> software, <strong>de</strong>nota como CORBA<br />

está estruturado internamente e como ele interage com o mundo externo, no caso,<br />

clientes e servidores. Entretanto, no contexto <strong>de</strong> CORBA, este termo é, também,<br />

utilizado para <strong>de</strong>notar como construir aplicações que utilizam CORBA ou, como<br />

construir implementações <strong>de</strong> CORBA [27].<br />

Nesta dissertação adotamos a terminologia utilizada por CORBA, mas levando<br />

em consi<strong>de</strong>ração as diferenças e similarida<strong>de</strong>s comentadas aqui.<br />

2.3.2 Arquitetura <strong>de</strong> Gerenciamento <strong>de</strong> Objetos<br />

A OMA (Object Management Architecture) foi <strong>de</strong>finida pela OMG (Object<br />

Management Group) para integrar aplicações. A OMA agrupa o conjunto <strong>de</strong> objetos<br />

CORBA (Common Object Request Broker Architecture) em serviços e facilida<strong>de</strong>s que<br />

oferecem suporte para o <strong>de</strong>senvolvimento <strong>de</strong> aplicações que usam objetos CORBA<br />

[8][41][42][44]. Os principais componentes da OMA po<strong>de</strong>m ser visualizados como na<br />

FIG 2-8 e são assim <strong>de</strong>scritos:<br />

• ORB CORBA (Object Request Broker) - Ele provê a infraestrutura necessária<br />

para que os objetos façam e recebam requisições transparentemente, em um<br />

ambiente distribuído e heterogêneo. O ORB fornece convenções para nomear,<br />

localizar, ligar e interagir com objetos, provendo portabilida<strong>de</strong> e<br />

interoperabilida<strong>de</strong> aos sistemas.<br />

• Serviços CORBA – São coleções <strong>de</strong> serviços que dão suporte a funções comuns<br />

<strong>de</strong> sistemas distribuídos. Como por exemplo, serviços <strong>de</strong> nomes, <strong>de</strong> eventos <strong>de</strong><br />

trading etc. Os serviços provêem consistência para as aplicações e ajudam a<br />

aumentar a produtivida<strong>de</strong> do programador, já que estes po<strong>de</strong>rão concentrar seus<br />

esforços em seus objetos (os da aplicação), sem ter que se preocupar com<br />

serviços em nível <strong>de</strong> sistema.<br />

• Objetos Facilida<strong>de</strong>s – É uma coleção <strong>de</strong> facilida<strong>de</strong>s e objetos comuns que<br />

provêem um conjunto <strong>de</strong> funções <strong>de</strong> aplicação genérica que po<strong>de</strong>m ser<br />

configuradas para os requisitos específicos <strong>de</strong> uma aplicação. São facilida<strong>de</strong>s<br />

como impressão, gerenciamento <strong>de</strong> documentos, banco <strong>de</strong> dados, correio<br />

eletrônico etc.<br />

24


• Objetos do Domínio – Representam áreas verticais que provêem funcionalida<strong>de</strong>s<br />

<strong>de</strong> interesse direto do usuário final em domínios <strong>de</strong> aplicação particulares. Por<br />

exemplo, objetos <strong>de</strong> negócio para banco, finanças, objetos <strong>de</strong> planilhas<br />

eletrônicas, e componentes GUI (Graphical User Interface).<br />

• Objetos da Aplicação – São os objetos que formam o centro <strong>de</strong> uma aplicação<br />

compatível com CORBA, eles são <strong>de</strong>nominados objetos <strong>de</strong> negócio. O conjunto<br />

<strong>de</strong> objetos da aplicação é formado por objetos cliente e servidor, consumidores<br />

finais <strong>de</strong>sta arquitetura provida pela OMG, que irão utilizar os componentes da<br />

arquitetura para realizar suas interações [32].<br />

Objetos específicos da<br />

aplicação não padronizados<br />

Objetos específicos do<br />

domínio vertical<br />

Objetos Facilida<strong>de</strong>s<br />

Horizontais<br />

Interfaces <strong>de</strong> Aplicação<br />

Interfaces <strong>de</strong> Domínio<br />

CORBA ORB<br />

Interface <strong>de</strong> serviços CORBA<br />

Interfaces <strong>de</strong> Facilida<strong>de</strong>s<br />

Corba<br />

Serviços <strong>de</strong> objetos<br />

comuns<br />

FIGURA 2-4 - O mo<strong>de</strong>lo <strong>de</strong> referência da OMA.<br />

A arquitetura OMA é uma arquitetura em camadas, e seus componentes<br />

possuem uma correlação com as camadas da arquitetura <strong>de</strong>finida na Seção 2.1, FIG. 2-<br />

3. Os objetos da aplicação correspon<strong>de</strong>m à camada <strong>de</strong> sistemas da aplicação, os objetos<br />

do domínio e os objetos facilida<strong>de</strong>s correspon<strong>de</strong>m à camada <strong>de</strong> sistemas específicos do<br />

negócio e os serviços CORBA e o CORBA ORB à camada middleware. A camada<br />

Software do sistema correspon<strong>de</strong> ao sistema operacional utilizado, sendo que a OMA é<br />

uma arquitetura in<strong>de</strong>pen<strong>de</strong>nte <strong>de</strong> plataforma, veja na FIG. 2-5.<br />

25


Objetos da aplicação<br />

Objetos do domínio<br />

Objetos facilida<strong>de</strong>s<br />

Serviços Corba<br />

ORB<br />

Sistema operacional<br />

OMA<br />

Sistemas <strong>de</strong> aplicação<br />

Específico do negócio<br />

Middleware<br />

Software do sistema<br />

Arquitetura em<br />

camadas genérica<br />

FIGURA 2-5 - Relação entre a arquitetura OMA e a arquitetura em camadas.<br />

Entretanto, na arquitetura OMA, a tradicional comunicação entre camadas<br />

adjacentes não acontece. Todos os componentes <strong>de</strong>sta arquitetura po<strong>de</strong>m requisitar<br />

serviços, <strong>através</strong> do componente ORB, a qualquer um dos componentes que estejam<br />

abaixo <strong>de</strong>les, ou seja, possuem um nível <strong>de</strong> generalida<strong>de</strong> mais alto. A arquitetura OMA,<br />

segue as restrições do mo<strong>de</strong>lo Layering Through Inheritance (apresentado na Seção<br />

2.1.1), pois os objetos <strong>de</strong> nível mais alto usam as suas interfaces e as interfaces dos<br />

níveis mais baixos por virtu<strong>de</strong> da herança <strong>de</strong> interfaces.<br />

Na FIG. 2-6, retratamos o uso <strong>de</strong> interfaces utilizadas pela OMA para interação<br />

entre os componentes <strong>de</strong>sta arquitetura em camadas. Por exemplo, os objetos da<br />

aplicação po<strong>de</strong>m ter acesso às interfaces <strong>de</strong>finidas pelos objetos do domínio, facilida<strong>de</strong>s<br />

e <strong>de</strong> serviço. Assim, eles po<strong>de</strong>m interagir, <strong>através</strong> do ORB, com cada um <strong>de</strong>stes objetos.<br />

Objetos da<br />

aplicação<br />

OS<br />

AI<br />

CF<br />

DI<br />

Objetos do<br />

domínio<br />

OS<br />

DI<br />

... ...<br />

CF<br />

Objetos<br />

facilida<strong>de</strong><br />

CF<br />

OS<br />

Object Request Broker<br />

...<br />

Object<br />

framework<br />

OS<br />

Objetos <strong>de</strong><br />

serviço<br />

OS<br />

OS:Serviços do objeto<br />

CF: Facilida<strong>de</strong>s comum<br />

DI: Interfaces do domínio<br />

AI: Interfaces da aplicação<br />

FIGURA 2-6 - Mo<strong>de</strong>lo <strong>de</strong> referencia OMA - Uso <strong>de</strong> interfaces.<br />

O papel <strong>de</strong> CORBA na OMA é implementar a função do ORB<br />

(ROSENBERGER in [32]). CORBA é composto <strong>de</strong> um conjunto <strong>de</strong> componentes que<br />

26


juntos provêem o suporte necessário para obter interoperabilida<strong>de</strong> entre componentes,<br />

in<strong>de</strong>pen<strong>de</strong>ntemente, <strong>de</strong> plataforma e linguagem <strong>de</strong> programação. Em uma requisição <strong>de</strong><br />

serviços, CORBA é responsável pela localização do objeto ao qual se <strong>de</strong>stina a<br />

requisição, pelo envio dos parâmetros da requisição no formato aceito por este objeto, e<br />

pelo retorno <strong>de</strong> parâmetros <strong>de</strong> saída da requisição, se houver, para o cliente. CORBA<br />

torna todas estas tarefas transparentes para os objetos cliente e servidor. Na FIG. 2-7,<br />

mostramos uma requisição <strong>de</strong> um cliente sendo enviada <strong>através</strong> do CORBA a um<br />

servidor.<br />

Cliente<br />

Requisição<br />

Servidor<br />

(Implementção do<br />

Objeto)<br />

ORB<br />

(Object Request Broker)<br />

FIGURA 2-7 - Requisição enviada <strong>através</strong> do ORB.<br />

Qualquer software que forneça as interfaces e os serviços especificados para<br />

oferecer transparência à distribuição e heterogeneida<strong>de</strong>, po<strong>de</strong> ser consi<strong>de</strong>rado um ORB.<br />

Assim, ORBs diferentes po<strong>de</strong>m apresentar características <strong>de</strong> implementação diferentes,<br />

resultando em serviços prestados a objetos e clientes com qualida<strong>de</strong>s e proprieda<strong>de</strong>s<br />

diferentes.<br />

2.3.3 Estrutura <strong>de</strong> CORBA<br />

Na FIG. 2-8, apresentamos a estrutura <strong>de</strong> um ORB e suas interfaces, <strong>através</strong> das quais<br />

acontece a interação com os clientes e com as implementações <strong>de</strong> objetos. Descrevemos<br />

cada um dos elementos <strong>de</strong>sta estrutura para que possamos, posteriormente, apresentar as<br />

características que afetam o mundo externo, ou seja, clientes e servidores.<br />

27


Cliente<br />

Implementação <strong>de</strong> Objeto<br />

Interface <strong>de</strong><br />

Invocação<br />

Dinâmica<br />

Stub IDL<br />

Cliente<br />

Interface<br />

ORB<br />

Esqueleto<br />

Estático<br />

Esqueleto <strong>de</strong><br />

Invocação<br />

Dinâmica<br />

Adaptador<br />

<strong>de</strong> Objeto<br />

Repositório <strong>de</strong><br />

Interfaces<br />

Núcleo ORB<br />

Repositório <strong>de</strong><br />

Implementações<br />

FIGURA 2-8 - Estrutura <strong>de</strong> um ORB.<br />

• Núcleo ORB (ORB Core) oferece os mecanismos <strong>de</strong> representação <strong>de</strong> objetos e<br />

<strong>de</strong> comunicação, tornando o processamento e a execução das requisições<br />

possível. A estrutura <strong>de</strong> CORBA permite que as diferenças entre os núcleos<br />

tornem-se completamente transparentes <strong>através</strong> da sobreposição dos<br />

componentes <strong>de</strong> CORBA ao núcleo ORB.<br />

• Stubs Cliente provêem as interfaces estáticas para os serviços dos objetos. Estes<br />

stubs pré-compilados <strong>de</strong>finem como os clientes invocam estaticamente os<br />

serviços correspon<strong>de</strong>ntes no servidor. O Stub, do ponto <strong>de</strong> vista do cliente, é um<br />

proxy local para um objeto servidor remoto. Os serviços fornecidos por um<br />

objeto são <strong>de</strong>finidos usando IDL (Interface Definition Language). Através da<br />

<strong>de</strong>finição em IDL do objeto são gerados os stubs, cliente e servidor, usando um<br />

compilador IDL. Um cliente tem <strong>de</strong> ter um stub IDL para cada interface que use<br />

no servidor. O stub inclui código para fazer marshalling, isto é, codificação e<br />

<strong>de</strong>codificação das operações e os seus parâmetros numa mensagem que possa<br />

ser enviada ao servidor. O Stub Cliente permite que o programador, ao invocar<br />

um método <strong>de</strong> um serviço remoto, não precise se preocupar com protocolos e<br />

marshalling.<br />

• Interface <strong>de</strong> invocação dinâmica (Dynamic Invocation Interface - DII) permite<br />

especificar e construir pedidos durante a execução, em vez <strong>de</strong> o fazer <strong>através</strong> <strong>de</strong><br />

stubs. A DII é necessária quando a interface do objeto não é conhecida durante a<br />

compilação. Através do mecanismo DII, um objeto é ativado por uma chamada<br />

ou por uma série <strong>de</strong> chamadas ao ORB, on<strong>de</strong> o método e os parâmetros são<br />

especificados. É <strong>de</strong> responsabilida<strong>de</strong> do cliente especificar os tipos dos<br />

parâmetros e os resultados esperados.<br />

• CORBA <strong>de</strong>fine uma API padrão (Application Protocol Interface) para procurar<br />

os <strong>meta</strong>-dados que <strong>de</strong>finem a interface do servidor, a geração <strong>de</strong> parâmetros, a<br />

28


ealização dos pedidos e a recepção dos resultados. Para se construir uma<br />

invocação dinâmica são necessários 6 passos: <strong>de</strong>scobrir os novos objetos <strong>através</strong><br />

dos serviços <strong>de</strong> Nomes e Trading; <strong>de</strong>scobrir suas interfaces; obter a completa<br />

<strong>de</strong>finição do método; criar uma lista <strong>de</strong> argumentos; criar a solicitação; e fazer a<br />

chamada.<br />

• Interface ORB consiste <strong>de</strong> um conjunto <strong>de</strong> APIs para serviços locais que po<strong>de</strong>m<br />

ser <strong>de</strong> interesse para a aplicação, como por exemplo, converter uma referência a<br />

um objeto numa string e vice-versa.<br />

• Esqueleto estático (Stubs IDL do servidor, skeleton) provê as interfaces estáticas<br />

para os serviços exportados pelo objeto. Estes stubs, como os stubs clientes, são<br />

criados usando um compilador <strong>de</strong> IDL.<br />

• Esqueleto dinâmico (Interface skeleton dinâmica - DSI) provê um mecanismo<br />

para os servidores que precisem lidar com invocações <strong>de</strong> métodos em objetos<br />

que não têm skeletons IDL. Quando uma mensagem é recebida, o DSI analisa os<br />

valores dos parâmetros <strong>de</strong> modo a <strong>de</strong>scobrir o receptor, ou seja, o objeto e o<br />

método. Os skeletons dinâmicos são muito úteis para gerar implementações <strong>de</strong><br />

objetos em linguagens script ou interpretadas, dinamicamente. Por outro lado, os<br />

skeletons normais são <strong>de</strong>finidos para um objeto particular e esperam uma<br />

implementação para cada método <strong>de</strong>finido em IDL.<br />

• Adaptador <strong>de</strong> objetos é responsável por ativar e <strong>de</strong>sativar implementações <strong>de</strong><br />

objetos, manter o registro das implementações, promover a requisição <strong>de</strong><br />

métodos e garantir a segurança da interação entre os elementos envolvidos em<br />

uma requisição.<br />

• Repositórios <strong>de</strong> interfaces e <strong>de</strong> implementações armazenam informações sobre<br />

as interfaces e os objetos instalados para disponibilizá-las aos clientes e às<br />

implementações <strong>de</strong> objetos, respectivamente.<br />

CORBA é uma arquitetura complexa já que se propõe a tratar todos os requisitos<br />

<strong>de</strong> transparência necessários em um ambiente heterogêneo e distribuído. Detalhes do<br />

funcionamento <strong>de</strong>sta arquitetura po<strong>de</strong>m ser encontrados em [8][32][41][42][44]. Não<br />

nos <strong>de</strong>temos a estes <strong>de</strong>talhes no presente trabalho porque o nosso foco é como e quais<br />

informações são necessárias para uma aplicação interagir com outras em um ambiente<br />

distribuído e heterogêneo utilizando CORBA.<br />

29


Usamos CORBA como uma caixa preta que nos provê serviços para interação<br />

com outras aplicações ou objetos. Assim, na Seção 2.3.4, mostramos quais informações<br />

<strong>de</strong>vem ser fornecidas e quais po<strong>de</strong>m ser requisitadas <strong>de</strong>sta caixa preta.<br />

2.3.4 Objetos <strong>de</strong> uma Aplicação<br />

2.3.4.1 O Cliente<br />

Clientes são aplicações ou processos que requisitam serviços <strong>de</strong> algum outro objeto<br />

(servidor). Para chamar serviços remotos, clientes enviam requisições para o ORB.<br />

Depois que a operação é executada eles recebem respostas ou exceções do ORB.<br />

Exceções são mensagens indicando algum erro ocorrido impedindo a execução do<br />

serviço requisitado. A interação entre clientes e servidores é baseada em um mo<strong>de</strong>lo<br />

dinâmico on<strong>de</strong> servidores também po<strong>de</strong>m agir como clientes, diferentemente da noção<br />

tradicional da arquitetura cliente-servidor [6].<br />

Os clientes não conhecem a localização dos servidores que eles acessam. Isto<br />

permite a adição <strong>de</strong> novos serviços e a mudança <strong>de</strong> serviços existentes para outros<br />

locais, enquanto o sistema está em execução. Entretanto, o cliente <strong>de</strong>ve conhecer a<br />

referência do objeto que irá lhe fornecer um serviço. A referência <strong>de</strong> objeto é atribuída<br />

pelo ORB durante a criação <strong>de</strong>le, ela é a i<strong>de</strong>ntificação <strong>de</strong> um objeto CORBA. Esta<br />

referência po<strong>de</strong> ser obtida no Repositório <strong>de</strong> interfaces, que também <strong>de</strong>ve ser conhecido.<br />

Os clientes po<strong>de</strong>m requisitar serviços <strong>de</strong> três modos: síncrono, síncrono <strong>de</strong>ferido<br />

e assíncrono, veja na FIG. 2-9 [60]:<br />

• O modo síncrono tem a forma <strong>de</strong> chamadas a funções remotas (Remote<br />

Procedure Calls), na qual o objeto aguarda a resposta a um serviço requisitado.<br />

• O modo síncrono <strong>de</strong>ferido permite que os clientes recebam a resposta do<br />

servidor algum tempo <strong>de</strong>pois <strong>de</strong> terem efetuado o pedido, sem que seja<br />

necessário bloquear a execução do cliente. Este modo só po<strong>de</strong> ser usado <strong>através</strong><br />

das Interfaces <strong>de</strong> invocação dinâmica.<br />

• Por fim, o modo assíncrono permite que o cliente execute uma operação no<br />

servidor sem esperar uma resposta ou que a operação termine.<br />

30


Invoke()<br />

Send()<br />

Onewayinvoke()<br />

wait<br />

Get-response()<br />

Síncrono<br />

Síncrono<br />

Deferido<br />

Assíncrono<br />

FIGURA 2-9 - Modos <strong>de</strong> invocação <strong>de</strong> operações.<br />

2.3.4.2 A Implementação do Objeto (Servidor)<br />

Um servidor implementa objetos que expõem suas funcionalida<strong>de</strong>s <strong>através</strong> <strong>de</strong> uma<br />

linguagem <strong>de</strong> <strong>de</strong>finição <strong>de</strong> interfaces <strong>de</strong>nominada, IDL. Estas interfaces consistem <strong>de</strong><br />

operações e atributos. Geralmente, elas são agrupadas em um arquivo <strong>de</strong> interfaces <strong>de</strong><br />

acordo com a similarida<strong>de</strong> <strong>de</strong> suas semânticas. Servidores oferecem serviços comuns<br />

para muitos domínios <strong>de</strong> aplicação ou implementam funcionalida<strong>de</strong>s específicas para<br />

um único domínio <strong>de</strong> aplicação ou tarefa.<br />

Quando um servidor é iniciado, ele primeiro se registra no ORB, ou seja,<br />

disponibiliza os serviços que ele está apto a oferecer, e recebe uma referência que irá<br />

i<strong>de</strong>ntificá-lo. Para disponibilizar este serviço, ele insere a sua referência em um<br />

repositório, ficando apto a receber requisições. O ORB guarda todas as informações<br />

necessárias em seus repositórios. Quando um cliente precisa <strong>de</strong> um serviço, ele envia a<br />

requisição para o ORB local. O ORB verifica, em seus repositórios, on<strong>de</strong> está o servidor<br />

requisitado, e repassa a requisição para este servidor seguindo o protocolo necessário.<br />

Depois que o serviço é executado ou alguma exceção ocorrer, o servidor retorna o<br />

resultado/exceção para o ORB e este para o cliente.<br />

2.4 Conclusões<br />

Neste capítulo, apresentamos as principais tecnologias que influenciam nossa pesquisa:<br />

arquitetura <strong>de</strong> software, linguagens <strong>de</strong> mo<strong>de</strong>lagem e especificação, e CORBA. Os<br />

termos e conceitos <strong>de</strong>finidos aqui são utilizados no restante <strong>de</strong>sta dissertação. Como<br />

apresentamos, muitos <strong>de</strong>stes conceitos são utilizados no contexto da Arquitetura <strong>de</strong><br />

31


software, da UML e <strong>de</strong> CORBA, <strong>de</strong> maneira diferenciada. Enten<strong>de</strong>r qual a diferença<br />

entre eles e como eles po<strong>de</strong>m estar relacionados é necessário para um bom<br />

entendimento dos capítulos seguintes.<br />

32


3. UM META-MODELO PARA MODELAR UMA FAMÍLIA DE<br />

APLICAÇÕES DISTRIBUÍDAS<br />

“Um <strong>meta</strong>-mo<strong>de</strong>lo é um mo<strong>de</strong>lo genérico <strong>através</strong> do qual po<strong>de</strong>m ser <strong>de</strong>finidos outros<br />

mo<strong>de</strong>los genéricos ou específicos” [27].<br />

Neste trabalho <strong>de</strong> dissertação, estamos propondo um <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar<br />

uma família <strong>de</strong> aplicações distribuídas. Esta família <strong>de</strong> sistemas é caracterizada pelas<br />

restrições impostas pelo estilo camadas e pelas restrições impostas pela utilização do<br />

padrão CORBA, apresentados respectivamente nas Seções 2.1.1.1 e 2.3. Através <strong>de</strong>ste<br />

<strong>meta</strong>-mo<strong>de</strong>lo oferecemos, ao projetista, informações arquiteturais inerentes a integração<br />

<strong>de</strong>stes dois <strong>padrões</strong>. As informações oferecidas dizem respeito à arquitetura e a<br />

arquitetura <strong>de</strong>talhada <strong>de</strong>sta família <strong>de</strong> sistemas.<br />

Como apresentamos na Seção 2.2.1.1, FIG. 2-4, oferecer a arquitetura <strong>de</strong>talhada<br />

<strong>de</strong> uma família <strong>de</strong> sistemas provê uma maneira mais natural <strong>de</strong> transformar estilos em<br />

arquiteturas <strong>de</strong>talhadas <strong>de</strong> um produto específico. Através <strong>de</strong> <strong>meta</strong>-mo<strong>de</strong>los po<strong>de</strong>mos<br />

realizar a idéia <strong>de</strong> sub-estilos e, assim, documentar a partir <strong>de</strong> um estilo, subtipos <strong>de</strong>le.<br />

Por exemplo, as variações do estilo camadas citadas na Seção 2.1.1.1 po<strong>de</strong>m ser<br />

consi<strong>de</strong>radas sub-estilos do estilo camadas. Recursivamente, po<strong>de</strong>mos utilizar a mesma<br />

abordagem para criar subtipos <strong>de</strong>stes sub-estilos. Po<strong>de</strong>mos, também, refinar cada um<br />

<strong>de</strong>stes estilos e sub-estilos, <strong>de</strong> maneira a obter uma arquitetura mais <strong>de</strong>talhada,<br />

(utilizando elementos do nível <strong>de</strong> <strong>de</strong>sign, especificado em UML, por exemplo),<br />

preservando as proprieda<strong>de</strong>s arquiteturais.<br />

Assim, um <strong>meta</strong>-mo<strong>de</strong>lo po<strong>de</strong> ser:<br />

• Instanciado, para o <strong>de</strong>senvolvimento da arquitetura <strong>de</strong> um sistema específico<br />

com aquelas características genéricas iniciais, ou para a <strong>de</strong>finição <strong>de</strong> sub-estilos.<br />

Instanciar significa criar um elemento específico a partir <strong>de</strong> um outro mais<br />

genérico. O elemento específico herda todos as características do elemento<br />

genérico;<br />

• Refinado, para se aproximar dos <strong>de</strong>talhes <strong>de</strong> implementação. Refinar significa<br />

criar um elemento com nível <strong>de</strong> abstração menor que o elemento genérico,<br />

acrescentando características que se aproximam da implementação.<br />

33


Para elaborar um Meta-Mo<strong>de</strong>lo para projetar uma família <strong>de</strong> aplicações distribuídas:<br />

• Aplicamos alguns conceitos e técnicas empregadas na arquitetura <strong>de</strong> software,<br />

tais como, os estilos e visões;<br />

• Consi<strong>de</strong>ramos características impostas pelo middleware CORBA e pelo estilo<br />

camadas, tais como, restrições estruturais e comportamentais; e<br />

• Empregamos a UML como meio <strong>de</strong> documentá-lo e difundi-lo, e a linguagem Z<br />

como meio <strong>de</strong> especificar características não especificadas ou ambiguamente<br />

especificadas pela UML.<br />

Assim, este <strong>meta</strong>-mo<strong>de</strong>lo esclarece todas as restrições impostas pelo estilo<br />

camadas e por CORBA. Ele resolve os conflitos que surgem ao colocar estes dois<br />

<strong>padrões</strong> juntos e aproxima o <strong>de</strong>sign da arquitetura a mo<strong>de</strong>los mais <strong>de</strong>talhados do <strong>de</strong>sign,<br />

por utilizar uma única linguagem para mapear ambas as abstrações.<br />

Neste capítulo, apresentamos: a metodologia utilizada para a elaboração do<br />

<strong>meta</strong>-mo<strong>de</strong>lo proposto, na Seção 3.1; a terminologia e notação utilizadas para<br />

documentar este <strong>meta</strong>-mo<strong>de</strong>lo, na Seção 3.2; e como empregamos as tecnologias<br />

apresentadas no Capítulo 2 e os artefatos construídos para alcançar o objetivo proposto,<br />

nas Seções 3.3, 3.4, 3.5 e 3.6.<br />

3.1 Metodologia<br />

Para elaborar o <strong>meta</strong>-mo<strong>de</strong>lo proposto, <strong>de</strong>senvolvemos três outros <strong>meta</strong>-mo<strong>de</strong>los que<br />

po<strong>de</strong>m ser, igualmente instanciados e/ou refinados. Cada um <strong>de</strong>les representa um grupo<br />

<strong>de</strong> características com maior ou menor grau <strong>de</strong> generalida<strong>de</strong>, indicando domínios <strong>de</strong><br />

aplicação diferentes. Na FIG. 3-1, apresentamos como estes <strong>meta</strong>-mo<strong>de</strong>los estão<br />

relacionados um com o outro, indicando também, a seqüência em que foram construídos<br />

e a abrangência relativa do domínio a que eles se aplicam.<br />

34


2 -<br />

Meta-mo<strong>de</strong>lo para<br />

mo<strong>de</strong>lar arq em camadas<br />

4- e distribuídas<br />

Meta-mo<strong>de</strong>lo para Meta-mo<strong>de</strong>lo para<br />

mo<strong>de</strong>lar arq. 3- mo<strong>de</strong>lar arq.<br />

em camadas baseadas em CORBA<br />

Especificação em UML e Z<br />

1-<br />

Meta-mo<strong>de</strong>lo para mo<strong>de</strong>lar estilos<br />

Visão Conceitual<br />

FIGURA 3-1 - Relação entre os <strong>meta</strong>-mo<strong>de</strong>los <strong>de</strong>senvolvidos.<br />

Na FIG. 3-1, o plano abaixo da pirâmi<strong>de</strong>, em cinza na figura, representa a visão<br />

conceitual <strong>de</strong>finida em [27], apresentada na seção 2.1.2. A Visão Conceitual embasa<br />

todos os <strong>meta</strong>-mo<strong>de</strong>los aqui <strong>de</strong>senvolvidos, pois eles herdam os elementos e a estrutura<br />

global <strong>de</strong>sta visão, ou <strong>meta</strong>-mo<strong>de</strong>lo. Nós realizamos algumas modificações na visão<br />

conceitual para que ela dê suporte à <strong>de</strong>scrição <strong>de</strong> estilos. Estas mudanças resultaram em<br />

um <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar estilos, representado pela base da pirâmi<strong>de</strong> na FIG 3-1.<br />

A estrutura estática foi especificada <strong>através</strong> do diagrama <strong>de</strong> classes da UML e em Z. A<br />

estrutura dinâmica foi mo<strong>de</strong>lada <strong>através</strong> dos diagramas <strong>de</strong> estados e <strong>de</strong> interações da<br />

UML.<br />

Os <strong>meta</strong>-mo<strong>de</strong>los para mo<strong>de</strong>lar arquiteturas em camadas e para mo<strong>de</strong>lar<br />

aplicações que utilizam CORBA são baseados neste <strong>meta</strong>-mo<strong>de</strong>lo inicial, representados<br />

na FIG 3-1 pela segunda camada da pirâmi<strong>de</strong>. Realizamos duas instanciações<br />

in<strong>de</strong>pen<strong>de</strong>ntes, por adicionar em uma as características impostas pelo estilo camadas e,<br />

na outra, pelo padrão CORBA.<br />

O topo da pirâmi<strong>de</strong> representa o principal objetivo <strong>de</strong>ste trabalho <strong>de</strong> dissertação.<br />

Ele foi igualmente instanciado, <strong>de</strong>sta vez, herdando características dos dois <strong>meta</strong>mo<strong>de</strong>los<br />

distintos anteriormente citados. Entretanto, para absorver as características<br />

<strong>de</strong>stes dois <strong>meta</strong>-mo<strong>de</strong>los foi necessário realizar alguns ajustes para que ambos possam<br />

coexistir num mesmo sistema.<br />

Todos estes <strong>meta</strong>-mo<strong>de</strong>los são <strong>de</strong>talhadamente explicados nas próximas seções.<br />

Cada um <strong>de</strong>les é representado <strong>através</strong> <strong>de</strong> suas estruturas estática e dinâmica em UML e<br />

da especificação formal em Z das restrições impostas aos elementos do <strong>meta</strong>-mo<strong>de</strong>lo.<br />

35


3.2 Notação e Terminologia<br />

Para documentar o <strong>meta</strong>-mo<strong>de</strong>lo aqui proposto, escolhemos a linguagem UML. Como<br />

apresentamos na Seção 2.2.1, a UML oferece várias vantagens para a <strong>de</strong>scrição <strong>de</strong><br />

arquiteturas, em especial: a comunicabilida<strong>de</strong>; a facilida<strong>de</strong> <strong>de</strong> aprendê-la e entendê-la; e<br />

a forma natural <strong>de</strong> transformar um nível mais abstrato em implementação. Entretanto, a<br />

UML não é uma ADL [37][53]. Assim, é necessário fazer um mapeamento dos<br />

elementos arquiteturais para a notação <strong>de</strong>finida pela UML.<br />

Os principais elementos arquiteturais são: componentes, conectores e<br />

configuração. Para representá-los nós utilizamos os elementos <strong>de</strong> mo<strong>de</strong>los <strong>de</strong>finidos<br />

pela UML - Classes, Objetos e Relacionamentos – da seguinte maneira, veja na FIG. 3-<br />

2:<br />

• Componente 1 : É uma entida<strong>de</strong> computacional ou <strong>de</strong> armazenamento <strong>de</strong> dados,<br />

como <strong>de</strong>finimos na Seção 2.1. Um componente possui uma interface para<br />

interação com o mundo externo que ocorre <strong>através</strong> <strong>de</strong> pontos <strong>de</strong> interação<br />

<strong>de</strong>nominados, portas. Nós representamos os componentes <strong>através</strong> <strong>de</strong> classes e<br />

suas portas <strong>através</strong> <strong>de</strong> classes agregadas. Assim, po<strong>de</strong>mos representá-los como<br />

entida<strong>de</strong>s <strong>de</strong> primeira classe e retratar suas estruturas, proprieda<strong>de</strong>s e<br />

comportamentos. As proprieda<strong>de</strong>s po<strong>de</strong>m ser representadas por atributos ou por<br />

associações. O comportamento po<strong>de</strong> ser <strong>de</strong>scrito <strong>através</strong> <strong>de</strong> diagramas<br />

dinâmicos. E a generalização po<strong>de</strong> ser utilizada para relacionar um conjunto <strong>de</strong><br />

tipos <strong>de</strong> componentes ou <strong>de</strong> portas.<br />

• Conector: É a relação que <strong>de</strong>nota a comunicação entre componentes. Os pontos<br />

<strong>de</strong> interação dos conectores são <strong>de</strong>nominados papéis. Os conectores e seus<br />

papéis são representados <strong>através</strong> <strong>de</strong> classes. Da mesma maneira, que os<br />

componentes e portas, eles são entida<strong>de</strong>s <strong>de</strong> primeira classe. Assim eles po<strong>de</strong>m<br />

ser tão simples ou tão complexos quanto se queira. Para realizar a comunicação<br />

os papéis são ligados às portas <strong>através</strong> do relacionamento <strong>de</strong> associação.<br />

• Configuração: A configuração é retratada como um gráfico <strong>de</strong> componentes e<br />

conectores. Ela <strong>de</strong>fine os tipos <strong>de</strong> componentes e conectores e restringe como<br />

instâncias <strong>de</strong>stes tipos po<strong>de</strong>m ser interconectadas. Nós representamos a<br />

1 Nesta dissertação utilizamos o termo componente para <strong>de</strong>notar os componentes arquiteturais e não a<br />

noção <strong>de</strong> componentes oferecida pela UML, apresentada na Seção 2.2.1.1.<br />

36


configuração, também, <strong>através</strong> <strong>de</strong> classes. Esta classe agrega as classes<br />

representantes do componente e do conector.<br />

Classe<br />

Atributo<br />

Operação<br />

Classes<br />

Objeto<br />

Objetos<br />

Relacionamentos<br />

FIGURA 3-2 - Elementos <strong>de</strong> mo<strong>de</strong>lo UML utilizados.<br />

Além disto, nós utilizamos os objetos, <strong>de</strong>finidos pela UML, para representar<br />

instâncias dos elementos arquiteturais para a mo<strong>de</strong>lagem <strong>de</strong> aplicações específicas.<br />

A <strong>de</strong>svantagem <strong>de</strong>sta abordagem é que mo<strong>de</strong>lar todos os elementos <strong>através</strong> da<br />

mesma representação gráfica, <strong>através</strong> <strong>de</strong> classes, causa uma certa perda <strong>de</strong><br />

representativida<strong>de</strong> ou confusão visual [25].<br />

3.3 Um Meta-mo<strong>de</strong>lo para Mo<strong>de</strong>lar Estilos<br />

A visão conceitual <strong>de</strong>finida por Hofmeister et al. [27], apresentada na Seção 2.1.2, foi<br />

utilizada como mo<strong>de</strong>lo base para <strong>de</strong>finição dos <strong>meta</strong>-mo<strong>de</strong>los que estamos propondo<br />

nesta dissertação. Esta visão (FIG. 3-3) po<strong>de</strong> ser instanciada para criação <strong>de</strong> qualquer<br />

arquitetura, visto que, ela apresenta os elementos genéricos e fundamentais para tal<br />

tarefa. A partir <strong>de</strong>sta visão, po<strong>de</strong>-se elaborar arquiteturas com diferentes tipos <strong>de</strong><br />

componentes, conectores e protocolos.<br />

Configuração<br />

0..1<br />

*<br />

*<br />

Componente<br />

0..1<br />

*<br />

0..1<br />

1<br />

1<br />

0..1<br />

*<br />

* *<br />

Conector<br />

0..1<br />

0..1<br />

liga<br />

*<br />

*<br />

* *<br />

Porta * conecta * Papel<br />

*<br />

*<br />

obe<strong>de</strong>ce<br />

obe<strong>de</strong>ce<br />

1 1<br />

*<br />

*<br />

liga<br />

Protocolo<br />

FIGURA 3-3 - Meta-mo<strong>de</strong>lo da visão conceitual da arquitetura.<br />

37


Como mostramos na FIG. 3-3, o elemento Configuração é composto por vários<br />

Componentes e Conectores que por sua vez também po<strong>de</strong>m ser compostos por outros<br />

Componentes e Conectores. Cada Componente é composto por Portas e cada Conector é<br />

composto <strong>de</strong> Papéis. A conexão entre componentes ocorre <strong>através</strong> da conexão entre suas<br />

portas e papéis <strong>de</strong> algum conector ou <strong>através</strong> da ligação direta entre portas, neste último<br />

caso quando um componente composto se comunica com algum <strong>de</strong> seus componentes<br />

internos. Um papel também po<strong>de</strong> está ligado diretamente a um papel <strong>de</strong> outro conector.<br />

Para que uma conexão entre portas e papéis ocorra, estes <strong>de</strong>vem obe<strong>de</strong>cer a um mesmo<br />

protocolo. O protocolo especifica regras para a comunicação tais como os tipos <strong>de</strong><br />

dados suportados, quem lê, o que lê, aon<strong>de</strong> lê etc.<br />

Assim como as arquiteturas, um estilo é constituído <strong>de</strong> um vocabulário, que<br />

<strong>de</strong>screve os tipos <strong>de</strong> componentes e conectores, uma configuração, e um protocolo. A<br />

configuração <strong>de</strong> um estilo é uma instância do mo<strong>de</strong>lo da FIG. 3-3 para o vocabulário e<br />

restrições <strong>de</strong>sejadas. A visão conceitual fornece algumas restrições genéricas. Cada<br />

estilo <strong>de</strong>ve herdar estas restrições básicas e estabelecer as proprieda<strong>de</strong>s intrínsecas ao<br />

próprio estilo. Estas características são <strong>de</strong> estrutura, <strong>de</strong> comportamento, e/ou <strong>de</strong><br />

vocabulário. Entretanto, para oferecer um suporte mais a<strong>de</strong>quado para especificar<br />

arquiteturas caracterizadas por estilos, nós propomos algumas alterações à visão<br />

conceitual <strong>de</strong>finida por Hofmeister et al. [27]. São elas:<br />

1) Substituímos as agregações existentes entre ‘Componente e Componente’,<br />

‘Conector e Conector’, ‘Componente e Conector’ e ‘Conector e Componente’<br />

pelas agregações entre ‘Componente e Configuração’ e entre ‘Conector e<br />

Configuração’. Assim, <strong>através</strong> <strong>de</strong>ste <strong>meta</strong>-mo<strong>de</strong>lo damos suporte a composição<br />

<strong>de</strong> componentes e conectores, também suportada pela visão conceitual, e a<br />

heterogeneida<strong>de</strong> <strong>de</strong> estilos.<br />

Configuração<br />

0..1<br />

*<br />

*<br />

Componente<br />

1<br />

*<br />

0..1<br />

1<br />

1<br />

1<br />

...<br />

1<br />

1<br />

0..1<br />

*<br />

* *<br />

Conector<br />

0..1<br />

FIGURA 3-4 - Mudanças nas agregações existentes no <strong>meta</strong>-mo<strong>de</strong>lo.<br />

38


A visão conceitual suporta heterogeneida<strong>de</strong> <strong>de</strong> componentes, conectores e<br />

protocolo, visto que, ao instanciar esta visão po<strong>de</strong>-se obter uma arquitetura com<br />

diferentes tipos <strong>de</strong> componentes interagindo e se comportando <strong>de</strong> várias maneiras, on<strong>de</strong><br />

cada conexão po<strong>de</strong> obe<strong>de</strong>cer a um protocolo diferente. Entretanto, ela não dá suporte a<br />

heterogeneida<strong>de</strong> <strong>de</strong> estilos, pois se forem estabelecidas regras ou restrições para os<br />

elementos arquiteturais então todas as instâncias <strong>de</strong>stes elementos terão a mesma<br />

sintaxe e semântica.<br />

Com a alteração que realizamos, oferecemos um leque maior <strong>de</strong> possibilida<strong>de</strong>s<br />

para a composição dos elementos. Agora, um componente/conector composto é um<br />

elemento que possui uma configuração interna, que por sua vez possui um conjunto <strong>de</strong><br />

componentes e conectores com tipos <strong>de</strong>terminados por esta configuração interna. As<br />

restrições impostas pela configuração interna po<strong>de</strong>m ser idênticas às impostas pela<br />

configuração “externa” mas também po<strong>de</strong>m ser diferentes.<br />

Para que sejam diferentes, consi<strong>de</strong>ramos que a agregação existente entre<br />

Componente/Conector e a Configuração é sempre realizada com relação a Configuração<br />

genérica e não a configuração instanciada. Como apresentamos na FIG. 3-5, a<br />

configuração em camadas é uma configuração que possui camadas como os seus<br />

componentes. Estas camadas, por sua vez, po<strong>de</strong>m possuir uma configuração interna,<br />

po<strong>de</strong>ndo ser uma configuração em camadas ou <strong>de</strong> outro tipo.<br />

Configuração<br />

1<br />

1 *<br />

Camadas<br />

Configuração_<br />

Camadas<br />

1<br />

FIGURA 3-5 - Exemplo das agregações modificadas no <strong>meta</strong>-mo<strong>de</strong>lo.<br />

Para um maior entendimento, é válido fazermos algumas observações:<br />

1.1 Cada componente/conector <strong>de</strong>ve ser uma entida<strong>de</strong> auto-contida, com baixo<br />

acoplamento e alta coesão, para que seja mais facilmente reutilizados. Assim, se<br />

consi<strong>de</strong>rarmos que um componente/conector, possui um conjunto <strong>de</strong> componentes e<br />

conectores, como <strong>de</strong>finido pela Visão Conceitual, então: a) a configuração externa<br />

tem que fazer o controle das interações e estruturação <strong>de</strong>stes componentes e<br />

39


conectores internos ou; b) o componente/conector composto tem que fazer este<br />

gerenciamento.<br />

a) Para o primeiro caso, quando os componentes/conectores forem reutilizados, a<br />

informação <strong>de</strong> sua organização interna se per<strong>de</strong> ou tem que ser buscada na<br />

configuração. Ou seja, eles não são auto-contidos.<br />

b) Para o segundo caso, o componente/conector composto tem que <strong>de</strong>sempenhar o<br />

papel da configuração e po<strong>de</strong> não ser tão flexível ou restritivo quanto <strong>de</strong>ve, pois<br />

está se ocupando <strong>de</strong> ativida<strong>de</strong>s extras às suas funcionalida<strong>de</strong>s.<br />

1.2 Uma configuração é única num certo contexto. Por exemplo, se A é uma<br />

configuração caracterizada pelo estilo Camadas e B pelo estilo Pipe and Filter, A e<br />

B se comunicarão <strong>através</strong> <strong>de</strong> um conector que:<br />

a) pertence a A ou a B. Pertencendo a A, por exemplo, então o outro componente<br />

com o qual este conector está conectado pertence a B. Entretanto, um conector<br />

conecta dois ou mais componentes <strong>de</strong> uma mesma configuração e não <strong>de</strong><br />

configurações diferentes, sendo inviável esta alternativa. Ou;<br />

b) não pertence nem a A nem a B. Então pertence a uma terceira configuração que<br />

gerencia esta comunicação. No entanto, no <strong>meta</strong>-mo<strong>de</strong>lo a conexão é realizada<br />

entre portas e papéis, como configurações não possuem portas, então as<br />

configurações A e B <strong>de</strong>vem está “empacotadas”, representando os componentes<br />

<strong>de</strong>sta terceira configuração. Enfim, configurações não interagem com<br />

componentes, conectores ou configurações, elas são únicas num <strong>de</strong>terminado<br />

contexto.<br />

Nós consi<strong>de</strong>ramos que um componente/conector composto é aquele que possui,<br />

internamente, um conjunto <strong>de</strong> elementos arquiteturais estruturados segundo<br />

alguma configuração interna. Assim, os componentes/conectores compostos<br />

po<strong>de</strong>m fazer parte da configuração interna para que possam interagir com os<br />

componentes/conectores internos. Vale lembrar que uma configuração é um<br />

elemento que estabelece restrições para a organização e comunicação dos<br />

componentes.<br />

2) A ligação que existe entre portas, na Visão Conceitual, foi eliminada. Esta mudança<br />

fornece maior flexibilida<strong>de</strong> à comunicação entre um componente composto e os seus<br />

40


componentes internos. Assim, a comunicação é realizada <strong>através</strong> <strong>de</strong> um conector,<br />

po<strong>de</strong>ndo ser tão simples ou tão complexa quanto se queira.<br />

No caso da ligação entre portas como <strong>de</strong>finido na Visão Conceitual, as portas<br />

ligadas precisam invocar explicitamente uma operação que não lhes pertence. Por<br />

exemplo, se A é um componente composto e B pertence à configuração interna <strong>de</strong> A,<br />

então se A quiser requisitar um serviço <strong>de</strong> B, a porta <strong>de</strong> A que está ligada à porta <strong>de</strong> B<br />

tem que explicitamente invocar a operação da porta <strong>de</strong> B da seguinte maneira<br />

B.portax.operação() ou seja a porta do componente A conhece a porta e o componente<br />

com o qual ele interage e vice-versa. Assim, se B for reutilizado, é necessário modificar<br />

as operações <strong>de</strong>claradas nesta sua porta para que ele se comunique com um outro<br />

componente C, por exemplo.<br />

Através da mudança que realizamos, os componentes compostos e internos<br />

passam a ter maior in<strong>de</strong>pendência, pois eles não precisam conhecer os componentes<br />

com os quais interagem. Este é o papel do conector que realiza a conexão entre eles.<br />

Assim, um componente po<strong>de</strong> ser reutilizado sem que seja necessário modificar alguma<br />

estrutura interna, basta garantir que existe um conector capaz <strong>de</strong> fazer a comunicação.<br />

3) Um componente oferece e requisita serviços <strong>através</strong> <strong>de</strong> suas portas. Consi<strong>de</strong>ramos<br />

que há uma porta para cada serviço requisitado ou oferecido. Desta forma, não<br />

limitamos o componente/conector a um processamento seqüencial, pois assim eles<br />

po<strong>de</strong>m tratar várias requisições ao mesmo tempo, <strong>de</strong>pen<strong>de</strong>ndo apenas da tecnologia que<br />

o implementa.<br />

4) Consi<strong>de</strong>ramos que há dois tipos <strong>de</strong> portas uma que recebe requisições, po<strong>de</strong>ndo<br />

enviar respostas, e outra que envia requisições, po<strong>de</strong>ndo receber respostas,<br />

<strong>de</strong>nominadas, respectivamente, Receptor (Porta_rec) e Expedidor (Porta_exp). Um<br />

componente po<strong>de</strong> ter N portas, cada uma assume um único tipo. Sendo assim as portas<br />

Receptoras oferecem serviços e as Expedidoras requisitam serviços <strong>de</strong>/para o<br />

componente que as possui.<br />

5) Consi<strong>de</strong>ramos que há dois tipos <strong>de</strong> papéis, um <strong>de</strong> entrada e outro <strong>de</strong> saída,<br />

<strong>de</strong>nominados Papel IN e Papel OUT. O Papel IN lê requisições, ou escreve respostas, <strong>de</strong><br />

uma porta Expedidora e escreve-as, ou as lê, em uma porta Receptora. Um conector<br />

possui N papéis sendo que haverá pelo menos um <strong>de</strong> cada tipo.<br />

41


6) Um conector conhece todas as portas com as quais os seus papéis estão ligados.<br />

Como visto, estamos consi<strong>de</strong>rando algumas características <strong>de</strong> implementação.<br />

Porém estas características po<strong>de</strong>m afetar a arquitetura. Por exemplo, na mudança 3,<br />

consi<strong>de</strong>ramos uma porta para cada serviço prestado ou requisitado tendo em vista que o<br />

componente po<strong>de</strong> ter uma execução em paralelo. Caso não consi<strong>de</strong>rássemos isto em<br />

fases iniciais do <strong>de</strong>sign então o mo<strong>de</strong>lo na fase <strong>de</strong>talhada não retrataria a arquitetura, e<br />

posteriormente na fase <strong>de</strong> manutenção seria mais difícil i<strong>de</strong>ntificar e corrigir os erros e<br />

conseqüentemente evoluir o sistema.<br />

Assim, a estrutura estática <strong>de</strong> um <strong>meta</strong>-mo<strong>de</strong>lo capaz <strong>de</strong> ser refinado para a<br />

elaboração <strong>de</strong> arquiteturas caracterizadas por um estilo específico foi <strong>de</strong>senvolvido e é<br />

apresentado a seguir, na FIG. 3-6.<br />

42


3.3.1 Estrutura Estática<br />

Configuração<br />

1<br />

Conjunto <strong>de</strong> Componentes<br />

Conjunto <strong>de</strong> Conectores<br />

Conjunto dos pares Port_rec-PapOUT<br />

Conjunto dos pares Port_exp-PapIN<br />

Conjunto dos pares Pap-Pap<br />

Conjunto dos pares Comp-Comp<br />

1<br />

Serviço()<br />

{Serviços();<br />

Requisitar();<br />

Respon<strong>de</strong>r()}<br />

Requisitar()<br />

{Porta_exp.Requisitar()}<br />

Respon<strong>de</strong>r()<br />

{Porta_rec.Respon<strong>de</strong>r()}<br />

Receber(req)<br />

{Componentes.Serviço()}<br />

*<br />

Componentes<br />

Id_com<br />

Conjunto <strong>de</strong> Serv_req<br />

Conjunto <strong>de</strong> Serv_ofer<br />

Conjunto <strong>de</strong> Porta_rec<br />

Conjunto <strong>de</strong> Porta_exp<br />

Conf<br />

Serviço()<br />

Requisitar()<br />

Respon<strong>de</strong>r()<br />

{ou}<br />

1<br />

*<br />

Porta<br />

1<br />

1<br />

* conexão *<br />

*<br />

*<br />

obe<strong>de</strong>ce<br />

obe<strong>de</strong>ce<br />

1<br />

1 *<br />

Conectores<br />

Id_con<br />

Conjunto <strong>de</strong> PapelIn<br />

Conjunto <strong>de</strong> PapelOUT<br />

Conjunto <strong>de</strong> pares Port_rec-PapOUT<br />

Conjunto <strong>de</strong> pares Port_exp-PapIN<br />

Conjunto <strong>de</strong> pares Pap-pap<br />

Conf<br />

Serviço()<br />

Enviar()<br />

{ou}<br />

1<br />

*<br />

Papel<br />

*<br />

*<br />

liga<br />

Serviço()<br />

{...<br />

Enviar()}<br />

Enviar()<br />

{Papel OUT.Escrever(req);<br />

Papel IN. Escrever(resp)}<br />

Ler(resp)<br />

{Porta_rec.Respon<strong>de</strong>r();<br />

Conector.Serviço();}<br />

Escrever(req)<br />

{Porta_rec.Receber(req)}<br />

Porta_rec<br />

Id_rec<br />

Serv-Ofer<br />

Propr<br />

Receber(resp)<br />

{Componentes.Serviço()}<br />

Receber(req)<br />

Respon<strong>de</strong>r()<br />

Porta_exp<br />

Id_exp<br />

Serv_req<br />

Propr<br />

Requisitar()<br />

Receber(resp)<br />

1 1<br />

Protocolo<br />

Papel IN<br />

Id_in<br />

Propr<br />

Porta_exp<br />

PapelOUT<br />

Ler(req)<br />

Escrever(resp)<br />

Papel OUT<br />

Id_out<br />

Propr<br />

Porta_rec<br />

PapelIN<br />

Ler(resp)<br />

Escrever(req)<br />

Ler(req)<br />

{Porta_exp.Requisitar();<br />

Conector.Serviço();}<br />

Escrever(resp)<br />

Porta_exp.Receber(resp)}<br />

FIGURA 3-6 - Estrutura estática <strong>de</strong> um <strong>meta</strong>-mo<strong>de</strong>lo para especificar estilos.<br />

Na FIG 3-6, apresentamos a estrutura estática do <strong>meta</strong>-mo<strong>de</strong>lo. O <strong>meta</strong>-mo<strong>de</strong>lo,<br />

assim como a visão conceitual, <strong>de</strong>fine os elementos arquiteturais e as possíveis<br />

combinações entre eles. A seguir, explicamos cada um <strong>de</strong>stes elementos e mostramos as<br />

restrições impostas por eles. A linguagem <strong>de</strong> especificação Z é utilizada para <strong>de</strong>screver<br />

estes elementos.<br />

3.3.1.1 Configuração<br />

Como apresentamos em seções anteriores, a configuração é uma entida<strong>de</strong> que estabelece<br />

as restrições estruturais ou organizacionais <strong>de</strong> uma arquitetura. Para <strong>de</strong>sempenhar sua<br />

função, a configuração <strong>de</strong>ve <strong>de</strong>terminar: quais componentes e conectores a constituem;<br />

43


quais portas estão conectadas a quais papéis; quais papéis estão ligados a quais outros<br />

papéis; e quais componentes se comunicam com quais componentes. Então, a<br />

configuração possui os seguintes atributos ou características:<br />

• Conjunto <strong>de</strong> Componentes (<strong>através</strong> das agregações);<br />

• Conjunto <strong>de</strong> Conectores (<strong>através</strong> das agregações);<br />

• Conjunto <strong>de</strong> relações entre Porta Receptora e Papel OUT (<strong>através</strong> das<br />

agregações);<br />

• Conjunto <strong>de</strong> relações entre Porta Expedidora e Papel IN (<strong>através</strong> das<br />

agregações);<br />

• Conjunto <strong>de</strong> relações entre PapelIN e PapelOUT (<strong>através</strong> das agregações); e<br />

• Conjunto <strong>de</strong> relações entre Componentes.<br />

E estabelece as seguintes restrições para os seus atributos:<br />

• Em uma configuração não existem duas instâncias <strong>de</strong> Componentes com o<br />

mesmo i<strong>de</strong>ntificador;<br />

• Em uma configuração não existem duas instâncias <strong>de</strong> Conectores com o mesmo<br />

i<strong>de</strong>ntificador;<br />

• Cada Componente <strong>de</strong>ve estar relacionado a pelo menos um outro Componente;<br />

• Todas as relações Porta-Papel existentes na configuração pertencem ao conjunto<br />

<strong>de</strong> relações Porta-Papel <strong>de</strong> qualquer conector pertencente à configuração, e a<br />

porta pertence a qualquer componente da configuração;<br />

• Cada Papel relacionado a outro é um PapIN ou PapOUT <strong>de</strong> algum conector<br />

pertencente à configuração;<br />

• Para todas as relações entre Componentes Comp-Comp:<br />

o Os Componentes pertencem à configuração;<br />

o O primeiro componente da relação requisita um serviço e o segundo<br />

oferece este serviço, ou seja, as semânticas <strong>de</strong>stes serviços são iguais;<br />

o Existe pelo menos um conector com seus papéis ligados às portas<br />

daqueles Componentes.<br />

O esquema Z, a seguir, representa este elemento com seus atributos (<strong>de</strong>claração) e<br />

restrições (predicados).<br />

44


§<br />

comp_comp: Componentes © Componentes<br />

[PORTA, PAPEL, SERVICO, COMPONENTE, CONECTOR, INTERFACE, CONFIGURAÇÂO,<br />

PAPELIN, PAPELOUT]<br />

§<br />

comp: ¨ Componentes<br />

Configuração ¡£¡¢¡¢¡¢¡¤¡¢¡¢¡£¡¢¡¢¡¥¡¢¡¢¡¤¡¦¡£¡¢¡¢¡¢¡¥¡¢¡¢¡¤¡¢¡¢¡£¡¦¡¢¡£¡¢¡¢¡<br />

¢¡<br />

con: ¨ Conectores<br />

§<br />

port_pap1: Porta_rec © PapelOUT<br />

§<br />

port_pap2: Porta_exp © PapelIN<br />

§<br />

pap_pap: PapelIN © PapelOUT<br />

§<br />

¡¢¡¤¡¢¡¢¡£¡¦¡¢¡£¡¢¡¢¡¢¡¢¡£¡¢¡ <br />

c1, c2: Componentes c1 comp c2 comp<br />

§¥<br />

c1 . id_comp = c2 . id_comp c1 = c2<br />

§¥<br />

§<br />

c1, c2: Conectores c1 con c2 § <br />

con<br />

c1 . id_con = c2 . id_con c1 = §¥ c2<br />

x: Componentes x § <br />

comp<br />

z: Componentes z z x comp x z comp_comp §¥ comp_comp<br />

x: Porta_rec; y: x y PapelOUT § <br />

port_pap1<br />

cp: Componentes; cn: Conectores cp comp cn § x y <br />

con<br />

cn . port_pap1 x cp . §¥ in_port<br />

x: Porta_exp; y: x y PapelIN § <br />

port_pap2<br />

cp: Componentes; cn: Conectores cp comp cn § <br />

con<br />

y cn . port_pap2 x cp . out_port<br />

§¥ x<br />

x: PapelIN; y: x y PapelOUT § <br />

pap_pap<br />

z, w: Conectores z con w § <br />

con<br />

x z . in_pap y w . out_pap w . id_con z . §¥ id_con<br />

x, y: Componentes x comp y x y comp § <br />

comp_comp<br />

z, w: SERVICO z x . serv_req w y . § <br />

serv_ofer<br />

z = w<br />

k: Conectores; l: Porta_rec; m: Porta_exp; n: PapelOUT;<br />

§<br />

§<br />

o: l n PapelIN k . m o port_pap1 k . § <br />

port_pap2<br />

l y . in_port m x out_port .<br />

¡¢¡¤¡¢¡¢¡£¡¦¡¢¡£¡¢¡¢¡¢¡¢¡£¡¢¡¢¡¥¡¢¡¢¡¢¡¤¡¥¡¢¡¢¡¢¡¢¡¥¡¢¡¢¡£¡¢¡¢¡¢¡¢¡£¡¦¡¢¡¤¡¢¡<br />

<br />

FIGURA 3-7 - Esquema Configuração.<br />

3.3.1.2 Componentes<br />

Os componentes são as entida<strong>de</strong>s provedoras e requisitantes <strong>de</strong> serviços num sistema.<br />

Eles provêem os serviços requisitados a eles por realizar alguma tarefa internamente e<br />

por requisitarem outros serviços a outros componentes.<br />

Seus atributos são os seguintes:<br />

• I<strong>de</strong>ntificador;<br />

• Conjunto <strong>de</strong> Portas Receptoras (<strong>através</strong> da agregação);<br />

• Conjunto <strong>de</strong> Portas Expedidoras (<strong>através</strong> da agregação);<br />

• Conjunto <strong>de</strong> Serviços a serem requisitados (<strong>através</strong> da agregação);<br />

45


§<br />

conf: ¨ CONFIGURAÇÂO<br />

• Conjunto <strong>de</strong> serviços a serem oferecidos (<strong>através</strong> da agregação);<br />

• Configuração interna (<strong>através</strong> da agregação).<br />

As restrições impostas a estes atributos são:<br />

• Não há duas instâncias <strong>de</strong> portas com o mesmo i<strong>de</strong>ntificador;<br />

• Todos os serviços oferecidos nas portas receptoras pertencem aos serviços<br />

oferecidos do componente;<br />

• Todos os serviços requisitados nas portas expedidoras pertencem aos serviços<br />

requisitados do componente; e<br />

• Se o componente for composto, ou seja, possuir uma configuração, então este<br />

componente po<strong>de</strong> pertencer ao conjunto <strong>de</strong> componentes <strong>de</strong>sta configuração<br />

interna.<br />

O esquema Z, a seguir, representa este elemento com seus atributos e restrições.<br />

Componentes¡£¡¢¡¢¡¤¡¢¡¥¡¢¡¢¡¢¡¢¡¥¡¢¡¤¡¢¡¢¡¥¡¢¡¢¡£¡¦¡¢¡¤¡¢¡£¡¢¡¢¡¥¡¢¡¢¡¢¡¤¡¥¡<br />

§ ¢¡<br />

id_comp: § COMPONENTE<br />

¨ in_port: Porta_rec<br />

out_port: ¨ Porta_exp<br />

§<br />

serv_req, serv_ofer: ¨ SERVICO<br />

§<br />

¡¢¡¤¡¢¡¢¡£¡¦¡¢¡£¡¢¡¢¡¢¡¢¡£¡¢¡ §¥<br />

<br />

c1, c2: Porta_rec c1 in_port c2 § <br />

in_port<br />

c1 . id_port_rec = c2 . id_port_rec c1 = §¥ c2<br />

c1, c2: Porta_exp c1 out_port c2 § <br />

out_port<br />

c1 . id_port_exp = c2 . id_port_exp c1 = c2<br />

x: SERVICO; y: Porta_rec y in_port x = y . serv_ofer x serv_ofer<br />

§¥<br />

§¥<br />

x: SERVICO; y: Porta_exp y out_port x = y . serv_req x serv_req<br />

¡¢¡¤¡¢¡¢¡£¡¦¡¢¡£¡¢¡¢¡¢¡¢¡£¡¢¡¢¡¥¡¢¡¢¡¢¡¤¡¥¡¢¡¢¡¢¡¢¡¥¡¢¡¢¡£¡¢¡¢¡¢¡¢¡£¡¦¡¢¡¤¡¢¡<br />

<br />

FIGURA 3-8 - Esquema Componentes.<br />

§<br />

conf < 2<br />

As operações básicas realizadas por um componente são:<br />

• Serviço() – Esta operação refere-se a qualquer funcionalida<strong>de</strong> implementada<br />

pelo componente. Lembrando que, para realizar estas funcionalida<strong>de</strong>s ele po<strong>de</strong><br />

requisitar outros serviços a outros componentes e respon<strong>de</strong>r ao serviço<br />

requisitado.<br />

o Serviço() {Serviços(); Requisitar(); Respon<strong>de</strong>r()}<br />

46


id_port_rec: PORTA<br />

§<br />

serv_ofer: SERVICO<br />

§<br />

propr: Proprieda<strong>de</strong><br />

§<br />

• Requisitar() – A operação Requisitar() indica que o componente <strong>de</strong>ve pedir a<br />

alguma <strong>de</strong> suas portas para que ela requisite um serviço.<br />

o Requisitar() {Porta_exp.Requisitar(req)}<br />

• Respon<strong>de</strong>r() – A operação Respon<strong>de</strong>r() indica que o componente pe<strong>de</strong> a alguma<br />

<strong>de</strong> suas portas para enviar uma resposta a algum serviço requisitado a ele.<br />

o Respon<strong>de</strong>r(){Porta_rec.Respon<strong>de</strong>r(resp)}<br />

Um componente po<strong>de</strong> possuir inúmeras portas, receptoras e expedidoras.<br />

3.3.1.3 Portas Receptoras<br />

As portas receptoras são pontos <strong>de</strong> interação que representam os serviços oferecidos<br />

pelo componente. Elas recebem requisições realizadas por outros componentes. Em<br />

nosso caso, consi<strong>de</strong>ramos que cada porta é responsável por um serviço. Assim um<br />

componente po<strong>de</strong> receber mais <strong>de</strong> uma requisição ao mesmo tempo, <strong>de</strong>pen<strong>de</strong>ndo apenas<br />

da tecnologia que for utilizada para a implementação do sistema. Os atributos das portas<br />

receptoras são: I<strong>de</strong>ntificador, Serviço a oferecer e Proprieda<strong>de</strong>s. O esquema Z, a seguir,<br />

representa este elemento.<br />

¢¡ Porta_rec¡£¡¢¡¢¡¢¡¥¡¢¡¢¡¤¡¢¡¥¡¢¡¢¡¢¡£¡¦¡¢¡¤¡¢¡£¡¦¡¢¡¥¡¢¡¢¡£¡¡£¡¢¡¦¡£¡¢¡¢¡¢¡<br />

¡¢¡¤¡¢¡¢¡£¡¦¡¢¡£¡¢¡¢¡¢¡¢¡£¡¢¡¢¡¥¡¢¡¢¡¢¡¤¡¥¡¢¡¢¡¢¡¢¡¥¡¢¡¢¡£¡¢¡¢¡¢¡¢¡£¡¦¡¢¡¤¡¢¡<br />

<br />

FIGURA 3-9 - Esquema Porta_rec.<br />

As operações básicas realizadas por uma porta receptora são:<br />

• Receber(req) – Esta operação pe<strong>de</strong> ao componente que a contém para executar<br />

um serviço específico passado como parâmetro.<br />

o Receber(req) {Componente.Serviço()}<br />

• Respon<strong>de</strong>r(resp) – Indica que a porta recebeu do componente que a contém uma<br />

resposta a um serviço que foi requisitado anteriormente. Esta operação é iniciada<br />

pelo próprio componente.<br />

o Respon<strong>de</strong>r(resp){resposta=resp}<br />

47


id_port_exp: PORTA §<br />

§<br />

serv_req: § SERVICO<br />

propr: Proprieda<strong>de</strong><br />

3.3.1.4 Portas Expedidoras<br />

As portas expedidoras são pontos <strong>de</strong> interação que representam os serviços dos quais o<br />

componente é cliente . Elas enviam requisições a outros componentes. Assim como para<br />

as portas Receptoras, consi<strong>de</strong>ramos que cada porta expedidora é responsável por enviar<br />

apenas um serviço. Os atributos das portas expedidoras são: I<strong>de</strong>ntificador, Serviço a<br />

requisitar e Proprieda<strong>de</strong>s. O esquema Z, a seguir, representa este elemento.<br />

¢¡ Porta_exp¡¢¡¥¡¢¡¢¡¢¡¤¡¥¡¢¡¢¡¢¡£¡¦¡¢¡£¡¡£¡¦¡¢¡£¡¢¡¢¡¥¡¡£¡¢¡¢¡¢¡¢¡¥¡¢¡¢¡£¡¡<br />

¡¢¡¤¡¢¡¢¡£¡¦¡¢¡£¡¢¡¢¡¢¡¢¡£¡¢¡¢¡¥¡¢¡¢¡¢¡¤¡¥¡¢¡¢¡¢¡¢¡¥¡¢¡¢¡£¡¢¡¢¡¢¡¢¡£¡¦¡¢¡¤¡¢¡<br />

<br />

FIGURA 3-10 - Esquema Porta_exp.<br />

As operações básicas realizadas por uma porta expedidora são:<br />

• Receber(resp) – Esta operação repassa ao componente que a contém uma<br />

resposta adquirida para um serviço específico requisitado anteriormente.<br />

o Receber(resp) {Componente.Serviço()}<br />

• Requisitar(req) – Indica que a porta recebeu do componente que a contém um<br />

pedido para requisitar um serviço a outro componente. Esta operação é iniciada<br />

pelo próprio componente.<br />

o Requisitar(req){requisição=req}<br />

3.3.1.5 Conectores<br />

Os componentes são in<strong>de</strong>pen<strong>de</strong>ntes uns dos outros. Cada componente não <strong>de</strong>ve<br />

conhecer (acessar diretamente) os componentes com os quais ele interage. Apenas a<br />

configuração e os conectores possuem este conhecimento (<strong>através</strong> dos pares port-pap1,<br />

port-pap2, comp-comp e pap-pap).<br />

Além <strong>de</strong> transferir as requisições <strong>de</strong> um componente para outro, os conectores<br />

po<strong>de</strong>m realizar alguma tarefa adicional para melhorar a comunicação entre componentes<br />

como por exemplo, transformar tipos <strong>de</strong> dados, verificar se o componente no final do<br />

conector está ativo e apto a receber requisições, segurança etc. Os atributos do conector<br />

são:<br />

48


§<br />

conf: CONFIGURAÇÂO<br />

§ c1 . id_outpap = c2 . id_outpap c1 = c2<br />

• I<strong>de</strong>ntificador;<br />

• Conjunto <strong>de</strong> papéis <strong>de</strong> entrada (<strong>através</strong> da agregação);<br />

• Conjunto <strong>de</strong> papéis <strong>de</strong> saída (<strong>através</strong> da agregação);<br />

• Conjunto <strong>de</strong> relações entre papéis (<strong>através</strong> da agregação);<br />

• Conjunto <strong>de</strong> relações entre porta e papel (<strong>através</strong> da agregação); e<br />

• Configuração interna (<strong>através</strong> da agregação).<br />

As restrições impostas a estes atributos são:<br />

• Não há duas instâncias <strong>de</strong> papéis com o mesmo i<strong>de</strong>ntificador;<br />

• Deve existir pelo menos um papel <strong>de</strong> entrada e um <strong>de</strong> saída;<br />

• Para todas as relações entre papéis um <strong>de</strong>les não pertence ao conector e o outro<br />

pertence;<br />

• Todos os papéis das relações port-pap1 e port-pap2 pertencem ao conector; e<br />

• Se o conector for composto, ou seja, possuir uma configuração, então este<br />

conector po<strong>de</strong> pertencer ao conjunto <strong>de</strong> conectores <strong>de</strong>sta configuração interna.<br />

O esquema Z, a seguir, representa este elemento com seus atributos e restrições.<br />

Conectores ¡¢¡¢¡£¡¦¡¢¡£¡¢¡¢¡¢¡¢¡£¡¢¡¢¡¥¡¢¡¢¡¢¡¤¡¥¡¢¡¦¡£¡¢¡¢¡¢¡¢¡¤¡¥¡¢¡¢¡¢¡£¡<br />

§ ¢¡<br />

id_con: § CONECTOR<br />

¨ in_pap: PapelIN<br />

out_pap: ¨ PapelOUT §<br />

§<br />

port_pap1: © Porta_rec § PapelOUT<br />

port_pap2: © Porta_exp § PapelIN<br />

pap_pap: © PapelIN PapelOUT<br />

¡¢¡¤¡¢¡¢¡£¡¦¡¢¡£¡¢¡¢¡¢¡¢¡£¡¢¡ <br />

c1, c2: PapelIN c1 in_pap c2 in_pap<br />

§<br />

§¥<br />

c1 . id_inpap = c2 . id_inpap c1 = c2<br />

<br />

§¥<br />

c1, c2: PapelOUT c1 out_pap c2 out_pap<br />

§<br />

in_pap <br />

out_pap §<br />

x: Porta_rec; y: PapelOUT x y port_pap1 y out_pap<br />

§¥<br />

§¥<br />

x: Porta_exp; y: x y PapelIN port_pap2 y in_pap<br />

x: PapelIN; y: PapelOUT x y pap_pap<br />

§¥<br />

x in_pap y out_pap x in_pap y out_pap<br />

§<br />

¡¢¡¤¡¢¡¢¡£¡¦¡¢¡£¡¢¡¢¡¢¡¢¡£¡¢¡¢¡¥¡¢¡¢¡¢¡¤¡¥¡¢¡¢¡¢¡¢¡¥¡¢¡¢¡£¡¢¡¢¡¢¡¢¡£¡¦¡¢¡¤¡¢¡<br />

<br />

FIGURA 3-11 - Esquema Conectores.<br />

§<br />

conf < 2<br />

49


Os conectores são representados, neste <strong>meta</strong>-mo<strong>de</strong>lo, como conectores <strong>de</strong><br />

primeira or<strong>de</strong>m. Conectores <strong>de</strong> primeira or<strong>de</strong>m são componentes que possuem a<br />

funcionalida<strong>de</strong> específica <strong>de</strong> efetivar a comunicação entre dois ou mais componentes<br />

[52]. A vantagem <strong>de</strong> tratar conectores como entida<strong>de</strong>s ativas da configuração é que eles<br />

ocultam todos os <strong>de</strong>talhes <strong>de</strong> comunicação para que os componentes se preocupem<br />

somente com suas funcionalida<strong>de</strong>s e eles po<strong>de</strong>m exercer vários tipos <strong>de</strong> comunicação<br />

sem afetar os componentes, por exemplo, chamada <strong>de</strong> procedimento, acesso <strong>de</strong> dados,<br />

linkagem, stream, evento, arbitrator, adaptador e distribuidor [38].<br />

Assim como os componentes, os conectores po<strong>de</strong>m ser compostos, contendo<br />

alguma configuração internamente. Esta configuração é constituída <strong>de</strong> componentes e<br />

conectores, <strong>de</strong> maneira idêntica aos componentes compostos. Nos últimos anos, muitas<br />

pesquisas vem sendo realizadas tendo como foco os conectores. Como a adaptação <strong>de</strong><br />

componentes é em muitas vezes inviável, investir no mecanismo <strong>de</strong> comunicação, ou seja<br />

nos conectores, é uma forma <strong>de</strong> adaptar um sistema para que ele permaneça operável sem<br />

ter que adaptar os componentes. Esta promete ser uma técnica po<strong>de</strong>rosa para composição<br />

<strong>de</strong> sistemas [14][24][38]. Além <strong>de</strong> consi<strong>de</strong>rar os conectores como entida<strong>de</strong>s <strong>de</strong> primeira<br />

or<strong>de</strong>m, GARLAN (1998) <strong>de</strong>fen<strong>de</strong> que é importante prover operadores para compor novos<br />

conectores a conectores já mo<strong>de</strong>lados. Na Seção 3.6, nós <strong>de</strong>finimos uma abordagem para<br />

comunicação <strong>de</strong> componentes baseada em um conector CORBA.<br />

As operações realizadas pelos conectores são:<br />

• Serviço() – Esta operação indica as funcionalida<strong>de</strong>s que um conector po<strong>de</strong><br />

<strong>de</strong>sempenhar. Lembrando que a função principal do conector é realizar a<br />

comunicação entre dois componentes, ou seja transmitir uma mensagem lida<br />

pelo papel <strong>de</strong> entrada e escrevê-la num papel <strong>de</strong> saída, esta tarefa foi<br />

<strong>de</strong>nominada Enviar.<br />

o Serviço() {...; Enviar()}<br />

• Enviar() – Indica que o conector recebeu uma requisição ou uma resposta e está<br />

repassando-a para um papel a<strong>de</strong>quado, <strong>de</strong> entrada ou <strong>de</strong> saída <strong>de</strong>pen<strong>de</strong>ndo do<br />

modo da mensagem.<br />

o Enviar(){PapelOUT.escrever(req); PapelIN_escrever(resp)}<br />

Os conectores, <strong>através</strong> <strong>de</strong> seus pontos <strong>de</strong> interação <strong>de</strong>nominados Papéis,<br />

interagem com os componentes. Assim como as portas, os papéis são <strong>de</strong> dois tipos,<br />

Papel IN e Papel OUT.<br />

50


§<br />

id_inpap: PAPEL<br />

§<br />

outpap: ¨ PapelOUT<br />

3.3.1.6 Papel IN<br />

O PapelIN é um ponto <strong>de</strong> interação do conector. Ele é responsável por ler as requisições<br />

<strong>de</strong> uma porta Expedidora e/ou escrever respostas nesta porta. Sendo assim, o papel é o<br />

elemento que <strong>de</strong> fato interage com o componente. Para isto, ele possui os seguintes<br />

atributos:<br />

• I<strong>de</strong>ntificador;<br />

• Proprieda<strong>de</strong>s;<br />

• Conjunto <strong>de</strong> portas expedidoras (Porta_exp); e<br />

• Conjunto <strong>de</strong> papéis <strong>de</strong> saída (PapelOUT).<br />

As restrições impostas aos atributos são:<br />

• Cada Port_exp relacionada a um PapelIN possui proprieda<strong>de</strong>s “iguais” às<br />

proprieda<strong>de</strong>s do PapelIN; e<br />

• Cada PapelOUT relacionado a um PapelIN possui proprieda<strong>de</strong>s “iguais” às<br />

proprieda<strong>de</strong>s do PapelIN.<br />

O esquema Z, a seguir, representa este elemento.<br />

¢¡ PapelIN¡¢¡£¡¢¡¢¡¢¡¢¡£¡¢¡¢¡¢¡¥¡¢¡¢¡¢¡£¡¢¡¢¡¢¡¢¡£¡¦¡¢¡¥¡¤¡¢¡¢¡¢¡£¡¢¡¦¡£¡¢¡¤¡¢¡<br />

§<br />

propr: Proprieda<strong>de</strong><br />

§<br />

port_exp: ¨ Porta_exp<br />

¡¢¡¤¡¢¡¢¡£¡¦¡¢¡£¡¢¡¢¡¢¡¢¡£¡¢¡ <br />

x: Porta_exp x port_exp x . propr = propr<br />

§¥<br />

§¥<br />

x: PapelOUT x outpap x . propr = propr<br />

¡¢¡¤¡¢¡¢¡£¡¦¡¢¡£¡¢¡¢¡¢¡¢¡£¡¢¡¢¡¥¡¢¡¢¡¤¡¢¡¥¡¢¡¢¡¢¡¢¡¥¡¢¡¢¡£¡¢¡¢¡¢¡¢¡£¡¦¡¢¡¤¡¢¡<br />

<br />

FIGURA 3-12 - Esquema PapelIN.<br />

As operações realizadas pelo PapelIn são:<br />

• Ler(req) – Indica que o papel está apto a ler as requisições que foram feitas por<br />

uma certa porta expedidora com a qual este papel está conectado, e repassa esta<br />

requisição para o conector que a contém para que se necessário ele realize<br />

alguma tarefa e repasse a requisição/resposta para o papel que irá finalizar a<br />

transmissão.<br />

51


§<br />

id_outpap: PAPEL<br />

§<br />

inpap: ¨ PapelIN<br />

§¥<br />

x: PapelIN x inpap x . propr = propr<br />

o Ler(req){Expedidor.Requisitar(req); Conector.Serviço()}<br />

• Escrever(resp) – Indica que o papel está apto a escrever as respostas<br />

encaminhadas por uma certa porta receptora em uma porta expedidora.<br />

o Escrever(resp){Expedidor.Receber(resp)}<br />

3.3.1.7 Papel OUT<br />

O PapelOUT é um ponto <strong>de</strong> interação do conector. Ele é responsável por escrever as<br />

requisições em uma porta Receptora e/ou ler respostas <strong>de</strong>sta porta. Para isto ele possui<br />

os seguintes atributos:<br />

• I<strong>de</strong>ntificador;<br />

• Proprieda<strong>de</strong>s;<br />

• Conjunto <strong>de</strong> portas receptoras (Porta_rec); e<br />

• Conjunto <strong>de</strong> papéis <strong>de</strong> entrada (PapelIN).<br />

As restrições impostas aos atributos são:<br />

• Cada Port_rec relacionada a um PapelOUT possui proprieda<strong>de</strong>s “iguais” às<br />

proprieda<strong>de</strong>s do PapelOUT; e<br />

• Cada PapelIN relacionado a um PapelOUT possui proprieda<strong>de</strong>s “iguais” às<br />

proprieda<strong>de</strong>s do PapelOUT.<br />

O esquema Z, a seguir, representa este elemento.<br />

¢¡ PapelOUT ¡¢¡¢¡¢¡£¡¢¡¢¡¢¡¢¡£¡¦¡¢¡£¡¢¡¢¡¢¡¢¡£¡¢¡¢¡¥¡¦¡¢¡¤¡¢¡£¡¢¡¢¡¥¡¢¡¢¡¢¡¤¡¥¡<br />

§<br />

propr: Proprieda<strong>de</strong><br />

§<br />

port_rec: ¨ Porta_rec<br />

¡¢¡¤¡¢¡¢¡£¡¦¡¢¡£¡¢¡¢¡¢¡¢¡£¡¢¡¢¡¥¡¢¡¢¡¢¡¤¡¥¡¢¡¢¡¢¡¢¡¥¡¢¡¢¡£¡¢¡¢¡¢¡¢¡£¡¦¡¢¡¤¡¢¡<br />

<br />

FIGURA 3-13 - Esquema Papel OUT.<br />

¡¢¡¤¡¢¡¢¡£¡¦¡¢¡£¡¢¡¢¡¢¡¢¡£¡¢¡ <br />

x: Porta_rec x port_rec x . propr = propr<br />

§¥<br />

As operações realizadas pelo PapelOUT são:<br />

• Ler(resp) – Indica que o papel está apto a ler as respostas que foram oferecidas<br />

por uma certa porta receptora com a qual este papel está conectado, e repassa<br />

52


esta resposta para o conector que a contém para que se necessário ele realize<br />

alguma tarefa e repasse a resposta para o papel que irá finalizar a transmissão.<br />

o Ler(resp){Receptor.Respon<strong>de</strong>r(resp);Conector.Serviço()}<br />

• Escrever(req) – Indica que o papel está apto a escrever as requisições<br />

encaminhadas por uma certa porta expedidora em uma porta receptora com a<br />

qual ele está conectada.<br />

o Escrever(req){Receptor.Receber(req)}<br />

3.3.1.8 Protocolo<br />

Os Papéis e as Portas <strong>de</strong>vem obe<strong>de</strong>cer a um protocolo para que a comunicação<br />

realmente aconteça. Assim como a configuração, o protocolo é um elemento que<br />

gerencia um certo conjunto <strong>de</strong> restrições na arquitetura. Ele é responsável por<br />

<strong>de</strong>terminar as regras <strong>de</strong> comunicação: como ocorre a comunicação; quais proprieda<strong>de</strong>s<br />

são necessárias para que uma porta esteja conectada a um papel; e quem inicia a leitura<br />

ou escrita. Deve-se garantir que Papéis IN só interagem com portas Expedidoras ou<br />

papéis OUT e que Papéis OUT com portas Receptoras ou papéis IN e que as<br />

proprieda<strong>de</strong>s dos dados passados entre Portas e Papéis são idênticas ou compatíveis.<br />

Desta forma, algumas informações relativas ao protocolo são distribuídas nos<br />

outros elementos arquiteturais. No elemento Protocolo, <strong>de</strong>finimos as proprieda<strong>de</strong>s. Elas<br />

indicam a semântica e sintaxe das mensagens que transitam entre portas e papéis. Os<br />

atributos mais genéricos são:<br />

• Direção: Entrada ou Saída;<br />

• Modo: Notificação ou Requisição;<br />

• Tipo: Real, Inteiro ou String; e<br />

• Sincronização: Síncrono, Assíncrono, Síncrono Deferido.<br />

O esquema Z, a seguir, representa este elemento:<br />

53


dir: DIR §<br />

§<br />

mo<strong>de</strong>: § MODE<br />

type: TYPE<br />

§<br />

Synchonize: SYNCHRONIZATION<br />

DIR :: entry exit<br />

TYPE :: real integer string<br />

MODE :: reply rereply<br />

SYNCHRONIZATION :: Synchrono Assynchrono Defered_Synchrono<br />

¢¡ Proprieda<strong>de</strong>¡¢¡¥¡¢¡¤¡¢¡¢¡¥¡¢¡¢¡¢¡£¡¦¡¤¡¢¡¢¡£¡¦¡¢¡£¡¢¡¦¡¤¡¢¡£¡¢¡¢¡¢¡¥¡¢¡¢¡¤¡¢¡<br />

¡¢¡¤¡¢¡¢¡£¡¦¡¢¡£¡¢¡¢¡¢¡¢¡£¡¢¡¢¡¥¡¢¡¢¡¢¡¤¡¥¡¢¡¢¡¢¡¢¡¥¡¢¡¢¡£¡¢¡¢¡¢¡¢¡£¡¦¡¢¡¤¡¢¡<br />

<br />

FIGURA 3-14 - Esquema Proprieda<strong>de</strong><br />

A seguir, apresentamos a estrutura dinâmica do <strong>meta</strong>-mo<strong>de</strong>lo. A informação<br />

referente a seqüência <strong>de</strong> leitura e escrita nas portas e papéis é mostrado nos diagramas<br />

<strong>de</strong> seqüência e é retratado no diagrama <strong>de</strong> classes pelas operações <strong>de</strong> leitura e escrita<br />

dos papéis. Esta seqüência <strong>de</strong> leitura e escrita po<strong>de</strong> ser realizada <strong>de</strong> uma das quatro<br />

formas abaixo:<br />

a) O papel IN lê da porta OUT e o papel OUT escreve na porta IN;<br />

b) O papel IN lê da porta OUT e a porta IN lê do papel OUT;<br />

c) A porta OUT escreve no papel IN e o papel OUT escreve na porta IN e;<br />

d) A porta OUT escreve no papel IN e a porta IN lê do papel OUT.<br />

Como nós achamos mais conveniente que o conector tenha total controle sobre a<br />

conexão então o melhor método é o <strong>de</strong>scrito pela primeira forma apresentada, a), em<br />

que o conector verifica se há novas requisições a serem realizadas e as lê. Esta forma<br />

oferece uma maior in<strong>de</strong>pendência aos componentes.<br />

3.3.2 Estrutura Dinâmica<br />

3.3.2.1 Diagramas <strong>de</strong> Sequências<br />

Os diagramas <strong>de</strong> seqüência foram utilizados para retratar como acontecem:<br />

• A conexão entre componentes, retratada no diagrama <strong>de</strong> classes pela associação<br />

<strong>de</strong>nominada conexão entre portas e papéis e;<br />

• A ligação entre conectores, retratada no diagrama <strong>de</strong> classes pela associação<br />

recursiva <strong>de</strong>nominada liga, entre papéis.<br />

54


Consi<strong>de</strong>rando que, papéis IN lêem ou escrevem em portas OUT e papéis OUT<br />

escrevem ou lêem em portas IN, como retratamos na Seção 3.3.1.8 a), a seguir<br />

apresentamos como ocorrem as conexões quando os tipos <strong>de</strong> sincronização são<br />

assíncrono, síncrono ou síncrono <strong>de</strong>ferido.<br />

1) Assíncrono – Neste diagrama, o Componente1 requisita um serviço a uma <strong>de</strong> suas<br />

portas expedidoras e continua seus serviços. O Conector1 é responsável por ler esta<br />

requisição e encaminhá-la para uma porta receptora <strong>através</strong> <strong>de</strong> seus papéis <strong>de</strong> entrada e<br />

saída. A porta receptora, por sua vez, inicia o serviço requisitado no componente que a<br />

contém.<br />

Componente1 Porta_exp1 Papel IN1 Conector1 Papel OUT1 Porta_rec1 Componente2<br />

Serviço()<br />

Requisitar()<br />

Serviço()<br />

Ler(req)<br />

Serviço()<br />

Serviço()<br />

Enviar()<br />

Escrever<br />

(req)<br />

Receber<br />

(req)<br />

Serviço()<br />

Serviço()<br />

FIGURA 3-15 - Diagrama <strong>de</strong> seqüência para conexão assíncrona.<br />

2) Síncrono – O modo síncrono acontece <strong>de</strong> maneira similar ao assíncrono. Entretanto,<br />

neste caso, o componente que requisita o serviço fica bloqueado até que uma resposta<br />

seja recebida.<br />

Componente1 Porta_exp1 Papel IN1 Conector1 Papel OUT1 Porta_rec1 Componente2<br />

Serviço()<br />

Requisitar()<br />

Ler(req)<br />

Serviço()<br />

Serviço()<br />

Enviar()<br />

Escrever<br />

(req)<br />

Receber<br />

(req)<br />

Serviço()<br />

Receber<br />

(resp)<br />

Escrever<br />

(resp)<br />

Enviar()<br />

Serviço() Ler(resp) Respon<strong>de</strong>r()<br />

Serviço()<br />

FIGURA 3-16 - Diagrama <strong>de</strong> seqüência para conexão síncrona.<br />

3) Síncrono Deferido – O modo síncrono <strong>de</strong>ferido é semelhante ao modo síncrono.<br />

Entretanto, neste caso, embora o serviço requisitado necessite <strong>de</strong> uma resposta, o<br />

componente que o requisitou continua seus serviços e recebe esta resposta em qualquer<br />

tempo futuro.<br />

55


Componente1 Porta_exp1 Papel IN1 Conector1 Papel OUT1 Porta_rec1 Componente2<br />

Serviço()<br />

Requisitar()<br />

Serviço()<br />

Ler(req)<br />

Serviço()<br />

Serviço()<br />

Enviar()<br />

Escrever<br />

(req)<br />

Receber<br />

(req)<br />

Serviço()<br />

Receber<br />

(resp)<br />

Serviço()<br />

Escrever<br />

(resp)<br />

Enviar()<br />

Serviço() Ler(resp) Respon<strong>de</strong>r()<br />

Serviço()<br />

FIGURA 3-17 - Diagrama <strong>de</strong> seqüência para conexão síncrona.<br />

A seguir, na FIG. 3-18, retratamos como ocorre a ligação entre papéis.<br />

Consi<strong>de</strong>re que o conector N é um conector composto que agrega uma configuração que,<br />

por sua vez, possui um conector N 1. A ligação é simplesmente um envio <strong>de</strong> requisições<br />

<strong>de</strong> um papel <strong>de</strong> um conector para o papel <strong>de</strong> outro conector.<br />

PapelIN1 ConectorN PapelOUT1 PapelIN2 ConectorN 1<br />

PapelOUT2<br />

Ler(req)<br />

Escreve(req)<br />

Enviar()<br />

Serviço()<br />

Escrever(req)<br />

Enviar()<br />

FIGURA 3-18 - Diagrama <strong>de</strong> seqüência para a ligação entre papéis.<br />

3.3.2.2 Diagramas <strong>de</strong> Estados<br />

Os diagramas <strong>de</strong> estados, a seguir, são diagramas que representam os estados da<br />

classe Componente. De acordo com o tipo <strong>de</strong> sincronização, o componente po<strong>de</strong><br />

assumir um conjunto diferente <strong>de</strong> possíveis estados.<br />

1) Comunicação Assíncrona - Os estados assumidos são Executando e Requisitando. O<br />

componente não aguarda respostas nem respon<strong>de</strong> aos serviços requisitados a ele.<br />

Executando<br />

Serviço<br />

executado<br />

Requisitando<br />

Serviço<br />

requisitado<br />

FIGURA 3-19 - Diagrama <strong>de</strong> estados para conexão assíncrona.<br />

56


2) Comunicação Síncrona - Os estados assumidos são Executando, Respon<strong>de</strong>ndo,<br />

Requisitando, Aguardando e Recebendo Resposta. Neste caso, após requisitar um<br />

serviço o componente só estará apto a executar alguma outra ativida<strong>de</strong> <strong>de</strong>pois <strong>de</strong><br />

receber uma resposta àquele serviço.<br />

Executando<br />

Serviço<br />

executado<br />

Respon<strong>de</strong>ndo<br />

Serviço<br />

requisitado<br />

Resposta<br />

obtida<br />

Requisitando<br />

Recebendo<br />

resposta<br />

Requisição realizada<br />

Aguardando<br />

FIGURA 3-20 - Diagrama <strong>de</strong> estados para conexão síncrona.<br />

3) Comunicação Síncrona Deferida - Os estados assumidos são Executando,<br />

Respon<strong>de</strong>ndo, Requisitando e Recebendo Resposta. Neste caso, o componente não<br />

aguarda respostas mais as recebe em algum momento.<br />

Executando<br />

Serviço<br />

executado<br />

Respon<strong>de</strong>ndo<br />

Serviço<br />

requisitado<br />

Resposta<br />

obtida<br />

Requisitando<br />

Recebendo<br />

resposta<br />

Requisição realizada<br />

Executando<br />

FIGURA 3-21 - Diagrama <strong>de</strong> estados para conexão síncrona <strong>de</strong>ferida.<br />

3.3.3 Estereótipos<br />

Através dos estereótipos, a UML permite esten<strong>de</strong>r os elementos <strong>de</strong> mo<strong>de</strong>lo que ela<br />

<strong>de</strong>fine com conceitos específicos do domínio. Eles são, geralmente, formas<br />

especializadas <strong>de</strong> algum tipo <strong>de</strong> mo<strong>de</strong>lo <strong>de</strong>finido na UML. Através <strong>de</strong>les, o arquiteto<br />

po<strong>de</strong>, por exemplo, trabalhar com diagramas <strong>de</strong> caixas e linhas, pois estes possuirão<br />

sintaxe e semântica bem <strong>de</strong>finidas em UML. Os estereótipos ajudam a melhor visualizar<br />

e <strong>de</strong>screver um projeto <strong>de</strong> software.<br />

57


Para facilitar a visualização e distinção dos elementos arquiteturais nós<br />

<strong>de</strong>finimos alguns estereótipos. Para representar:<br />

• A classe ! Configuração usamos um pacote estereotipado com o nome , FIG. 3-22a);<br />

• As classes Componente e ! Conector <strong>de</strong>finimos retângulos menores para o<br />

conector e maiores para os componentes. Além do tamanho, eles são<br />

diferenciados pelos pontos <strong>de</strong> interação que possuem, portas ou papéis, FIG. 3-<br />

22b) e c).<br />

• A classe ! Porta_rec usamos triângulos com o vértice apontado para o<br />

componente, FIG. 3-22 d).<br />

• A classe ! Porta_exp usamos triângulos com a base próxima ao componente,<br />

FIG. 3-22 e).<br />

• A classe ! PapelIN usamos triângulos fechados com o vértice apontado para o<br />

conector, FIG. 3-22 f).<br />

• A classe ! PapelOUT usamos triângulos fechados com a base próxima ao<br />

componente, FIG. 3-22 g).<br />

<br />

a) Configuração b) Componente c) Conector<br />

d) Porta_rec e) Porta_exp f) PapelIN g) PapelOUT<br />

FIGURA 3-22 - Estereótipos para representação <strong>através</strong> <strong>de</strong> caixas e linhas.<br />

Nesta seção, apresentamos um <strong>meta</strong>-mo<strong>de</strong>lo que <strong>de</strong>nominamos <strong>meta</strong>-mo<strong>de</strong>lo<br />

para mo<strong>de</strong>lar estilos. Este <strong>meta</strong>-mo<strong>de</strong>lo, po<strong>de</strong> ser utilizado como base para a criação <strong>de</strong><br />

arquiteturas que não seguem as restrições <strong>de</strong> nenhum estilo, como também <strong>de</strong>finido pela<br />

Visão Conceitual, ou utilizado como base para mo<strong>de</strong>lar estilos. Nas próximas seções,<br />

apresentamos alguns <strong>padrões</strong> mo<strong>de</strong>lados segundo as características <strong>de</strong>ste <strong>meta</strong>-mo<strong>de</strong>lo.<br />

No ANEXO B, a especificação formal completa <strong>de</strong>ste <strong>meta</strong>-mo<strong>de</strong>lo é apresentada.<br />

58


3.4 Um Meta-mo<strong>de</strong>lo para Mo<strong>de</strong>lar Arquiteturas em Camadas<br />

Para elaborar um <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar arquiteturas em camadas, instanciamos o<br />

<strong>meta</strong>-mo<strong>de</strong>lo apresentado na Seção 3.3, e acrescentamos as características intrínsecas a<br />

este estilo. As características impostas pelo Estilo Camadas são características<br />

estruturais e <strong>de</strong> interação. A seguir, apresentamos que características são estas e como<br />

elas são incluídas no <strong>meta</strong>-mo<strong>de</strong>lo instanciado.<br />

Meta-mo<strong>de</strong>lo para<br />

mo<strong>de</strong>lar estilos<br />

Meta-mo<strong>de</strong>lo para<br />

mo<strong>de</strong>lar arquiteturas<br />

em camadas<br />

FIGURA 3-23 - Instanciação para criar um <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar arquiteturas em camadas.<br />

O vocabulário <strong>de</strong>finido pelo estilo camadas é: Configuração em Camadas para<br />

<strong>de</strong>notar Configuração e Camadas para Componentes. Os outros elementos permanecem<br />

com o mesmo vocabulário. A seguir, <strong>de</strong>finimos cada um <strong>de</strong>stes elementos indicando as<br />

restrições impostas por este estilo.<br />

3.4.1 Estrutura Estática<br />

3.4.1.1 Configuração em Camadas<br />

A configuração em camadas é um agrupamento <strong>de</strong> camadas e conectores organizados<br />

hierarquicamente. Para tanto, a organização dos componentes se baseia no sentido da<br />

comunicação que, mais usualmente, é TopDown, ou seja, cada camada requisita<br />

serviços das camadas mais baixas e a conexão ocorre entre camadas adjacentes.<br />

Para fazer o controle <strong>de</strong>sta hierarquia, nós relacionamos cada camada a um<br />

<strong>de</strong>terminado nível. O nível indica quais camadas são adjacentes e quais são <strong>de</strong> nível<br />

mais baixo ou mais alto. Por exemplo, se A, B e C são camadas, po<strong>de</strong>mos ter a seguinte<br />

configuração, veja a FIG. 3-24: (A,1),(B,1),(C,2), on<strong>de</strong> a camada C está relacionada ao<br />

nível 2 e as camadas A e B estão relacionadas ao nível 1. O estilo não faz nenhuma<br />

59


estrição quanto a comunicação entre camadas em um mesmo nível, então po<strong>de</strong> haver<br />

ou não comunicação entre elas. Um exemplo típico <strong>de</strong> camadas em um mesmo nível <strong>de</strong><br />

generalida<strong>de</strong>, são as camadas TCP e UDP na arquitetura <strong>de</strong> re<strong>de</strong>s, elas implementam o<br />

mesmo serviço <strong>de</strong> maneiras diferentes.<br />

C<br />

A<br />

B<br />

FIGURA 3-24 - Exemplo da organização <strong>de</strong> camadas.<br />

Para gerenciar estas conexões, a configuração em camadas precisa conhecer,<br />

além das informações conhecidas pela configuração, do <strong>meta</strong>-mo<strong>de</strong>lo da Seção 3.3, o<br />

tipo <strong>de</strong> interação e a relação entre componentes e níveis.<br />

Características da Configuração em Camadas:<br />

• Características da Configuração;<br />

• Conjunto <strong>de</strong> relações entre Camada e Nível;<br />

• Define um tipo <strong>de</strong> interação – top1, que é a interação no sentido TopDown entre<br />

camadas adjacentes.<br />

Restrições:<br />

• Restrições da Configuração;<br />

• Os componentes relacionados aos níveis pertencem à configuração;<br />

• Só há um tipo <strong>de</strong> interação que é top1; e<br />

• Este tipo <strong>de</strong> interação estabelece que uma camada só po<strong>de</strong> está relacionada com<br />

suas camadas adjacentes no sentido TopDown.<br />

60


Configuração<br />

%<br />

tipo_interação: COMUNICAÇÃO<br />

(<br />

%<br />

nível: Componentes & '<br />

x: Componentes; y: ' -/. x0 y1 2 nível 3 x 2 comp<br />

(,+<br />

4 . +<br />

x, y: Componentes - x 2 comp 5 y 2 comp 5 . x0 y1 2 comp_comp<br />

(<br />

COMUNICAÇÃO ::" top1<br />

#¢$ Configuração_Camadas $¢$¢$¢$¢$£$¢$¤$¢$¢$¢$¢$£$¢$¦$¥$¤$¢$¢$¢$£$¢$¦$£$¢$¤$¢$¦$<br />

)¢*¢*¤*¢*¢*£*¦*¢*£*¢*¢*¢*¢*£*¢*<br />

3 nível x = nível y + 11 (<br />

6¢*¢*¤*¢*¢*£*¦*¢*£*¢*¢*¢*¢*£*¢*¢*¥*¢*¢*¢*¤*¥*¢*¢*¢*¢*¥*¢*¢*£*¢*¢*¢*¢*£*¦*¢*¤*¢*<br />

FIGURA 3-25 - Esquema Configuração_camadas.<br />

(<br />

tipo_interação = top1<br />

3.4.1.2 Camadas<br />

Assim como os componentes da configuração, na Seção 3.3, as camadas são as<br />

entida<strong>de</strong>s provedoras e solicitadoras <strong>de</strong> serviços no sistema. Elas herdam todos as<br />

características dos Componentes e não acrescentam ou modificam nenhuma<br />

característica ou restrição. Apenas o vocabulário utilizado para componentes é<br />

modificado, emprega-se o nome Camadas para <strong>de</strong>notá-los.<br />

Entretanto, uma característica intrínseca às camadas é que, normalmente, elas<br />

são componentes <strong>de</strong> alta granularida<strong>de</strong> que <strong>de</strong>vem, em momentos posteriores do <strong>de</strong>sign,<br />

ser refinados. Assim, uma camada, geralmente, contém alguma configuração interna,<br />

híbrida ou padronizada. Os componentes do <strong>meta</strong>-mo<strong>de</strong>lo, na Seção 3.3, dão suporte a<br />

esta característica.<br />

Assim como as camadas, as portas, os conectores, os papéis e o protocolo se<br />

comportam <strong>de</strong> maneira idêntica aos elementos anteriormente apresentados na Seção 3.3.<br />

No ANEXO B, apresentamos a especificação completa <strong>de</strong>ste <strong>meta</strong>-mo<strong>de</strong>lo.<br />

A seguir, na FIG. 3-26, apresentamos a estrutura estática do <strong>meta</strong>-mo<strong>de</strong>lo aqui<br />

<strong>de</strong>finido. Nesta figura, utilizamos a cor preta para <strong>de</strong>stacar as alterações que foram<br />

realizadas no <strong>meta</strong>-mo<strong>de</strong>lo apresentado na Seção 3.3.3, para que ele dê suporte a<br />

especificação arquiteturas em camadas; e a cor cinza para representar o próprio <strong>meta</strong>mo<strong>de</strong>lo<br />

da Seção 3.3.3.<br />

61


Configuração<br />

1<br />

Conjunto <strong>de</strong> Componentes<br />

Conjunto <strong>de</strong> Conectores<br />

Conjunto dos pares Port_rec-PapOUT<br />

Conjunto dos pares Port_exp-PapIN<br />

Conjunto dos pares Pap-Pap<br />

Conjunto dos pares Comp-Comp<br />

Nível<br />

Tipo_interação<br />

1<br />

*<br />

Componentes<br />

Id_com<br />

Conjunto <strong>de</strong> Serv_req<br />

Conjunto <strong>de</strong> Serv_ofer<br />

Conjunto <strong>de</strong> Porta_rec<br />

Conjunto <strong>de</strong> Porta_exp<br />

Conf<br />

Serviço()<br />

Requisitar()<br />

Respon<strong>de</strong>r()<br />

1<br />

*<br />

Porta<br />

1<br />

1<br />

* conexão *<br />

*<br />

*<br />

obe<strong>de</strong>ce<br />

obe<strong>de</strong>ce<br />

1<br />

1 *<br />

Conectores<br />

Id_con<br />

Conjunto <strong>de</strong> PapelIn<br />

Conjunto <strong>de</strong> PapelOUT<br />

Conjunto <strong>de</strong> pares Port_rec-PapOUT<br />

Conjunto <strong>de</strong> pares Port_exp-PapIN<br />

Conjunto <strong>de</strong> pares Pap-pap<br />

Conf<br />

Serviço()<br />

Enviar()<br />

1<br />

*<br />

Papel<br />

*<br />

*<br />

liga<br />

{ou}<br />

{ou}<br />

Porta_rec<br />

Id_rec<br />

Serv-Ofer<br />

Propr<br />

Receber(req)<br />

Respon<strong>de</strong>r()<br />

Porta_exp<br />

Id_exp<br />

Serv_req<br />

Propr<br />

Requisitar()<br />

Receber(resp)<br />

1 1<br />

Protocolo<br />

Papel IN<br />

Id_in<br />

Propr<br />

Porta_exp<br />

PapelOUT<br />

Ler(req)<br />

Escrever(resp)<br />

Papel OUT<br />

Id_out<br />

Propr<br />

Porta_rec<br />

PapelIN<br />

Ler(resp)<br />

Escrever(req)<br />

FIGURA 3-26 - Estrutura estática do <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar arquiteturas <strong>de</strong> software em<br />

camadas.<br />

3.4.2 Estrutura Dinâmica<br />

A estrutura dinâmica <strong>de</strong>ste <strong>meta</strong>-mo<strong>de</strong>lo é idêntica a <strong>de</strong>scrição oferecida na Seção 3.3.<br />

A seguir, oferecemos algumas variações do estilo camadas, quanto ao modo <strong>de</strong><br />

interação.<br />

62


3.4.3 Variações do Estilo Camadas<br />

Como <strong>de</strong>finimos na Seção 2.1.1.1, o estilo camadas po<strong>de</strong> se apresentar <strong>de</strong> maneira<br />

diferenciada da maneira convencional. Estas variações ocorrem, principalmente, com<br />

relação ao tipo <strong>de</strong> interação existente entre as camadas. Além <strong>de</strong> TopDown entre<br />

camadas adjacentes, as interações po<strong>de</strong>m ocorrer no sentido BottomUp ou em ambos os<br />

sentidos e entre camadas não-adjacente ou em ambos. Assim temos um total <strong>de</strong> 6 tipos<br />

<strong>de</strong> interações passíveis <strong>de</strong> ocorrer: Camadas adjacentes-BottomUp, Camadas adjacentes-<br />

TopDown, Camadas adjacentes-BottomUp-TopDown, Camadas não-adjacentes-<br />

BottomUp, Camadas não-adjacentes-TopDown, Camadas não-adjacentes-BottomUp-<br />

TopDown.<br />

Assim como mostrado na Seção 3.4.1, o único elemento que sofre alterações no<br />

<strong>meta</strong>-mo<strong>de</strong>lo é o elemento Configuração, neste caso Configuração em Camadas, on<strong>de</strong><br />

adicionamos estas outras maneiras <strong>de</strong> interação. A estrutura estática e dinâmica,<br />

representadas pelos diagramas da UML, não sofrem nenhuma alteração, visto que estes<br />

diagramas não representam estas informações tão <strong>de</strong>talhadamente como os esquemas Z.<br />

De maneira idêntica ao que <strong>de</strong>finimos na Seção 3.4.1, para dar suporte a estes tipos <strong>de</strong><br />

interação, a configuração em camadas possui as seguintes características e restrições<br />

adicionais:<br />

Características da Configuração em Camadas:<br />

• Características da Configuração;<br />

• Conjunto <strong>de</strong> relações entre Camada e Nível; e<br />

• Define um tipo <strong>de</strong> interação – top1,top1, top2, topbot1, topbot2, bot1, bot2.<br />

Restrições:<br />

• Restrições da Configuração;<br />

• Os componentes relacionados aos níveis pertencem à configuração;<br />

• Há seis tipos <strong>de</strong> interação:<br />

• O top1 estabelece que uma camada só po<strong>de</strong> estar relacionada com suas camadas<br />

adjacentes no sentido TopDown;<br />

• O bot1 estabelece que uma camada só po<strong>de</strong> estar relacionada com suas camadas<br />

adjacentes no sentido BottomUp;<br />

63


Configuração<br />

(<br />

tipo_interação: COMUNICAÇÃO<br />

(<br />

(<br />

nível: Componentes & '<br />

( 4 . +<br />

x, y: Componentes - x 2 comp 5 y 2 comp 5 . x0 y1 2 comp_comp<br />

( 4 . +<br />

x, y: Componentes - x 2 comp 5 y 2 comp 5 . x0 y1 2 comp_comp<br />

( 4 . +<br />

x, y: Componentes - x 2 comp 5 y 2 comp 5 . x0 y1 2 comp_comp<br />

( 4 . +<br />

x, y: Componentes - x 2 comp 5 y 2 comp 5 . x0 y1 2 comp_comp<br />

( 4 . +<br />

x, y: Componentes - x 2 comp 5 y 2 comp 5 . x0 y1 2 comp_comp<br />

• O topbot1 estabelece que uma camada só po<strong>de</strong> estar relacionada com suas<br />

camadas adjacentes no sentido TopDown e BottomUp;<br />

• O top2 estabelece que uma camada po<strong>de</strong> estar relacionada com suas camadas<br />

adjacentes ou não- adjacentes no sentido TopDown;<br />

• O bot2 estabelece que uma camada po<strong>de</strong> estar relacionada com suas camadas<br />

adjacentes ou não- adjacentes no sentido BottomUp; e<br />

• O topbot2 estabelece que uma camada po<strong>de</strong> estar relacionada com suas camadas<br />

adjacentes ou não- adjacentes no sentido TopDown e BottomUp.<br />

Esquema Z:<br />

::7 COMUNICAÇÃO 8 top1 8 top2 8 topbot1 8 bot1 8 bot2<br />

9 * topbot2<br />

Configuração_Camadas *¢*¢*¢*¢*£*¢*¤*¢*¢*¢*¢*£*¢*¦*¥*¤*¢*¢*¢*£*¢*¦*£*¢*¤*¢*¦*<br />

)¢*¢*¤*¢*¢*£*¦*¢*£*¢*¢*¢*¢*£*¢*<br />

x: Componentes; y: ' -/. x0 y1 2 nível 3 x 2 comp<br />

(<br />

(,+<br />

tipo_interação = bot1 .<br />

3 nível x = nível y - 111 (;:<br />

(<br />

tipo_interação = topbot1 .<br />

3 nível x = nível y + 1 nível x = nível y - 111 (<br />

. tipo_interação = topbot2<br />

(;:<br />

3 nível x ? nível y11 (<br />

. tipo_interação = top2 (<br />

(;:<br />

. +<br />

x, y: Componentes - x 2 comp 5 y 2 comp 5 . x0 y1 2 comp_comp<br />

4<br />

3 nível x @ nível y1>1 (<br />

6¢*¢*¤*¢*¢*£*¦*¢*£*¢*¢*¢*¢*£*¢*¢*¥*¢*¢*¢*¤*¥*¢*¢*¢*¢*¥*¢*¢*£*¢*¢*¢*¢*£*¦*¢*¤*¢*<br />

FIGURA 3-27 - Esquema Configuração_Camadas.<br />

Nesta Seção, apresentamos um <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar arquiteturas em<br />

camadas. Este <strong>meta</strong>-mo<strong>de</strong>lo é uma instância do <strong>meta</strong>-mo<strong>de</strong>lo apresentado na Seção 3.3.<br />

As restrições, quanto a estrutura e interação, impostas pelo estilo camadas foram<br />

adicionadas a esta instância. O <strong>meta</strong>-mo<strong>de</strong>lo tem a função <strong>de</strong> retratar e assim, facilitar a<br />

64


mo<strong>de</strong>lagem <strong>de</strong> arquiteturas que possam ser estruturadas em camadas. No ANEXO C,<br />

apresentamos a especificação completa em Z.<br />

65


3.5 Um Meta-mo<strong>de</strong>lo para Mo<strong>de</strong>lar Aplicações Baseadas em CORBA<br />

Para elaborar um <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar aplicações baseadas em CORBA,<br />

instanciamos o <strong>meta</strong>-mo<strong>de</strong>lo apresentado na Seção 3.3 (<strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar<br />

estilos) e acrescentamos as características que CORBA impõe às aplicações que o<br />

utilizam, como na FIG. 3-28. As características impostas por CORBA são<br />

características estruturais e <strong>de</strong> interação. A seguir, apresentamos que características são<br />

estas e como elas po<strong>de</strong>m ser incluídas no <strong>meta</strong>-mo<strong>de</strong>lo instanciado.<br />

Meta-mo<strong>de</strong>lo para<br />

mo<strong>de</strong>lar estilos<br />

Meta-mo<strong>de</strong>lo para<br />

mo<strong>de</strong>lar aplicações<br />

baseadas em CORBA<br />

FIGURA 3-28 - Instanciação para criar um <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar aplicações baseadas em<br />

CORBA.<br />

Como apresentamos na Seção 2.3, CORBA é um padrão para implementação,<br />

mas ele afeta algumas <strong>de</strong>cisões arquiteturais. CORBA impõe:<br />

• Os tipos <strong>de</strong> sincronização, que <strong>de</strong>vem ser Síncrono, Assíncrono ou Síncrono<br />

Deferido;<br />

• O tipo <strong>de</strong> comunicação ocorre, basicamente, <strong>através</strong> da chamada <strong>de</strong><br />

procedimento, visto que este padrão é baseado no paradigma <strong>de</strong> orientação a<br />

objetos;<br />

• Uma estrutura não hierárquica, on<strong>de</strong> o ORB intermedia qualquer<br />

comunicação;<br />

• Exige que os componentes servidores da aplicação possuam uma interface<br />

escrita na linguagem IDL e que estes componentes divulguem estas<br />

interfaces.<br />

Assim, <strong>de</strong>pen<strong>de</strong>ndo das características da arquitetura a ser construída, a <strong>de</strong>cisão<br />

<strong>de</strong> utilizar CORBA como plataforma <strong>de</strong> middleware, po<strong>de</strong> fazer com que a<br />

implementação gerada não seja condizente com a arquitetura elaborada, pois os tipos <strong>de</strong><br />

66


comunicação e estruturas po<strong>de</strong>m ser incompatíveis. A seguir, apresentamos a estrutura<br />

estática do Meta-mo<strong>de</strong>lo para mo<strong>de</strong>lar aplicações baseadas em CORBA.<br />

3.5.1 Estrutura Estática<br />

Em um nível arquitetural, po<strong>de</strong>mos representar CORBA como um componente da<br />

arquitetura ou como um conector da arquitetura, visto que ele tem a função específica<br />

<strong>de</strong> realizar a comunicação entre componentes num ambiente distribuído e heterogêneo.<br />

Seja um componente ou um conector, CORBA é um elemento composto cuja<br />

configuração interna contém os elementos <strong>de</strong>finidos na Seção 2.3.3, FIG. 2-8,<br />

Repositórios, ORB e Interfaces. Nesta configuração, o cliente e a implementação <strong>de</strong><br />

objeto representam os componentes que requisitam e oferecem serviços no <strong>meta</strong>mo<strong>de</strong>lo,<br />

respectivamente. Nas seções seguintes, nós apresentamos estas duas<br />

abordagens e mostramos as vantagens e <strong>de</strong>svantagens <strong>de</strong> cada uma <strong>de</strong>las.<br />

3.5.1.1 CORBA como um Conector da Arquitetura<br />

Como CORBA intermedia todas as interações entre os componentes da aplicação, e<br />

possui a função específica <strong>de</strong> realizar a comunicação entre componentes num ambiente<br />

distribuído e heterogêneo, então, na arquitetura, ele po<strong>de</strong> ser representado por um<br />

conector entre estes componentes. As restrições impostas nesta abordagem são:<br />

• Os conectores assumem o tipo <strong>de</strong>finido pelo padrão CORBA, ou seja, teremos<br />

conectores CORBA;<br />

• O conector CORBA possui um papel <strong>de</strong> entrada responsável por ler as<br />

requisições <strong>de</strong> registro nas portas dos componentes que <strong>de</strong>sejam divulgar seus<br />

serviços e iniciar o próprio registro;<br />

• Para disponibilizar suas interfaces cada componente <strong>de</strong>ve possuir uma porta<br />

expedidora que interage com o conector CORBA para divulgar os serviços que<br />

aquele componente está apto a oferecer.<br />

Como exemplo, veja a FIG. 3-29, on<strong>de</strong> nós utilizamos os estereótipos <strong>de</strong>finidos<br />

na Seção 3.3.3. Nesta figura, os servidores A, B e C, <strong>através</strong> <strong>de</strong> alguma <strong>de</strong> suas portas<br />

expedidoras, registram seus serviços no conector CORBA 1, CORBA 2 e CORBA 3,<br />

respectivamente. Um cliente A po<strong>de</strong> requisitar estes serviços <strong>através</strong> <strong>de</strong> uma requisição<br />

67


interceptada pelo conector CORBA 1 e CORBA 2. O conector CORBA 2 publica<br />

serviços no conector CORBA 3, possibilitando, <strong>de</strong>sta maneira, a requisição <strong>de</strong>stes<br />

serviços pelo Cliente B.<br />

Configuração: Conf_CORBA<br />

Cliente A<br />

2<br />

CORBA 1<br />

CORBA 2<br />

2<br />

1<br />

1<br />

Servidor A<br />

Servidor B<br />

1<br />

Cliente B<br />

CORBA 3<br />

2<br />

1<br />

Servidor C<br />

1 - Publicação <strong>de</strong> serviço<br />

2 - Requisição <strong>de</strong> serviço<br />

FIGURA 3-29 - Exemplo <strong>de</strong> arquitetura em que CORBA é um conector.<br />

Na FIG. 3-30, apresentamos a estrutura estática para esta abordagem. Nesta<br />

figura, utilizamos o mesmo esquema <strong>de</strong> cores utilizado na Seção 3.4.1.2.<br />

68


Configuração_CORBA:Configuração<br />

Conjunto <strong>de</strong> Componente_C<br />

Conjunto <strong>de</strong> Conectores_C<br />

Conjunto dos pares Port_rec-PapOUT<br />

Conjunto dos pares Port_exp-PapIN<br />

Conjunto dos pares Port_div-PapIN<br />

Conjunto dos pares Pap-Pap<br />

Conjunto dos pares Com-Com<br />

1 1<br />

*<br />

Componentes_C<br />

Id_com<br />

Conjunto <strong>de</strong> Serv_req<br />

Conjunto <strong>de</strong> Serv_ofer<br />

Conjunto <strong>de</strong> Porta_rec<br />

Conjunto <strong>de</strong> Porta_exp<br />

Conjunto <strong>de</strong> Porta_div<br />

Conf<br />

Serviço()<br />

Requisitar()<br />

Respon<strong>de</strong>r()<br />

1<br />

*<br />

Porta<br />

1<br />

1<br />

* conexão *<br />

* *<br />

obe<strong>de</strong>ce<br />

Serviço()<br />

Enviar()<br />

obe<strong>de</strong>ce<br />

*<br />

Conectores_C<br />

1<br />

1<br />

Id_con<br />

Conjunto <strong>de</strong> PapelIn<br />

Conjunto <strong>de</strong> PapelOUT<br />

Conjunto dos pares Port_rec-PapOUT<br />

Conjunto dos pares Port_exp-PapIN<br />

Conjunto dos pares Port_div-PapIN<br />

Conjunto <strong>de</strong> pares Pap-pap<br />

Conf<br />

1<br />

*<br />

Papel<br />

*<br />

*<br />

liga<br />

{ou}<br />

{ou}<br />

Porta_div<br />

Interfaces IDL<br />

Receber(req)<br />

Registrar(interface)<br />

Porta_rec<br />

Id_rec<br />

Serv-Ofer<br />

Propr<br />

Receber(req)<br />

Respon<strong>de</strong>r()<br />

Porta_exp<br />

Id_exp<br />

Serv_req<br />

Propr<br />

Requisitar()<br />

Receber(resp)<br />

1 1<br />

Protocolo<br />

Papel IN_C<br />

Id_in<br />

Propr<br />

Porta_exp<br />

Porta_div<br />

PapelOUT<br />

Ler(req)<br />

Escrever(resp)<br />

Papel OUT<br />

Id_out<br />

Propr<br />

Porta_rec<br />

PapelIN<br />

Ler(resp)<br />

Escrever(req)<br />

FIGURA 3-30 - Estrutura estática do <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar aplicações baseadas no<br />

middleware CORBA.<br />

A seguir, explicamos cada um dos elementos da FIG. 3-30 e oferecemos as<br />

restrições impostas por eles. A linguagem <strong>de</strong> especificação Z é utilizada para <strong>de</strong>screver<br />

estes elementos.<br />

3.5.1.1.1 Configuração_CORBA<br />

A configuração_CORBA é idêntica a configuração <strong>de</strong>finida na Seção 3.3. O<br />

vocabulário a ser utilizado é o mesmo com exceção do conector que o <strong>de</strong>nominamos <strong>de</strong><br />

69


C<br />

port_pap3: Porta_div D PapelIN<br />

C<br />

C<br />

C<br />

C<br />

C<br />

C<br />

C<br />

Conectores_C e do componente que o <strong>de</strong>nominamos <strong>de</strong> Componentes_C. Os atributos<br />

adicionados à configuração <strong>de</strong>finida na Seção 3.3 são:<br />

• Conjunto <strong>de</strong> relações entre Porta divulgadora e Papel <strong>de</strong> entrada.<br />

Restrições<br />

• Todas as relações entre Porta_divulgadora e PapelIN existentes na configuração<br />

pertencem ao conjunto <strong>de</strong> relações entre Porta_divulgadora e PapelIN <strong>de</strong> algum<br />

conector pertencente à configuração e a porta pertence a qualquer componente<br />

da configuração; e<br />

• Para todos os pares Comp-Comp, o segundo componente <strong>de</strong>ve ter uma porta<br />

divulgadora que registrou o serviço que o componente está oferecendo.<br />

O esquema Z, a seguir, representa este elemento com seus atributos e restrições.<br />

A¢B Configuração_CORBA B¤B¢B¢B¢B¢B£B¢B¢B¢B¥B¤B¢B¢B¢B¥B¢B¢B¢B£BB£B¦B¢B£B¢B¢B¥B¢B<br />

C<br />

Configuração<br />

B¢B¤B¢B¢B£B¦B¢B£B¢B¢B¢B¢B£B¢B E<br />

F x: Porta_div; y: PapelIN | (x, y) G port_pap3<br />

C<br />

H I cp: Componentes; cn: Conectores | cp G comp J cn G con<br />

C<br />

H (x, y) G cn . port_pap3 J x G cp . div_port<br />

C F x, y: Componentes | x G comp J y G comp J (x, y) G comp_comp<br />

p: PapelIN; j: Porta_div<br />

| (l, G n) k . port_pap1<br />

(m, o) G k . port_pap2 J<br />

(j, p) G k . port_pap3<br />

H (l G y . in_port J m G x . out_port J j G y . div_port))<br />

J<br />

H I z, w: SERVICO | z G x . serv_req J w G y . serv_ofer<br />

C<br />

z = w C H<br />

(I k: Conectores; l: Porta_rec; m: Porta_exp; n: PapelOUT; o,<br />

J<br />

B¢B¤B¢B¢B£B¦B¢B£B¢B¢B¢B¢B£B¢B¢B¥B¢B¢B¢B¤B¥B¢B¢B¢B¢B¥B¢B¢B£B¢B¢B¢B¢B£B¦B¢B¤B¢B<br />

K<br />

FIGURA 3-31 - Esquema da Configuração_CORBA.<br />

3.5.1.1.2 Componentes_C<br />

Os componentes possuem portas receptoras e expedidoras idênticas as <strong>de</strong>finidas na<br />

Seção 3.3. Porém, para disponibilizar os serviços que estão aptos a oferecer, estes<br />

componentes possuem uma porta expedidora responsável por este serviço. Nós<br />

<strong>de</strong>nominamos esta porta <strong>de</strong> porta divulgadora. As características <strong>de</strong>ste elemento são:<br />

• Características dos Componentes;<br />

• Conjunto <strong>de</strong> portas divulgadoras (<strong>através</strong> da agregação)<br />

70


C<br />

div_port: L Porta_div<br />

Porta_exp<br />

C<br />

interface: INTERFACE<br />

C<br />

As restrições impostas a este atributo são:<br />

• As restrições dos Componentes; e<br />

• Não há duas instâncias <strong>de</strong> portas divulgadoras com o mesmo i<strong>de</strong>ntificador;<br />

Os esquemas Z, a seguir, representam estes elementos com seus atributos e restrições:<br />

A¢B Componentes_CB¢B¢B¢B£BB£B¢B¦B£B¢B¢B¢B¢B£B¢B¢B¢B¥B¦B£B¢B¤B¢B¢B¢B¥B¢B¢B¢B<br />

C<br />

Componentes<br />

B¢B¤B¢B¢B£B¦B¢B£B¢B¢B¢B¢B£B¢B C<br />

E<br />

c1, c2: Porta_div M c1 G div_port J c2 G div_port<br />

C F<br />

c1 . id_port_exp = c2 . id_port_exp N c1 = c2<br />

H<br />

B¢B¤B¢B¢B£B¦B¢B£B¢B¢B¢B¢B£B¢B¢B¥B¢B¢B¢B¤B¥B¢B¢B¢B¢B¥B¢B¢B£B¢B¢B¢B¢B£B¦B¢B¤B¢B<br />

K<br />

FIGURA 3-32 - Esquema do Componente CORBA.<br />

A porta divulgadora é idêntica a uma porta expedidora. Ela possui um<br />

i<strong>de</strong>ntificador e é responsável por registrar as interfaces IDL no conector CORBA.<br />

Assim, ela possui o atributo interface, como mostramos na FIG. 3-30 e no esquema a<br />

seguir (FIG. 3-33). A operação que ela realiza é mostrada abaixo:<br />

• Registrar(serviço) {IDL = serviço;}<br />

A¢B Porta_divB¢B¢B¢B¢B£B¢B¦B£B¢B¤B¢B¦B£B¢B¢B¢B¥B¤B¢B¢B¢B¥B¢B¢B¢B£B¢B¤B¦B¢B£B¢B¢B<br />

B¢B¤B¢B¢B£B¦B¢B£B¢B¢B¢B¢B£B¢B¢B¥B¢B¢B¢B¤B¥B¢B¢B¢B¢B¥B¢B¢B£B¢B¢B¢B¢B£B¦B¢B¤B¢B<br />

K<br />

FIGURA 3-33 - Esquema da Porta Divulgadora.<br />

As portas receptoras e expedidoras não sofrem nenhuma alteração, elas são<br />

como apresentamos na Seção 3.3.<br />

3.5.1.1.3 Conectores_C<br />

Os conectores e seus papéis são idênticos aos <strong>de</strong>finidos na Seção 3.3 com exceção da<br />

adição do conjunto <strong>de</strong> relações entre as portas divulgadoras e papéisIN, no conector e<br />

no PapelIN. Contudo, este conector encapsula todos os componentes <strong>de</strong>finidos pela<br />

arquitetura CORBA, como mostramos na Seção 2.3.3, FIG. 2-8. A seguir, apresentamos<br />

os esquemas Conectores_C e PapelIN_C.<br />

71


port_pap3: Porta_div D PapelIN<br />

C<br />

F x: Porta_div; y: PapelIN MPO xQ yR G port_pap3 H y G in_pap<br />

C<br />

port_div: L Porta_div<br />

C<br />

F x: Porta_div M x G port_div H x . propr = propr<br />

C<br />

A¢B Conectores_C B¤B¢B¢B¢B¢B¥B¢B¢B£BB¥B¢B¢B£B¢B¦B£B¢B¤B¦B¢B£B¢B¢B¢B¢B¥B¤B¢B<br />

C<br />

Conectores<br />

B¢B¤B¢B¢B£B¦B¢B£B¢B¢B¢B¢B£B¢B¢B¥B¢B¢B¢B¤B¥B¢B¢B¢B¢B¥B¢B¢B£B¢B¢B¢B¢B£B¦B¢B¤B¢B<br />

K<br />

FIGURA 3-34 - Esquema Conectores_C.<br />

E B¢B¤B¢B¢B£B¦B¢B£B¢B¢B¢B¢B£B¢B<br />

A¢B PapelIN_CB¢B¢B¢B¢B£B¢B¢B¢B¢B£B¢B¢B¥B¢B¢B¤B¦B£B¢B¢B¥B¢B¢B¢B¤B¢B¢B¥B¢B<br />

C<br />

PapelIN<br />

B¢B¤B¢B¢B£B¦B¢B£B¢B¢B¢B¢B£B¢B¢B¥B¢B¢B¢B¤B¥B¢B¢B¢B¢B¥B¢B¢B£B¢B¢B¢B¢B£B¦B¢B¤B¢B<br />

K<br />

FIGURA 3-35 - Esquema PapelIN_C.<br />

E B¢B¤B¢B¢B£B¦B¢B£B¢B¢B¢B¢B£B¢B<br />

No Anexo D apresentamos a especificação completa para esta abordagem.<br />

3.5.1.2 CORBA como um Componente da Arquitetura<br />

CORBA po<strong>de</strong> ser representado por um componente na arquitetura. Esta é uma tendência<br />

quando se mo<strong>de</strong>la uma aplicação baseada em CORBA. Neste caso, para um<br />

componente interagir com outro ele interage com um componente CORBA e este com o<br />

componente final da interação. Neste caso, há algumas restrições impostas quanto à<br />

estrutura e à interação:<br />

• Há dois tipos <strong>de</strong> componentes, um componente da aplicação e um componente<br />

CORBA;<br />

• Os conectores realizam a comunicação entre componentes da aplicação e<br />

componentes CORBA ou entre componentes CORBA, neste último caso os<br />

conectores são, geralmente, <strong>de</strong>nominados <strong>de</strong> ponte (Bridge);<br />

• A estrutura é similar a uma estrela em que o componente CORBA se encontra<br />

intermediando todas as interações; e<br />

• Para disponibilizar suas interfaces cada componente <strong>de</strong>ve possuir uma porta<br />

expedidora que interage com CORBA para divulgar os serviços que aquele<br />

componente está apto a oferecer.<br />

Como exemplo veja a FIG. 3-36. Nesta figura, o servidor A, <strong>através</strong> <strong>de</strong> alguma<br />

<strong>de</strong> suas portas expedidoras, registra os serviços que está apto a oferecer no componente<br />

72


CORBA 1. O componente CORBA 1 po<strong>de</strong> também registrar os serviços que foram<br />

registrados nele em um outro componente CORBA. Os clientes A e B po<strong>de</strong>m requisitar<br />

estes serviços <strong>através</strong> <strong>de</strong> uma requisição ao componente CORBA 1 e CORBA 2,<br />

respectivamente, ou seja CORBA representa o componente servidor <strong>de</strong>stes serviços.<br />

Utilizamos as <strong>de</strong>nominações cliente e servidor para <strong>de</strong>notar os componentes da<br />

aplicação, lembrando que eles po<strong>de</strong>m <strong>de</strong>sempenhar ambos os papéis: cliente quando<br />

requisita serviços e servidor quando oferece serviços.<br />

Configuração: Conf_CORBA<br />

2 2<br />

Cliente A CORBA 1 Servidor A<br />

1<br />

1<br />

Cliente B<br />

2<br />

CORBA 2<br />

1 - Publicação <strong>de</strong> serviço<br />

2 - Requisição <strong>de</strong> serviço<br />

FIGURA 3-36 - Exemplo <strong>de</strong> arquitetura em que CORBA é um componente.<br />

Na FIG. 3-37 apresentamos a estrutura estática para esta abordagem. O mesmo<br />

esquema <strong>de</strong> cores <strong>de</strong>finido na seção anterior é utilizado.<br />

73


Configuração_CORBA: Configuração<br />

1<br />

Conjunto <strong>de</strong> Comp da Aplicação<br />

Conjunto <strong>de</strong> Comp CORBA<br />

Conjunto <strong>de</strong> Conectores<br />

Conjunto <strong>de</strong> Pontes<br />

Conjunto dos pares Port_rec-PapOUT<br />

Conjunto dos pares Port_exp-PapIN<br />

Conjunto dos pares Port_div-PapIN<br />

Conjunto dos pares Pap-Pap<br />

Conjunto dos pares Comp-Corb<br />

Conjunto dos pares Corb-Comp<br />

Conjunto dos pares Corb-Corb<br />

1<br />

Comp_CORBA<br />

Conjunto <strong>de</strong> Porta_div<br />

Comp_da aplicação<br />

Conjunto <strong>de</strong> Porta_div<br />

{ou}<br />

*<br />

Componentes<br />

Id_com<br />

Conjunto <strong>de</strong> Serv_req<br />

Conjunto <strong>de</strong> Serv_ofer<br />

Conjunto <strong>de</strong> Porta_rec<br />

Conjunto <strong>de</strong> Porta_exp<br />

Conf<br />

Serviço()<br />

Requisitar()<br />

Respon<strong>de</strong>r()<br />

1<br />

*<br />

Porta<br />

1<br />

1<br />

Serviço()<br />

Enviar()<br />

* conexão *<br />

* *<br />

obe<strong>de</strong>ce<br />

obe<strong>de</strong>ce<br />

1<br />

1 *<br />

Conectores<br />

Id_con<br />

Conjunto <strong>de</strong> PapelIn<br />

Conjunto <strong>de</strong> PapelOUT<br />

Conjunto dos pares Port_rec-PapOUT<br />

Conjunto dos pares Port_exp-PapIN<br />

Conjunto dos pares Port_div-PapIN<br />

Conjunto <strong>de</strong> pares Pap-pap<br />

Conf<br />

1<br />

*<br />

Papel<br />

*<br />

*<br />

liga<br />

Ponte<br />

{ou}<br />

{ou}<br />

Porta_div<br />

Interfaces IDL<br />

Receber(req)<br />

Registrar(interface)<br />

Porta_rec<br />

Id_rec<br />

Serv-Ofer<br />

Propr<br />

Receber(req)<br />

Respon<strong>de</strong>r()<br />

Porta_exp<br />

Id_exp<br />

Serv_req<br />

Propr<br />

Requisitar()<br />

Receber(resp)<br />

1 1<br />

Protocolo<br />

Papel IN<br />

Id_in<br />

Propr<br />

Porta_exp<br />

Porta_div<br />

PapelOUT<br />

Ler(req)<br />

Escrever(resp)<br />

Papel OUT<br />

Id_out<br />

Propr<br />

Porta_rec<br />

PapelIN<br />

Ler(resp)<br />

Escrever(req)<br />

FIGURA 3-37 - Estrutura estática do <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar aplicações baseadas no<br />

middleware CORBA.<br />

A seguir, explicamos cada um dos elementos da FIG. 3-37 e oferecemos as<br />

restrições impostas por eles. A linguagem <strong>de</strong> especificação Z é utilizada para <strong>de</strong>screver<br />

estes elementos.<br />

3.5.1.2.1 Configuração_CORBA<br />

A configuração_CORBA possui dois tipos <strong>de</strong> componentes, os componentes da<br />

aplicação (ou simplesmente componentes) e os componentes CORBA. Embora eles não<br />

estejam apresentando nenhuma diferença quanto aos atributos e operações, eles são<br />

74


componentes bastante distintos semanticamente. A comunicação entre componentes<br />

ocorre sempre entre um componente da aplicação e um componente CORBA, ou entre<br />

componentes CORBA, neste último caso o vocabulário utilizado é Ponte para <strong>de</strong>notar o<br />

conector que realiza esta comunicação. A estrutura imposta por esta configuração é<br />

centralizada nos componentes CORBA. Os atributos adicionados e modificados à<br />

configuração <strong>de</strong>finida na Seção 3.3 são:<br />

• Conjunto <strong>de</strong> componentes CORBA (<strong>através</strong> da agregação);<br />

• Conjunto <strong>de</strong> conectores ponte (<strong>através</strong> da agregação);<br />

• Conjunto <strong>de</strong> pares Corb-Corb;<br />

• Conjunto <strong>de</strong> pares Comp-Corb;<br />

• Conjunto <strong>de</strong> pares Corb-Comp; e<br />

• Conjunto <strong>de</strong> relações entre portas divulgadoras e papéis <strong>de</strong> entrada (<strong>através</strong> da<br />

agregação).<br />

As restrições impostas a estes elementos são:<br />

• Em uma configuração não existem dois Componentes CORBA com o mesmo<br />

i<strong>de</strong>ntificador;<br />

• Em uma configuração não existem dois Conectores Ponte com o mesmo<br />

i<strong>de</strong>ntificador;<br />

• Para todas as relações entre Componentes, Comp-Corb e Corb-Comp:<br />

o Os Componentes pertencem à configuração e um <strong>de</strong>les é um componente<br />

da aplicação e o outro um componente CORBA;<br />

o O primeiro componente da relação requisita um serviço e o segundo<br />

oferece este serviço, ou seja, as semânticas <strong>de</strong>stes serviços são iguais; e<br />

o Existe pelo menos um conector com seus papéis ligados as portas <strong>de</strong>stes<br />

Componentes;<br />

• Para todas as relações entre Componentes, Corb-Corb:<br />

o Os Componentes pertencem ao conjunto <strong>de</strong> componentes CORBA da<br />

Configuração_CORBA;<br />

o O primeiro Componente requisita um serviço e o segundo oferece este<br />

serviço, ou seja, as semânticas <strong>de</strong>stes serviços são iguais;<br />

o Existe pelo menos um conector ponte com seus papéis ligados as portas<br />

<strong>de</strong>stes Componentes; e<br />

75


C<br />

corb_corb: Comp_CORBA D Comp_CORBA<br />

C<br />

C<br />

C<br />

C<br />

C<br />

C<br />

C<br />

• Todas as relações entre portas divulgadoras e papéis <strong>de</strong> entrada existentes na<br />

configuração pertencem ao conjunto <strong>de</strong> relações entre Porta_divulgadora e Papel<br />

<strong>de</strong> entrada <strong>de</strong> algum conector pertencente à configuração e a porta pertence a<br />

algum componente <strong>de</strong> aplicação da configuração.<br />

Como modificamos o vocabulário utilizado para os componentes da aplicação e<br />

modificamos, também, a maneira em que os componentes estão relacionados, então<br />

reescrevemos o esquema Z para este elemento e o apresentamos a seguir.<br />

Configuração_CORBA B¤B¢B¢B¢B¢B£B¢B¢B¢B¥B¤B¢B¢B¢B¥B¢B¢B¢B£BB£B¦B¢B£B¢B¢B¥B¢B<br />

CA¢B L comp: C Comp_da_aplicação<br />

L corb: C Comp_CORBA<br />

L con: C Conectores<br />

port_pap1: D Porta_rec C PapelOUT<br />

port_pap2: D Porta_exp C PapelIN<br />

port_pap3: D Porta_div C PapelIN<br />

pap_pap: D PapelIN C PapelOUT<br />

corb_comp: D Comp_CORBA Comp_da_aplicação<br />

C<br />

comp_corb: Comp_da_aplicação D Comp_CORBA<br />

B¢B¤B¢B¢B£B¦B¢B£B¢B¢B¢B¢B£B¢B C<br />

E<br />

c1, c2: Comp_da_aplicação M c1 G comp J c2 G comp<br />

C F<br />

c1 . id_comp = c2 . id_comp N c1 = c2<br />

C H<br />

c1, c2: Comp_CORBA M c1 G corb J c2 G corb<br />

C H c1 . id_comp = c2 . id_comp N c1 = c2<br />

F<br />

F c1, c2: Conectores M c1 G con J c2 G con<br />

C<br />

C<br />

c1 . id_con = c2 . id_con N c1 = c2<br />

C F x: Comp_da_aplicação M x G comp<br />

H<br />

HI z: Comp_CORBA M z G corb HSO zQ xR G corb_comp T O xQ zR G comp_corb<br />

C<br />

F x: Porta_rec; y: PapelOUT MUO xQ yR G port_pap1<br />

C<br />

C<br />

cp: Comp_da_aplicação; cn: Conectores M cp G comp J cn G con<br />

HI<br />

HO xQ yR G cn . port_pap1 J x G cp . in_port<br />

F x: Porta_exp; y: PapelIN MUO xQ yR G port_pap2<br />

C<br />

C<br />

cp: Comp_da_aplicação; cn: Conectores M cp G comp J cn G con<br />

HI<br />

HO xQ yR G cn . port_pap2 J x G cp . out_port<br />

F x: Porta_div; y: PapelIN MPO xQ yR G port_pap3<br />

C<br />

HI cp: Comp_da_aplicação; cn: Conectores M cp G comp J cn G con<br />

C<br />

HO xQ yR G cn . port_pap3 J x G cp . div_port<br />

F x: PapelIN; y: PapelOUT MPO xQ yR G pap_pap<br />

C<br />

HI z, w: Conectores M z G con J w G con<br />

C<br />

H x G z . in_pap J y G w . out_pap J w . id_con V z . id_con<br />

C F x: Comp_CORBA; y: Comp_da_aplicação<br />

C HI z, w: SERVICO M z G x . serv_req J w G y . serv_ofer<br />

z = w H<br />

o, p: PapelIN; q: Porta_div<br />

J OI k, j: Conectores; l, r: Porta_rec; m: Porta_exp; n, s: PapelOUT;<br />

C M x G corb J y G comp J O xQ yR G corb_comp<br />

76


C<br />

C<br />

C<br />

C<br />

C<br />

C<br />

C<br />

C<br />

C<br />

C<br />

C<br />

C<br />

C<br />

C<br />

C<br />

C<br />

C<br />

C<br />

C<br />

C<br />

C<br />

C<br />

C<br />

lQ nR G k . port_pap1 MPO<br />

O mQ oR G k . port_pap2 J<br />

O qQ pR G j . port_pap3<br />

J O rQ sR G j . port_pap1<br />

J<br />

l G y . in_port HO<br />

m G x . out_port<br />

J q G y . div_port<br />

J<br />

J r G x . in_portRR<br />

C F x: Comp_da_aplicação; y: Comp_CORBA<br />

C HI z, w: SERVICO M z G x . serv_req J w G y . serv_ofer<br />

OI k: Conectores; l: Porta_rec; m: Porta_exp; n: PapelOUT;<br />

J<br />

o: MUO lQ nR G PapelIN k . J O mQ oR G port_pap1 k . port_pap2<br />

H z = w<br />

C M x G comp J y G corb J O xQ yR G comp_corb<br />

HO l G y . in_port J m G x . out_portRR<br />

C HI z, w: SERVICO M z G x . serv_req J w G y . serv_ofer<br />

OI k, j: Conectores; l, r: Porta_rec; m: Porta_exp; n, s: PapelOUT;<br />

J<br />

o, p: PapelIN; q:<br />

MPO lQ nR G<br />

Porta_div<br />

k . port_pap1<br />

H z = w<br />

O mQ oR G k . port_pap2 J<br />

O qQ pR G j . port_pap3<br />

J O rQ sR G j . port_pap1<br />

J<br />

l G y . in_port HO<br />

m G x . out_port<br />

J q G y . div_port<br />

J<br />

C F x, y: Comp_CORBA M x G corb J y G corb J O xQ yR G corb_corb<br />

B¢B¤B¢B¢B£B¦B¢B£B¢B¢B¢B¢B£B¢B¢B¥B¢B¢B¢B¤B¥B¢B¢B¢B¢B¥B¢B¢B£B¢B¢B¢B¢B£B¦B¢B¤B¢B<br />

K<br />

FIGURA 3-38 - Esquema da Configuração_CORBA.<br />

J r G x . in_portRR<br />

3.5.1.2.2 Componente<br />

Os componentes po<strong>de</strong>m assumir um dos dois tipos: CORBA ou da aplicação. Em<br />

ambos os casos, os componentes possuem portas receptoras e expedidoras idênticas as<br />

<strong>de</strong>finidas na Seção 3.5.1.1.2. O esquema <strong>de</strong>stes componentes são iguais, no nível <strong>de</strong><br />

abstração que estamos trabalhando. Entretanto, como dissemos antes, eles possuem<br />

semânticas bastante diferentes.<br />

As portas expedidoras e receptoras não sofrem nenhuma alteração ao que foi<br />

<strong>de</strong>finido na Seção 3.3. A porta divulgadora adicionada, também, nesta abordagem é<br />

igual a <strong>de</strong>finidas na Seção 3.5.1.1.2.<br />

77


3.5.1.2.3 Conectores<br />

Os conectores, as pontes e os seus respectivos papéis são idênticos aos <strong>de</strong>finidos na<br />

Seção 3.3. No ANEXO E apresentamos a especificação completa para esta abordagem.<br />

3.5.1.3 CORBA como Conector X CORBA como Componente<br />

A duas abordagens apresentadas nas Seções 3.5.1.1 e 3.5.1.2 representam diferentes<br />

maneiras <strong>de</strong> mo<strong>de</strong>lar a arquitetura <strong>de</strong> aplicações que utilizam CORBA. Nestas duas<br />

abordagens, CORBA impõe características diferentes à estrutura da configuração e à<br />

maneira <strong>de</strong> interação entre os componentes.<br />

Como vimos na Seção 3.5.1.1, mo<strong>de</strong>lar CORBA como um conector da<br />

arquitetura exige:<br />

• Tal como na abordagem anterior, a <strong>de</strong>finição <strong>de</strong> uma porta, que nós<br />

<strong>de</strong>nominamos <strong>de</strong> porta divulgadora, responsável por requisitar a um conector<br />

CORBA que um serviço seja publicado e, assim, tornado disponível.<br />

• A <strong>de</strong>finição <strong>de</strong> conectores CORBA, que foi realizada simplesmente pela<br />

mudança no vocabulário utilizado. Embora nós tenhamos assumido que o<br />

conector CORBA possui a mesma sintaxe dos conectores <strong>de</strong>finidos na Seção<br />

3.3.3, em níveis mais <strong>de</strong>talhados do <strong>de</strong>sign este conector se apresenta<br />

diferentemente. Internamente ele é <strong>de</strong>finido pelos elementos apresentados na<br />

Seção 2.3.3, FIG. 2-8, e trata <strong>de</strong> toda a complexida<strong>de</strong> inerente a comunicação<br />

entre componentes distribuídos e heterogêneos.<br />

Por sua vez, como vimos na Seção 3.5.1.2, mo<strong>de</strong>lar CORBA como um<br />

componente da arquitetura exige:<br />

• A distinção entre componentes da aplicação e componentes CORBA. Pois os<br />

componentes CORBA são aqueles cuja função é intermediar a comunicação.<br />

Sendo assim, o componente CORBA é o componente servidor das requisições<br />

dos componentes da aplicação, e é o componente cliente quando ele interage<br />

com um componente em busca <strong>de</strong> um serviço que foi antes publicado nele<br />

mesmo.<br />

78


• A <strong>de</strong>finição <strong>de</strong> uma porta, que nós <strong>de</strong>nominamos <strong>de</strong> porta divulgadora,<br />

responsável por requisitar a um componente CORBA que um serviço seja<br />

publicado e, assim, tornado disponível.<br />

• A distinção entre conectores e pontes. As pontes são conectores específicos para<br />

a comunicação entre componentes CORBA. Embora nós tenhamos assumido<br />

que o conector ponte possui a mesma sintaxe dos conectores <strong>de</strong>finidos na Seção<br />

3.3.3, em níveis mais <strong>de</strong>talhados do <strong>de</strong>sign este conector po<strong>de</strong> se apresentar<br />

diferentemente. Porém este não é nosso objeto <strong>de</strong> estudo.<br />

• Que a estrutura seja centralizada, em que um componente CORBA intermedia<br />

todas as interações. Isto exige que a arquitetura da aplicação possa ser<br />

igualmente estruturada.<br />

Na TAB. 3-1, apresentamos um resumo <strong>de</strong>stas características.<br />

TABELA 3-1<br />

CORBA como conector X CORBA como componente.<br />

Conector_CORBA Componente_CORBA<br />

Estrutura - Estrutura centralizada<br />

Componente - Da aplicação e CORBA<br />

Conector CORBA Conector e Ponte<br />

Portas Porta divulgadora Porta divulgadora<br />

Papéis - -<br />

A primeira abordagem, exige menos restrições e são <strong>de</strong> menor impacto ao Metamo<strong>de</strong>lo<br />

para mo<strong>de</strong>lar estilos. Tendo em vista a necessida<strong>de</strong> <strong>de</strong> maior flexibilida<strong>de</strong> nos<br />

<strong>meta</strong>-mo<strong>de</strong>los, para que eles possam acomodar características <strong>de</strong> outros <strong>padrões</strong>, nós<br />

adotamos a primeira abordagem. Há uma tendência recente em tratar os middlewares<br />

como conectores [12][14][15]. Tratá-los como componentes acrescenta um nível <strong>de</strong><br />

indireção na arquitetura, pois é necessário <strong>de</strong>finir um outro conector para ligar o<br />

middleware aos componentes. Na Seção 3.5.2, apresentamos a estrutura dinâmica da<br />

abordagem adotada.<br />

79


3.5.2 Estrutura Dinâmica<br />

Como discutimos na Seção 3.5.1.3, a abordagem apresentada na Seção 3.5.1.1 é a mais<br />

a<strong>de</strong>quada para os propósitos <strong>de</strong>sta dissertação. A seguir, apresentamos a estrutura<br />

dinâmica para esta abordagem.<br />

3.5.2.1 Diagramas <strong>de</strong> Sequências<br />

A seqüência <strong>de</strong> interações ocorre <strong>de</strong> maneira similar ao que apresentamos na<br />

Seção 3.3.2.1. Entretanto, quando se utiliza CORBA os componentes que oferecem<br />

serviços precisam divulgar estes serviços no conector CORBA, para torná-los<br />

disponíveis aos clientes. A seguir, apresentamos como ocorrem as conexões quando os<br />

tipos <strong>de</strong> sincronização são assíncrono, síncrono ou síncrono <strong>de</strong>ferido.<br />

1) Assíncrono<br />

Cliente Porta_exp1 Papel IN<br />

Conector_<br />

CORBA<br />

Papel OUT<br />

Porta_rec<br />

Porta_div<br />

Servidor<br />

Serviço()<br />

Serviço()<br />

Serviço()<br />

Serviço()<br />

Ler(req)<br />

registrar(IDL)<br />

Requisitar()<br />

Serviço()<br />

Ler(req)<br />

Serviço()<br />

Serviço()<br />

Enviar()<br />

Escrever<br />

(req)<br />

Receber<br />

(req)<br />

Serviço()<br />

2) Síncrono<br />

FIGURA 3-39 - Diagrama <strong>de</strong> seqüência para conexão assíncrona.<br />

Cliente Porta_exp1 Papel IN<br />

Conector_<br />

CORBA<br />

Papel OUT<br />

Porta_rec<br />

Porta_div<br />

Servidor<br />

Serviço()<br />

Serviço()<br />

Serviço()<br />

Ler(req)<br />

registrar(IDL)<br />

Serviço()<br />

Requisitar()<br />

Ler(req)<br />

Serviço()<br />

Serviço()<br />

Enviar()<br />

Escrever<br />

(req)<br />

Receber<br />

(req)<br />

Serviço()<br />

Receber<br />

(resp)<br />

Escrever<br />

(resp)<br />

Enviar()<br />

Serviço()<br />

Serviço()<br />

Ler(resp)<br />

Respon<strong>de</strong>r()<br />

FIGURA 3-40 - Diagrama <strong>de</strong> seqüência para conexão síncrona.<br />

80


3) Síncrono Deferido<br />

Cliente Porta_exp1 Papel IN<br />

Conector_<br />

CORBA<br />

Papel OUT<br />

Porta_rec<br />

Porta_div<br />

Servidor<br />

Serviço()<br />

Serviço()<br />

Serviço()<br />

Ler(req)<br />

registrar(IDL)<br />

Serviço()<br />

Requisitar()<br />

Serviço()<br />

Ler(req)<br />

Serviço()<br />

Serviço()<br />

Enviar()<br />

Escrever<br />

(req)<br />

Receber<br />

(req)<br />

Serviço()<br />

Receber<br />

(resp)<br />

Escrever<br />

(resp)<br />

Enviar()<br />

Serviço()<br />

Serviço()<br />

Ler(resp)<br />

Respon<strong>de</strong>r()<br />

FIGURA 3-41 - Diagrama <strong>de</strong> seqüência para conexão síncrona.<br />

Nesta Seção, apresentamos duas abordagens <strong>de</strong> <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar<br />

aplicações que utilizam CORBA, consi<strong>de</strong>rar CORBA como um conector ou como um<br />

componente da arquitetura. CORBA impõe algumas restrições arquiteturais, a maneira<br />

como utilizá-lo na arquitetura também revela algumas restrições. Assim, a integração <strong>de</strong><br />

CORBA ao projeto <strong>de</strong> um sistema <strong>de</strong>ve ser realizada em fases iniciais da arquitetura<br />

pois, realizá-la durante a implementação, por pessoas com visão somente <strong>de</strong><br />

implementação, po<strong>de</strong> afetar completamente a arquitetura antes <strong>de</strong>finida.<br />

A seguir, na Seção 3.6, apresentamos um <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar arquiteturas<br />

em camadas e que utilizam CORBA. Para isto, adotamos a abordagem <strong>de</strong> CORBA<br />

como um conector na arquitetura. A seguir, apresentamos porque tomamos esta <strong>de</strong>cisão.<br />

81


3.6 Um Meta-mo<strong>de</strong>lo para Mo<strong>de</strong>lar uma Família <strong>de</strong> Aplicações<br />

Distribuídas<br />

Para elaborar um <strong>meta</strong>-mo<strong>de</strong>lo para a mo<strong>de</strong>lagem <strong>de</strong> arquiteturas em camadas <strong>de</strong><br />

aplicações baseadas em CORBA, nós instanciamos os <strong>meta</strong>-mo<strong>de</strong>los apresentados nas<br />

Seções 3.4 e 3.5, o <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar arquiteturas em camadas e o <strong>meta</strong>mo<strong>de</strong>lo<br />

para mo<strong>de</strong>lar aplicações baseadas em CORBA, respectivamente. Este <strong>meta</strong>mo<strong>de</strong>lo<br />

resultante <strong>de</strong>ve agregar as características <strong>de</strong> ambos os <strong>meta</strong>-mo<strong>de</strong>los<br />

anteriormente citados, veja na FIG. 3-42. Assim, é necessário analisar como satisfazer<br />

ambos os conjuntos <strong>de</strong> restrições, sem invalidar nenhum <strong>de</strong>les.<br />

Meta-mo<strong>de</strong>lo para<br />

mo<strong>de</strong>lar arquiteturas<br />

em camadas<br />

Meta-mo<strong>de</strong>lo para<br />

mo<strong>de</strong>lar aplicações<br />

baseadas em CORBA<br />

Meta-mo<strong>de</strong>lo para<br />

mo<strong>de</strong>lar aplicações<br />

baseadas no estilo<br />

camadas e em CORBA<br />

FIGURA 3-42 - Instanciação para criar um <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar aplicações baseadas em<br />

CORBA e no estilo camadas.<br />

O estilo camadas é caracterizado por organizar os componentes <strong>de</strong> uma<br />

arquitetura <strong>de</strong> acordo com o nível <strong>de</strong> generalida<strong>de</strong> <strong>de</strong>les, compondo uma estrutura<br />

hierárquica. As interações ocorrem, em geral, entre camadas adjacentes, no sentido Top-<br />

Down, po<strong>de</strong>ndo ocorrer também entre camadas adjacentes nos sentidos Top-Down,<br />

Bottom-Up ou ambos; e entre camadas não-adjacentes nos mesmos sentidos, como<br />

vimos na Seção 3.3.2.<br />

As aplicações distribuídas com middleware CORBA representam uma família <strong>de</strong><br />

produtos que impõe, em resumo, o mo<strong>de</strong>lo cliente-servidor dinâmico e que os<br />

componentes servidores registrem seus serviços no CORBA. Ele requer, também, que<br />

os componentes possam oferecer serviços com um dos três tipos <strong>de</strong> sincronização:<br />

síncrono, síncrono <strong>de</strong>ferido e assíncrono.<br />

Cada um <strong>de</strong>stes conjuntos <strong>de</strong> características foi especificado em <strong>meta</strong>-mo<strong>de</strong>los<br />

distintos, como apresentamos nas Seções 3.4 e 3.5. Eles ajudam no <strong>de</strong>sign <strong>de</strong><br />

arquiteturas com características do estilo camadas ou com características <strong>de</strong> aplicações<br />

82


^<br />

Configuração<br />

^<br />

^<br />

^<br />

j db<br />

x, y: Componentes c x h comp k y h comp k d xf yg h comp_comp<br />

^ ^<br />

j db<br />

x, y: Componentes c x h comp k y h comp k d xf yg h comp_comp<br />

^ ^<br />

^<br />

que utilizam CORBA. Entretanto, não ajudam no <strong>de</strong>sign <strong>de</strong> aplicações com ambas as<br />

características, pois a estruturação imposta pelo estilo camadas não é prevista pelas<br />

aplicações que utilizam CORBA e vice-versa.<br />

A seguir, apresentamos como as características e restrições <strong>de</strong> ambos os mo<strong>de</strong>los<br />

foram agregadas para dar origem a um <strong>meta</strong>-mo<strong>de</strong>lo capaz <strong>de</strong> retratar o <strong>de</strong>sign<br />

<strong>de</strong>talhado <strong>de</strong> arquiteturas <strong>de</strong>sta família <strong>de</strong> aplicações.<br />

3.6.1 Estrutura Estática<br />

3.6.1.1 Configuração<br />

Como apresentamos na Seção 3.4, o estilo camadas impõe restrições estruturais à<br />

configuração. A estrutura estática do <strong>meta</strong>-mo<strong>de</strong>lo, <strong>de</strong>scrito na seção 3.4.1, apresenta<br />

mudanças no elemento configuração, com relação ao <strong>meta</strong>-mo<strong>de</strong>lo <strong>de</strong>scrito na Seção<br />

3.3. Esta mudança diz respeito ao tipo <strong>de</strong> interação que po<strong>de</strong> ocorrer entre os<br />

componentes e a uma proprieda<strong>de</strong> <strong>de</strong>nominada nível, utilizada para fazer o controle da<br />

hierarquia da estrutura. Na FIG. 3-43, apresentamos a classe e o esquema Z da<br />

Configuração_Camadas, <strong>de</strong>finidos na Seção 3.4.<br />

WYX Configuração_Camadas XZX[X\XZX[X[XZX\X[X[XZX\X]XZX\X[XZX[XZXZX[XZX<br />

Configuração_Camadas:<br />

Configuração<br />

Conjunto <strong>de</strong> Componentes<br />

Conjunto <strong>de</strong> Conectores<br />

Conjunto dos pares Port_rec-PapOUT<br />

Conjunto dos pares Port_exp-PapIN<br />

Conjunto dos pares Pap-Pap<br />

Conjunto dos pares Com-Com<br />

Nível<br />

Tipo_interação<br />

nível: Componentes _ ` ^<br />

XZX[X\X]X\X[X\XPX[X\X]X\X[XPX ^Yb a<br />

x: Componentes; ` ced xf yg h y: i nível h x comp<br />

^<br />

tipo_interação: COMUNICAÇÃO<br />

d tipo_interação = bot1 ^ ^<br />

db<br />

x, y: Componentes c x h comp k y h comp k d xf yg h comp_comp<br />

i nível x = nível y - 1gg j<br />

d tipo_interação = topbot1 ^ ^[l<br />

db<br />

x, y: Componentes c x h comp k y h comp k d xf yg h comp_comp<br />

j<br />

d tipo_interação = top1<br />

^ ^[l<br />

db<br />

x, y: Componentes c x h comp k y h comp k d xf yg h comp_comp<br />

j<br />

i nível x = nível y + 1 l nível x = nível y - 1gg<br />

i nível x = nível y + 1gg<br />

^[l d tipo_interação = bot2<br />

i nível x m nível ygng<br />

^[l d tipo_interação = topbot2<br />

i nível x o nível ygg<br />

d tipo_interação = top2<br />

^ ^[l<br />

db<br />

x, y: Componentes c x h comp k y h comp k d xf yg h comp_comp<br />

i nível x p nível ygng j<br />

XZX[X\X]X\X[X\XPX[X\X]X\X[XPX\X[XZX[X\XZX]X\X[XZX[XZXZX[X\XZX[X[XZXZXZX<br />

q<br />

FIGURA 3-43 - Classe e esquema da Configuração_Camadas.<br />

83


^<br />

^<br />

k dt k: Conectores; l: Porta_rec; m: Porta_exp; n: PapelOUT; o,<br />

^ ^<br />

^ ^<br />

^ ^<br />

Na Seção 3.5.1.1, apresentamos um <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar aplicações<br />

baseadas em CORBA que não interfere na estrutura <strong>de</strong> uma configuração. Porém, nesta<br />

abordagem, há a adição <strong>de</strong> um novo atributo que permite a interação entre uma nova<br />

porta, <strong>de</strong>nominada porta divulgadora, e papéis <strong>de</strong> entrada. Essa interação restringe o<br />

modo <strong>de</strong> interação como um todo, pois como explicamos na Seção 3.5.1.1, um<br />

componente só po<strong>de</strong> requisitar um serviço a um outro se este outro componente<br />

divulgar este serviço no conector CORBA que os une. Na FIG. 3-44, apresentamos a<br />

classe e o esquema Z da Configuração_CORBA <strong>de</strong>finida na Seção 3.5.1.1.<br />

Configuração_CORBA<br />

^<br />

Configuração<br />

^<br />

port_pap3: Porta_div r PapelIN<br />

WYX Configuração_CORBAX\X]X\X[XZXZX[X\X]X\X[XPX\X[XZX[X\XPX[X\XZX<br />

Conjunto <strong>de</strong> Componentes_C<br />

Conjunto <strong>de</strong> Conectores_C<br />

Conjunto dos pares Port_rec-PapOUT<br />

Conjunto dos pares Port_exp-PapIN<br />

Conjunto dos pares Port_div-PapIN<br />

Conjunto dos pares Pap-Pap<br />

Conjunto dos pares Com-Com<br />

XZX\X[XZX[X\X[XPX\X[XZX[X\XPX ^Yb a<br />

x: Porta_div; y: csd xf yg h PapelIN<br />

^ ist<br />

port_pap3<br />

cp: Componentes; cn: c Conectores h cp k comp h cn con<br />

xf yg h cn . port_pap3 k x h cp . div_port<br />

^Yb<br />

x, y: Componentes c x h comp k y h comp k d xf yg h comp_comp<br />

iYd<br />

ist z, w: SERVICO c z h x . serv_req k w h y . serv_ofer<br />

^<br />

i z = w<br />

p: PapelIN; j: Porta_div<br />

lf ng h k . port_pap1<br />

k d mf og h k . port_pap2<br />

ced<br />

d jf pg h k . port_pap3 k<br />

i[d l h y . in_port k m h x . out_port k j h y . div_portgg<br />

FIGURA 3-44 - Classe e esquema da Configuração_CORBA.<br />

q XZX\X[XZX[X\X[XPX\X[XZX[X\XPX[X\X]X\X[XZXZX[X\X]X\XZX]X\X[XZX[X\X<br />

As características intrínsecas a estas duas configurações são disjuntas, não<br />

interferem uma na outra. Assim, a reunião <strong>de</strong>stas características é possível e satisfaz a<br />

ambos os <strong>meta</strong>-mo<strong>de</strong>los. A configuração resultante da herança <strong>de</strong>stas características,<br />

<strong>de</strong>nominada <strong>de</strong> Configuração_Camadas_CORBA, é apresentado a seguir, nas FIG. 3-45<br />

e 3-47.<br />

Configuração_Camadas_CORBA:<br />

Configuração<br />

Conjunto <strong>de</strong> Componentes<br />

Conjunto <strong>de</strong> Conectores_CORBA<br />

Conjunto dos pares Port_rec-PapOUT<br />

Conjunto dos pares Port_exp-PapIN<br />

Conjunto dos pares Port_div-PapIN<br />

Conjunto dos pares Pap-Pap<br />

Conjunto dos pares Com-Com<br />

Nível<br />

Tipo_interação<br />

FIGURA 3-45 - Classe Configuração_Camadas_CORBA.<br />

84


w<br />

Configuração<br />

w<br />

port_pap3: Porta_div z PapelIN<br />

ƒ w ~| } ~ x „ y€ w<br />

„ x, y: Componentes x comp y comp comp_comp<br />

w ƒ ~|<br />

x, y: Componentes } x comp „ y comp „ ~ x y€ comp_comp<br />

ƒ w ~| } ~ x „ y€ w<br />

„ x, y: Componentes x comp y comp comp_comp<br />

ƒ w ~| } ~ x „ y€ w<br />

„ x, y: Componentes x comp y comp comp_comp<br />

ƒ w ~| } ~ x „ y€ w<br />

„ x, y: Componentes x comp y comp comp_comp<br />

ƒ w ~| } ~ x „ y€ w<br />

„ x, y: Componentes x comp y comp comp_comp<br />

w<br />

w<br />

u¢v Configuração_Camadas_CORBA v¢v¢v£vv£v¢v¢v¢v¢v¥v¢v¢v¤v¢v£v¢v¦v£v¢v¢v¢v¢v<br />

w<br />

nível: Componentes x y<br />

w<br />

tipo_interação: COMUNICAÇÃO<br />

v¢v¤v¢v¢v£v¦v¢v£v¢v¢v¢v¢v£v¢v {<br />

w¥| y x y€ ‚ w }P~<br />

~<br />

x: Componentes; y: nível x comp<br />

tipo_interação = bot1<br />

‚ nível x = nível y - 1€€<br />

w… ~ tipo_interação = topbot1<br />

‚ nível x = nível y + 1 nível x = nível y - 1€€<br />

w… ~ tipo_interação = topbot2<br />

port_pap3<br />

nível x ‡ nível y€€ w… ‚<br />

tipo_interação = top2 ~<br />

‚ nível x ˆ nível y€>€<br />

w¥| }P~ x y€<br />

‚‰ „ } w<br />

‚~ y€ w „ x<br />

x: Porta_div; y: PapelIN<br />

cp: Componentes; cn: Conectores cp comp cn con<br />

cn . port_pap3 x cp . div_port<br />

x, y: Componentes } x comp „ y comp „ ~ x y€ comp_comp<br />

w<br />

w¥|<br />

z, w: SERVICO } z x . serv_req „ w y . serv_ofer<br />

‚‰<br />

p: PapelIN; j: Porta_div<br />

‚ z = w<br />

w „ ~‰ k: Conectores; l: Porta_rec; m: Porta_exp; n: PapelOUT; o,<br />

w }P~ l n€ k . port_pap1<br />

„ ~ m o€ k . port_pap2<br />

w<br />

„ ~ j p€ k . port_pap3<br />

w<br />

w<br />

l y . in_port „ m x . out_port „ j y . div_port€>€<br />

‚~<br />

v¢v¤v¢v¢v£v¦v¢v£v¢v¢v¢v¢v£v¢v¢v¥v¢v¢v¢v¤v¥v¢v¢v¢v¢v¥v¢v¢v£v¢v¢v¢v¢v£v¦v<br />

Š<br />

FIGURA 3-46 - Esquema da Configuração_Camadas_CORBA.<br />

Por outro lado, adotar a abordagem <strong>de</strong> CORBA como um componente da<br />

arquitetura, tornaria a integração <strong>de</strong>stes dois <strong>padrões</strong> inviável. Utilizar CORBA como<br />

um componente induz uma estrutura não-hierárquica, em que os componentes CORBA<br />

intermediam todas as interações. Assim, o <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar arquiteturas em<br />

camadas teria que adotar, sempre, a interação TopDown-BottomUP entre camadas não<br />

adjacentes. Não po<strong>de</strong>ndo ocorrer a interação mais tradicional que é entre camadas<br />

adjacentes no sentido TopDown.<br />

85


3.6.1.2 Componentes<br />

Como apresentamos na Seção 3.4, o estilo camadas não impõe nenhuma restrição aos<br />

componentes e portas, <strong>de</strong>finidos na Seção 3.3, exceto pelo vocabulário.<br />

Por sua vez, no <strong>meta</strong>-mo<strong>de</strong>lo <strong>de</strong>finido na Seção 3.5.1.1, o componente possui<br />

um tipo <strong>de</strong> porta a mais do que <strong>de</strong>finimos na Seção 3.3, a porta divulgadora. O<br />

componente precisa garantir que cada porta divulgadora possui um i<strong>de</strong>ntificador único.<br />

Esta alteração não tem impacto no <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar arquiteturas em camadas,<br />

po<strong>de</strong>ndo, assim, coexistirem num único componente. Na FIG. 3-47, apresentamos a<br />

classe que representa o componente na Configuração_Camadas_CORBA e o esquema Z<br />

<strong>de</strong>stacando as alterações realizadas.<br />

Componentes<br />

Id_com<br />

Conjunto <strong>de</strong> Serv_req<br />

Conjunto <strong>de</strong> Serv_ofer<br />

Conjunto <strong>de</strong> Porta_rec<br />

Conjunto <strong>de</strong> Porta_exp<br />

Conjunto <strong>de</strong> Porta_div<br />

Conf<br />

Serviço()<br />

Requisitar()<br />

Respon<strong>de</strong>r()<br />

ComponentesŒ[Œ[ŒZŒ\Œ[ŒZŒ[Œ\Œ]Œ\Œ[ŒZŒ[Œ\ŒZŒ[ŒZŒZŒ[Œ[ŒZŒ\Œ]Œ<br />

‹YŒ<br />

Ž div_port: Porta_div<br />

YŒZŒ[Œ\Œ]Œ\Œ[ŒZŒZŒ[ŒZŒ[Œ\ŒZŒ]Œ<br />

c1, c2: Porta_div c1 ’ div_port “ c2 ’ div_port<br />

” c1 . id_port_exp = c2 . id_port_exp • c1 = c2<br />

‘<br />

ŒZŒ[Œ\Œ]Œ\Œ[ŒZŒZŒ[ŒZŒ[Œ\ŒZŒ]Œ\Œ[ŒZŒ[Œ\ŒPŒ[Œ\ŒZŒ[Œ[Œ—Œ[Œ[ŒZŒ\Œ[Œ[Œ—Œ[ŒZŒ<br />

–<br />

FIGURA 3-47 - Classe e esquema do Componente na Configuração_Camadas_CORBA.<br />

3.6.1.3 Conectores<br />

Como apresentamos na Seção 3.4, o estilo camadas não impõe nenhuma restrição aos<br />

conectores e papéis, <strong>de</strong>finidos na Seção 3.3. O <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar aplicações<br />

baseadas em CORBA, não impõe restrições aos conectores e papéis. Porém com a<br />

adição da Porta divulgadora, o conector precisa garantir que os papéis <strong>de</strong> entrada po<strong>de</strong>m<br />

se relacionar com portas divulgadoras. As classes e os esquemas dos conectores e papéis<br />

na Configuração CORBA são idênticos aos da Configuração_Camadas_CORBA. Nas<br />

FIG. 3-48 e 3-50, apresentamos a classe e o esquema do conector e do papel na<br />

Configuração_Camadas_CORBA, respectivamente.<br />

86


Conectores<br />

Id_con<br />

Conjunto <strong>de</strong> PapelIn<br />

Conjunto <strong>de</strong> PapelOUT<br />

Conjunto dos pares Port_rec-PapOUT<br />

Conjunto dos pares Port_exp-PapIN<br />

Conjunto dos pares Port_div-PapIN<br />

Conjunto <strong>de</strong> pares Pap-pap<br />

Conf<br />

Serviço()<br />

Enviar()<br />

Conectoresv¦v£v¢v¢v¢v¥v¢v¤v¢v¢v¥v¢v¢v¢v£v¦v¤v¢v¢v£v<br />

wu¢v w port_pap3: z Porta_div { v¢v¢v¢v¤v¢v¥v¢v¢v£v¢v¦v¤v¢v£v<br />

PapelIN<br />

x: Porta_div; y: PapelIN }˜~ x y€ port_pap3 ‚ y in_pap<br />

w¥|<br />

v¢v¢v¢v¤v¢v¥v¢v v£v¢v¦v¤v¢v£v¢v¦v£v¢v¢v¢v¢v£v¢v¢v¢v¥v¢v¥v¢v<br />

{<br />

FIGURA 3-48 - Classe e esquema do conector na Configuração_Camadas_CORBA.<br />

Papel IN<br />

Id_in<br />

Propr<br />

Porta_exp<br />

Porta_div<br />

PapelOUT<br />

Ler(req)<br />

Escrever(resp)<br />

PapelINv£v¢v¢v¤v¢v¥v¢v¢v¢v¢v¥v¢v¤v¢v¢v¥v¢v¢v<br />

wu¢v w port_div: { v¢v¢v¢v£v¢v¦v£vv£v¢v¦v£v¢v¢v<br />

Porta_div<br />

x: Porta_div } x port_div ‚ x . propr = propr<br />

w¥|<br />

v¢v¢v¢v£v¢v¦v£vv£v¢v¦v£v¢v¢v¢v¥v¤v¢v¢v¢v¥v¢v¢v¢v£v<br />

Š<br />

FIGURA 3-49 - Classe e esquema do Papel_IN na Configuração_Camadas _CORBA.<br />

Com estas alterações, apresentamos , na FIG. 3-50, a estrutura estática do <strong>meta</strong>mo<strong>de</strong>lo<br />

para mo<strong>de</strong>lar esta família <strong>de</strong> aplicações distribuídas.<br />

87


Configuração_Camadas_CORBA:<br />

Configuração<br />

Conjunto <strong>de</strong> Componentes<br />

Conjunto <strong>de</strong> Conectores<br />

Conjunto dos pares Port_rec-PapOUT<br />

Conjunto dos pares Port_exp-PapIN<br />

Conjunto dos pares Port_div-PapIN<br />

Conjunto dos pares Pap-Pap<br />

Conjunto dos pares Com-Com<br />

1<br />

Nível<br />

Tipo_interação<br />

1<br />

*<br />

Componentes<br />

Id_com<br />

Conjunto <strong>de</strong> Serv_req<br />

Conjunto <strong>de</strong> Serv_ofer<br />

Conjunto <strong>de</strong> Porta_rec<br />

Conjunto <strong>de</strong> Porta_exp<br />

Conjunto <strong>de</strong> Porta_div<br />

Conf<br />

Serviço()<br />

Requisitar()<br />

Respon<strong>de</strong>r()<br />

1<br />

*<br />

Porta<br />

1<br />

1<br />

Serviço()<br />

Enviar()<br />

* conexão *<br />

* *<br />

obe<strong>de</strong>ce<br />

obe<strong>de</strong>ce<br />

1<br />

1 *<br />

Conectores<br />

Id_con<br />

Conjunto <strong>de</strong> PapelIn<br />

Conjunto <strong>de</strong> PapelOUT<br />

Conjunto dos pares Port_rec-PapOUT<br />

Conjunto dos pares Port_exp-PapIN<br />

Conjunto dos pares Port_div-PapIN<br />

Conjunto <strong>de</strong> pares Pap-pap<br />

Conf<br />

1<br />

*<br />

Papel<br />

*<br />

*<br />

liga<br />

{ou}<br />

{ou}<br />

Porta_div<br />

Interfaces IDL<br />

Receber(req)<br />

Registrar(interface)<br />

Porta_rec<br />

Id_rec<br />

Serv-Ofer<br />

Propr<br />

Receber(req)<br />

Respon<strong>de</strong>r()<br />

Porta_exp<br />

Id_exp<br />

Serv_req<br />

Propr<br />

Requisitar()<br />

Receber(resp)<br />

1 1<br />

Protocolo<br />

Papel IN<br />

Id_in<br />

Propr<br />

Porta_exp<br />

Porta_div<br />

PapelOUT<br />

Ler(req)<br />

Escrever(resp)<br />

Papel OUT<br />

Id_out<br />

Propr<br />

Porta_rec<br />

PapelIN<br />

Ler(resp)<br />

Escrever(req)<br />

FIGURA 3-50 - Estrutura estática do <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar uma família <strong>de</strong> aplicações<br />

distribuídas.<br />

3.6.2 Estrutura Dinâmica<br />

A estrutura dinâmica <strong>de</strong>ste <strong>meta</strong>-mo<strong>de</strong>lo é idêntica a estrutura dinâmica do <strong>meta</strong>mo<strong>de</strong>lo<br />

para mo<strong>de</strong>lar aplicações baseadas em CORBA, apresentada na Seção 3.5.2,<br />

visto que, a estrutura dinâmica do <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar arquiteturas em camadas é<br />

idêntica a estrutura dinâmica do <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar estilos.<br />

Nesta Seção, apresentamos um <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar uma família <strong>de</strong><br />

aplicações distribuídas. Esta família é caracterizada pela estrutura hierárquica imposta<br />

88


pelo estilo camadas e pela utilização do middleware CORBA. Este <strong>meta</strong>-mo<strong>de</strong>lo po<strong>de</strong><br />

ser instanciado ou refinado para a criação <strong>de</strong> arquiteturas específicas ou para a criação<br />

<strong>de</strong> <strong>meta</strong>-mo<strong>de</strong>los que agregam outras características.<br />

3.7 Conclusões<br />

Neste capítulo, apresentamos um <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar uma família <strong>de</strong> aplicações<br />

distribuídas, objetivo principal <strong>de</strong>ste trabalho <strong>de</strong> dissertação. Para <strong>de</strong>finirmos este <strong>meta</strong>mo<strong>de</strong>lo,<br />

fizemos um estudo cuidadoso <strong>de</strong> quais características ele <strong>de</strong>veria apresentar e<br />

como mo<strong>de</strong>lar estas características <strong>de</strong> maneira clara e representativa.<br />

Apresentamos a metodologia utilizada para alcançar nossos propósitos, os vários<br />

<strong>meta</strong>-mo<strong>de</strong>los <strong>de</strong>finidos para chegarmos a uma <strong>de</strong>finição mais precisa e genérica e<br />

como cada um <strong>de</strong>les foi <strong>de</strong>finido ou instanciado a partir <strong>de</strong> um outro mais genérico.<br />

Todos estes <strong>meta</strong>-mo<strong>de</strong>los representam uma visão arquitetural <strong>de</strong> um sistema ou<br />

família <strong>de</strong>les. Porém, a utilização da UML permite que esta arquitetura seja<br />

gradualmente refinada até chegar a um nível <strong>de</strong>talhado <strong>de</strong> <strong>de</strong>sign, po<strong>de</strong>ndo ser<br />

implementado. O refinamento gradual da arquitetura até a implementação garante maior<br />

consistência entre estes mo<strong>de</strong>los e assim, maior facilida<strong>de</strong> para realizar a manutenção<br />

do sistema, permitindo um maior tempo <strong>de</strong> vida para sistemas passíveis <strong>de</strong> serem<br />

modificados para aten<strong>de</strong>r aos requisitos dos usuários.<br />

No capítulo 4, a seguir, apresentamos um estudo <strong>de</strong> caso. Este estudo <strong>de</strong> caso<br />

<strong>de</strong>monstra como aplicar o <strong>meta</strong>-mo<strong>de</strong>lo a projetos práticos e representa uma instância<br />

do <strong>meta</strong>-mo<strong>de</strong>lo apresentado na Seção 3.6.<br />

89


4. ESTUDO DE CASO<br />

Neste capítulo, <strong>de</strong>finimos um estudo <strong>de</strong> caso para <strong>de</strong>monstrar a aplicação do <strong>meta</strong>mo<strong>de</strong>lo<br />

apresentado na Seção 3.6. Utilizamos a notação <strong>de</strong>finida pela UML e os<br />

estereótipos que apresentamos na Seção 3.3.3.<br />

4.1 Definição do Estudo <strong>de</strong> Caso<br />

Escolhemos um estudo <strong>de</strong> caso cujo domínio é <strong>de</strong> conhecimento público: a aplicação <strong>de</strong><br />

caixa eletrônico. Assim, facilitamos o entendimento do leitor e focamos a utilização do<br />

<strong>meta</strong>-mo<strong>de</strong>lo ao invés <strong>de</strong> nos <strong>de</strong>termos a <strong>de</strong>talhes sobre a aplicação em si.<br />

A aplicação Caixa Eletrônico simula as funcionalida<strong>de</strong>s <strong>de</strong> um caixa eletrônico,<br />

em que o usuário po<strong>de</strong> sacar dinheiro, tirar o extrato e o saldo, realizar pagamentos e<br />

transferências, e requisitar cheques. Na FIG. 4-1, apresentamos a funcionalida<strong>de</strong> do<br />

sistema <strong>através</strong> do diagrama <strong>de</strong> casos <strong>de</strong> uso <strong>de</strong>finido pela UML, e na TAB. 4-1,<br />

fornecemos uma breve <strong>de</strong>scrição <strong>de</strong>stes casos <strong>de</strong> uso.<br />

Sacar<br />

Tirar saldo<br />

Tirar extrato<br />

Cliente<br />

Realizar pagamento<br />

Realizar transferência<br />

Requisitar Cheques<br />

FIGURA 4-1 - Diagrama <strong>de</strong> casos <strong>de</strong> uso para a aplicação Caixa Eletrônico.<br />

90


Nome do caso <strong>de</strong> uso<br />

Sacar<br />

Tirar saldo<br />

Tirar extrato<br />

Realizar transferência<br />

Realizar pagamento<br />

Requisitar cheque<br />

TABELA 4-1<br />

Descrição dos Casos <strong>de</strong> Uso.<br />

Quem inicia o<br />

caso <strong>de</strong> uso<br />

Cliente<br />

Cliente<br />

Cliente<br />

Cliente<br />

Cliente<br />

Cliente<br />

Descrição do caso <strong>de</strong> uso<br />

O cliente <strong>de</strong>ve informar sua senha. O sistema<br />

verifica os dados do cliente, bem como a senha,<br />

faz a contagem do dinheiro se o cliente possuir<br />

saldo suficiente, e <strong>de</strong>bita o valor mais as tarifas<br />

da conta.<br />

O cliente <strong>de</strong>ve informar sua senha. O sistema<br />

verifica os dados do cliente, bem como a senha,<br />

e emite o recibo <strong>de</strong> saldo.<br />

O cliente <strong>de</strong>ve informar sua senha, e as datas<br />

para o extrato. O sistema verifica os dados do<br />

cliente, bem como a senha, emite o recibo <strong>de</strong><br />

extrato, e <strong>de</strong>bita as tarifas da conta.<br />

O cliente <strong>de</strong>ve informar sua senha, a data para a<br />

transferência, e as informações da conta para a<br />

qual o dinheiro <strong>de</strong>ve ser transferido. O sistema<br />

verifica os dados do cliente, bem como a senha,<br />

realiza a transferência, emite o recibo <strong>de</strong><br />

transferência, e <strong>de</strong>bita o valor e as tarifas da<br />

conta.<br />

O cliente <strong>de</strong>ve informar sua senha, a data para o<br />

pagamento, e as informações da conta para a<br />

qual o dinheiro <strong>de</strong>ve ser pago. O sistema verifica<br />

os dados do cliente, bem como a senha, realiza a<br />

pagamento, emite o recibo <strong>de</strong> pagamento e<br />

<strong>de</strong>bita o valor e as tarifas da conta.<br />

O cliente <strong>de</strong>ve informar sua senha e a<br />

quantida<strong>de</strong> <strong>de</strong> cheques que ele <strong>de</strong>seja.O sistema<br />

verifica os dados do cliente, bem como a senha,<br />

emite os cheques se a conta do cliente permitir o<br />

uso <strong>de</strong> cheques e <strong>de</strong>bita as tarifas da conta.<br />

4.2 Utilizando o Meta-mo<strong>de</strong>lo para Mo<strong>de</strong>lar uma Família <strong>de</strong><br />

Aplicações Distribuídas.<br />

A aplicação Caixa Eletrônico é uma aplicação tipicamente distribuída. Os componentes<br />

que compõem esta aplicação po<strong>de</strong>m ser executados em plataformas <strong>de</strong> hardware e<br />

software diferentes e <strong>de</strong>vem interagir entre si para fornecer uma funcionalida<strong>de</strong> ao<br />

cliente.<br />

91


As funcionalida<strong>de</strong>s <strong>de</strong>sta aplicação, mostradas <strong>através</strong> dos casos <strong>de</strong> uso,<br />

apresentam ativida<strong>de</strong>s em comum, como por exemplo, a verificação e análise da senha<br />

do cliente, a emissão <strong>de</strong> recibos, o débito <strong>de</strong> taxas na conta do cliente, <strong>de</strong>ntre outras.<br />

Assim, cada uma <strong>de</strong>las po<strong>de</strong> ser atribuída a componentes diferentes da aplicação,<br />

permitindo que eles sejam organizados <strong>de</strong> acordo com o nível <strong>de</strong> generalida<strong>de</strong> que<br />

possuem, e mais facilmente reutilizados.<br />

Consi<strong>de</strong>rando um alto nível <strong>de</strong> abstração, <strong>de</strong>finimos os seguintes componentes e<br />

suas respectivas funcionalida<strong>de</strong>s para a aplicação Caixa Eletrônico:<br />

• Saldo – O componente Saldo interage com o cliente para obter as informações<br />

necessárias para a emissão <strong>de</strong> saldo, e requisita o saldo ao componente Emissor<br />

<strong>de</strong> recibos.<br />

• Extrato - O componente Extrato interage com o cliente para obter as<br />

informações necessárias para a emissão <strong>de</strong> extrato, e requisita o extrato ao<br />

componente Emissor <strong>de</strong> recibos.<br />

• Transferência - O componente Transferência interage com o cliente para obter as<br />

informações necessárias para realizar uma transferência, e requisita um recibo ao<br />

componente Emissor <strong>de</strong> recibos e a transferência ao componente Registrador <strong>de</strong><br />

mudanças <strong>de</strong> saldo entre contas.<br />

• Pagamento - O componente Pagamento interage com o cliente para obter as<br />

informações necessárias para realizar um Pagamento, e requisita um recibo ao<br />

componente Emissor <strong>de</strong> recibos e o pagamento ao componente Registrador <strong>de</strong><br />

mudanças <strong>de</strong> saldo entre contas.<br />

• Cheque - O componente Cheque interage com o cliente para obter as<br />

informações necessárias para a emissão <strong>de</strong> cheque, e requisita a impressão <strong>de</strong><br />

cheques ao componente Emissor <strong>de</strong> cheque, e aguarda uma resposta.<br />

• Saque - O componente Saque interage com o cliente para obter as informações<br />

necessárias para sacar dinheiro, e requisita o saque ao componente Contador <strong>de</strong><br />

dinheiro, e aguarda uma resposta.<br />

• Emissor <strong>de</strong> recibos – O componente Emissor <strong>de</strong> recibos recebe as informações<br />

necessárias e requisita, ao componente Buscador <strong>de</strong> informações do cliente, a<br />

verificação dos dados do cliente. Este componente, também, requisita, ao<br />

componente Registrador <strong>de</strong> mudanças <strong>de</strong> saldo entre contas, a mudança do saldo<br />

do cliente em virtu<strong>de</strong> das tarifas cobradas pela emissão <strong>de</strong> extrato. Após receber<br />

92


uma resposta, este componente emite o recibo referente ao que lhe foi<br />

requisitado.<br />

• Registrador <strong>de</strong> mudanças <strong>de</strong> saldo entre contas – Requisita, ao buscador <strong>de</strong><br />

informações do cliente, mudanças nos dados do cliente em relação a uma das<br />

operações do caixa eletrônico.<br />

• Emissor <strong>de</strong> cheques - Recebe as informações necessárias, e requisita, ao<br />

componente Buscador <strong>de</strong> Informações do cliente, a permissão para emitir<br />

cheques. Quando ele obtém essa permissão, ele imprime a quantida<strong>de</strong> <strong>de</strong><br />

cheques requisitada.<br />

• Contador <strong>de</strong> dinheiro – Recebe as informações necessárias, e requisita, ao<br />

componente Buscador <strong>de</strong> Informações do cliente, a permissão para realizar o<br />

saque. Quando ele obtém essa permissão, ele conta o dinheiro e emite.<br />

• Buscador <strong>de</strong> informações do cliente – Recebe as informações necessárias e<br />

requisita, ao componente Verificador <strong>de</strong> senha, a <strong>de</strong>criptação e análise da senha<br />

oferecida, com respeito à senha cadastrada. Este componente, também, requisita,<br />

ao componente Alterador <strong>de</strong> informações do cliente, a mudança em alguns dados<br />

do cliente quando necessário. Isto, normalmente, ocorre quando é necessário<br />

modificar o saldo do cliente com respeito as operações <strong>de</strong> saque, pagamento,<br />

transferência, extrato e cheque e as respectivas tarifas cobradas por cada uma<br />

<strong>de</strong>las. Se este componente obtiver uma resposta positiva então ele oferece uma<br />

resposta ao componente que o requisitou.<br />

• Alterador <strong>de</strong> informações do cliente – Recebe as informações a serem alteradas e<br />

oferece uma resposta quando realiza as alterações.<br />

• Verificador <strong>de</strong> senha – Recebe as informações necessárias e analisa a senha<br />

oferecida com relação à senha cadastrada. Ao terminar a análise, este<br />

componente envia uma resposta para o componente que fez a requisição.<br />

Nós utilizamos o middleware CORBA para tratar a distribuição e o estilo camadas para<br />

organizar, hierarquicamente, os componentes. Portanto, po<strong>de</strong>mos utilizar o <strong>meta</strong>mo<strong>de</strong>lo<br />

<strong>de</strong>finido na Seção 3.6 para mo<strong>de</strong>lar esta aplicação. Na FIG. 4-2, apresentamos a<br />

arquitetura <strong>de</strong>sta aplicação, <strong>através</strong> dos estereótipos apresentados na Seção 3.3.3.<br />

93


Caixa Eletrônico: Configuração_Camadas_CORBA<br />

Nível 4<br />

Saldo<br />

Extrato Transferência Pagamento Cheque Saque<br />

Nível 3<br />

Registrador <strong>de</strong><br />

Emissor <strong>de</strong> recibos mudanças <strong>de</strong> saldo Emissor <strong>de</strong> cheques Contador <strong>de</strong> dinheiro<br />

entre contas<br />

Nível 2<br />

Buscador <strong>de</strong> info do cliente<br />

Alterador <strong>de</strong> info do<br />

cliente<br />

Nível 1<br />

Verificador <strong>de</strong> senha<br />

FIGURA 4-2 - Arquitetura da aplicação Caixa Eletrônico.<br />

Na FIG. 4-2, apresentamos a arquitetura da aplicação Caixa Eletrônico. Esta<br />

arquitetura é uma Configuração_Camadas_CORBA constituída <strong>de</strong> quatro níveis,<br />

representados pelas faixas na cor cinza, e 13 camadas ou componentes, representados<br />

pelos retângulos etiquetados. Cada componente está relacionado a um único nível. Os<br />

componentes do quarto nível são componentes que interagem diretamente com o<br />

usuário e fornecem as funcionalida<strong>de</strong>s da aplicação.<br />

Os conectores indicam a interação no sentido Top-Down entre camadas<br />

adjacentes. Desta forma os componentes dos níveis mais altos requisitam serviços aos<br />

componentes dos níveis mais baixos. Para esta aplicação, consi<strong>de</strong>ramos a comunicação<br />

Síncrona, em que cada componente interrompe seu processamento até obter uma<br />

resposta ao serviço requisitado. Por exemplo, o componente Saldo só efetivará sua<br />

funcionalida<strong>de</strong> após obter resposta do componente emissor <strong>de</strong> recibos que por sua vez<br />

só enviará esta resposta quando o componente Buscador <strong>de</strong> Informações do Cliente lhe<br />

enviar uma resposta e assim sucessivamente.<br />

Na configuração retratada na FIG. 4-2, <strong>de</strong>finimos um Conector_CORBA para<br />

cada interação entre dois componentes. Entretanto, um único conector entre os<br />

componentes <strong>de</strong> níveis adjacentes é suficiente para realizar as interações <strong>de</strong>sejadas, pois<br />

um conector CORBA suporta o registro <strong>de</strong> inúmeros serviços <strong>de</strong> e para componentes<br />

diferentes. Na FIG. 4-3, apresentamos esta abordagem.<br />

94


Caixa Eletrônico: Configuração_Camadas_CORBA<br />

Nível 4<br />

Saldo<br />

Extrato Transferência Pagamento Cheque Saque<br />

CORBA<br />

Nível 3<br />

Registrador <strong>de</strong><br />

Emissor <strong>de</strong> recibos mudanças <strong>de</strong> saldo Emissor <strong>de</strong> cheques Contador <strong>de</strong> dinheiro<br />

entre contas<br />

CORBA<br />

Nível 2<br />

Buscador <strong>de</strong> info do cliente<br />

Alterador <strong>de</strong> info do<br />

cliente<br />

CORBA<br />

Nível 1<br />

Verificador <strong>de</strong> senha<br />

FIGURA 4-3 - Arquitetura da aplicação Caixa Eletrônico.<br />

Utilizar um único Conector_CORBA para realizar as interações entre<br />

componentes <strong>de</strong> níveis adjacentes torna a arquitetura mais clara. Entretanto, esta <strong>de</strong>cisão<br />

tem impacto quando se consi<strong>de</strong>ram níveis <strong>de</strong> <strong>de</strong>sign mais <strong>de</strong>talhados. Por ora,<br />

consi<strong>de</strong>ramos esta abordagem, apresentada na FIG. 4-3, mais a<strong>de</strong>quada para este<br />

trabalho <strong>de</strong> dissertação.<br />

Na FIG. 4-4, apresentamos algumas das classes da Aplicação Caixa Eletrônico,<br />

segundo os atributos <strong>de</strong>finidos no Meta-mo<strong>de</strong>lo. Na FIG. 4-5, apresentamos uma parte<br />

da arquitetura da aplicação <strong>através</strong> do diagrama <strong>de</strong> objetos da UML, que teve como base<br />

o diagrama <strong>de</strong> classes <strong>de</strong>finido na Seção 3.6.<br />

95


Saldo: Componentes<br />

Extrato: Componentes<br />

Saque: Componentes<br />

Pagamento: Componentes<br />

Id_com: Saldo<br />

Serv_req: {Info Saldo}<br />

Serv_ofer: {Saldo}<br />

Porta_rec: {}<br />

Porta_exp: {P2}<br />

Porta_div: {}<br />

Conf: {}<br />

Saldo()<br />

Requisitar()<br />

Respon<strong>de</strong>r()<br />

Cheque: Componentes<br />

Id_com: Cheque<br />

Serv_req: {Info Cheq, Cheq}<br />

Serv_ofer: {Cheque}<br />

Porta_rec: {}<br />

Porta_exp: {P2}<br />

Porta_div: {}<br />

Conf: {}<br />

Cheque()<br />

Requisitar()<br />

Respon<strong>de</strong>r()<br />

Id_com: Extrato<br />

Serv_req: {Info Extrato}<br />

Serv_ofer: {Extrato}<br />

Porta_rec: {}<br />

Porta_exp: {P2}<br />

Porta_div: {}<br />

Conf: {}<br />

Extrato()<br />

Requisitar()<br />

Respon<strong>de</strong>r()<br />

Transferência: Componentes<br />

Id_com: Transferência<br />

Serv_req: {Info Transf,<br />

Transf}<br />

Serv_ofer: {Transferência}<br />

Porta_rec: {}<br />

Porta_exp: {P2,P3}<br />

Porta_div: {}<br />

Conf: {}<br />

Transferência()<br />

Requisitar()<br />

Respon<strong>de</strong>r()<br />

Id_com: Saque<br />

Serv_req: {Info Saque}<br />

Serv_ofer: {Saque}<br />

Porta_rec: {}<br />

Porta_exp: {P2}<br />

Porta_div: {}<br />

Conf: {}<br />

Saque()<br />

Requisitar()<br />

Respon<strong>de</strong>r()<br />

Emissor_<strong>de</strong>_Recibos:<br />

Componentes<br />

Id_com: Emissor_<strong>de</strong>_Recibos<br />

Serv_req: {InfoDados,<br />

Reg_Mud}<br />

Serv_ofer: {InfoSaldo,<br />

InfExtrato, InfoTransf, InfoPag}<br />

Porta_rec: {P1,P2,P3,P4,}<br />

Porta_exp: {P6}<br />

Porta_div: {P5}<br />

Conf: {}<br />

InfoSaldo()...<br />

Requisitar()<br />

Respon<strong>de</strong>r()<br />

Id_com: Pagamento<br />

Serv_req: {Info Pag, Pag}<br />

Serv_ofer: {Pagamento}<br />

Porta_rec: {}<br />

Porta_exp: {P2,P3}<br />

Porta_div: {}<br />

Conf: {}<br />

Pagamento()<br />

Requisitar()<br />

Respon<strong>de</strong>r()<br />

Reg_Mud_Saldo_:<br />

Componentes<br />

Id_com: Reg_Mud_Saldo_<br />

Serv_req: {MudSaldo,<br />

InfoDados}<br />

Serv_ofer: {Reg_Mud}<br />

Porta_rec: {P1,P2}<br />

Porta_exp: {P4}<br />

Porta_div: {P3}<br />

Conf: {}<br />

MudSaldo() ...<br />

Requisitar()<br />

Respon<strong>de</strong>r()<br />

Emis_Cheque: Componentes<br />

Cont_Dinheir: Componentes<br />

Busca_Info: Componentes<br />

Altera_Info: Componentes<br />

Id_com: Emis_Cheque<br />

Serv_req: {InfoDados}<br />

Serv_ofer: {ImpCheque}<br />

Porta_rec: {P1}<br />

Porta_exp: {P2}<br />

Porta_div: {P3}<br />

Conf: {}<br />

ImpCheque()<br />

Requisitar()<br />

Respon<strong>de</strong>r()<br />

Id_com: Cont_Dinheiro<br />

Serv_req: {InfoDados}<br />

Serv_ofer: {Cont Dinheiro}<br />

Porta_rec: {P1}<br />

Porta_exp: {P2}<br />

Porta_div: {P3}<br />

Conf: {}<br />

ContDinheiro()<br />

Requisitar()<br />

Respon<strong>de</strong>r()<br />

Id_com: Busc_Info_do_Cliente<br />

Serv_req: {Ver_Senha,<br />

MudDados}<br />

Serv_ofer: {InfoDados}<br />

Porta_rec: {P1,P2,P3,P4}<br />

Porta_exp: {P5}<br />

Porta_div: {P6}<br />

Conf: {}<br />

InfoDados()<br />

Requisitar()<br />

Respon<strong>de</strong>r()<br />

Id_com: Altera_Info_do_Cliente<br />

Serv_req: {}<br />

Serv_ofer: {MudDados}<br />

Porta_rec: {P1}<br />

Porta_exp: {}<br />

Porta_div: {P2}<br />

Conf: {}<br />

MudDados()<br />

Requisitar()<br />

Respon<strong>de</strong>r()<br />

Ver_Senha: Componentes<br />

Id_com: Ver_senha<br />

Serv_req: {}<br />

Serv_ofer: {Ver_Senha}<br />

Porta_rec: {P1}<br />

Porta_exp: {}<br />

Porta_div: {P2}<br />

Conf: {}<br />

Ver_Senha()<br />

Requisitar()<br />

Respon<strong>de</strong>r()<br />

FIGURA 4-4 - Classes da aplicação Caixa Eletrônico.<br />

96


Caixa<br />

Eletrônico:<br />

Configuração<br />

Saldo:<br />

Componentes<br />

Extrato:<br />

Componentes<br />

Transferência:<br />

Componentes<br />

...<br />

P2:<br />

Porta_exp<br />

P2:<br />

Porta_exp<br />

P2:<br />

Porta_exp<br />

P3:<br />

Porta_exp<br />

P1:<br />

PapelIN<br />

Con1:<br />

Conector_<br />

CORBA<br />

P2:<br />

PapelOUT<br />

P3:<br />

PapelIN<br />

P1:<br />

Porta_rec<br />

P2:<br />

Porta_rec<br />

P3:<br />

Porta_rec<br />

P5:<br />

Porta_div<br />

P1:<br />

Porta_rec<br />

P2:<br />

Porta_rec<br />

P3:<br />

Porta_div<br />

Emissor <strong>de</strong><br />

recibos:<br />

Componentes<br />

Registrador <strong>de</strong><br />

mudanças <strong>de</strong> saldo<br />

entre contas:<br />

Componentes<br />

P6:<br />

Porta_exp<br />

P4:<br />

Porta_exp<br />

P1:<br />

PapelIN<br />

Con2:<br />

Conectores<br />

P2:<br />

PapelOUT<br />

P3:<br />

PapelIN<br />

P1:<br />

Porta_rec<br />

P2:<br />

Porta_rec<br />

P3<br />

Porta_rec<br />

P4:<br />

Porta_rec<br />

P6:<br />

Porta_div<br />

Buscador <strong>de</strong><br />

info do cliente:<br />

Componentes<br />

P5:<br />

Porta_exp<br />

...<br />

FIGURA 4-5 - Diagrama <strong>de</strong> objetos para a aplicação Caixa Eletrônico.<br />

97


O diagrama <strong>de</strong> seqüência, a seguir, retrata a seqüência <strong>de</strong> interações entre os<br />

componentes para realizar a funcionalida<strong>de</strong> Tirar Saldo. Este diagrama <strong>de</strong> seqüência é<br />

uma instância do diagrama <strong>de</strong> seqüência da FIG. 3-40, na Seção 3.5.2.1. Entretanto,<br />

para realizar esta funcionalida<strong>de</strong>, há interações entre quatro componentes, Saldo,<br />

Emissor <strong>de</strong> recibos, Buscador <strong>de</strong> informações do cliente e Verificador <strong>de</strong> senha. Como<br />

dissemos anteriormente, a comunicação é Síncrona, assim, o componente saldo aguarda<br />

uma resposta para que se torne apto a realizar outras requisições <strong>de</strong> saldo.<br />

Saldo Porta_exp1 Papel IN<br />

Conector_<br />

CORBA<br />

Papel OUT<br />

Porta_rec<br />

Porta_div<br />

Emissor <strong>de</strong><br />

recibos<br />

Serviço()<br />

Registrar()<br />

Registrar()<br />

Ler(req)<br />

registrar(IDL)<br />

Serviço()<br />

Requisitar()<br />

Receber<br />

(resp)<br />

Ler(req)<br />

Escrever<br />

(resp)<br />

Serviço()<br />

Enviar()<br />

Serviço()<br />

Enviar()<br />

Serviço()<br />

Serviço()<br />

Escrever<br />

(req)<br />

Ler(resp)<br />

Receber<br />

(req)<br />

Respon<strong>de</strong>r()<br />

Serviço()<br />

...<br />

FIGURA 4-6 - Diagrama <strong>de</strong> sequência para a função Saldo do Caixa Eletrônico.<br />

O diagrama <strong>de</strong> objetos, FIG. 4-5, e o diagrama <strong>de</strong> seqüência, FIG. 4-6 respeitam<br />

as características e restrições <strong>de</strong>finidas pelos diagramas da FIG. 3-30 e 3-41,<br />

respectivamente.<br />

Igualmente, os estados assumidos pelos componentes <strong>de</strong>sta aplicação são os<br />

mesmos <strong>de</strong>finidos, genericamente, na Seção 3.3.2.2, FIG. 3-20, on<strong>de</strong> o estado<br />

Executando representa um estado genérico <strong>de</strong> execução <strong>de</strong> qualquer serviço, este estado<br />

po<strong>de</strong> ser renomeado pelas ativida<strong>de</strong>s <strong>de</strong> responsabilida<strong>de</strong> <strong>de</strong> um certo componente.<br />

4.3 Conclusões<br />

Neste capítulo, apresentamos um estudo <strong>de</strong> caso para a aplicação do <strong>meta</strong>-mo<strong>de</strong>lo<br />

<strong>de</strong>finido na Seção 3.6. Como vimos neste estudo <strong>de</strong> caso, é necessário que a aplicação<br />

que se <strong>de</strong>seja mo<strong>de</strong>lar possua as características <strong>de</strong>finidas pelo <strong>meta</strong>-mo<strong>de</strong>lo, ou seja, a<br />

98


aplicação <strong>de</strong>ve ser passível <strong>de</strong> ser estruturada em camadas e <strong>de</strong>ve-se ter a necessida<strong>de</strong><br />

<strong>de</strong> torná-la distribuída.<br />

Aplicar este <strong>meta</strong>-mo<strong>de</strong>lo, tanto quanto os outros <strong>de</strong>finidos nas seções<br />

anteriores, é uma tarefa <strong>de</strong> instanciação. Instanciar um mo<strong>de</strong>lo exige, do projetista,<br />

atenção para que ele não <strong>de</strong>fina elementos e características não previstos pelo mo<strong>de</strong>lo<br />

genérico. A utilização dos estereótipos facilita a mo<strong>de</strong>lagem do diagrama <strong>de</strong> classes e <strong>de</strong><br />

seqüência.<br />

99


5. TRABALHOS CORRELATOS<br />

Nós propomos um <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar uma família <strong>de</strong> aplicações distribuídas.<br />

Este <strong>meta</strong>-mo<strong>de</strong>lo tem a função <strong>de</strong> oferecer, ao projetista, as informações intrínsecas a<br />

esta família que são relevantes e fundamentais para a construção <strong>de</strong> arquiteturas <strong>de</strong><br />

produtos <strong>de</strong>sta família. O <strong>meta</strong>-mo<strong>de</strong>lo provê tais informações em uma linguagem <strong>de</strong><br />

fácil entendimento e aprendizagem, possibilitando a divulgação, o uso e o reuso das<br />

informações <strong>de</strong> um projeto já efetivado.<br />

Muito tem se investido em pesquisas na área <strong>de</strong> Arquitetura <strong>de</strong> Software, e<br />

especificamente em estilos e <strong>padrões</strong> arquiteturais como meio <strong>de</strong> facilitar o processo <strong>de</strong><br />

<strong>de</strong>senvolvimento <strong>de</strong> software e <strong>de</strong> prover maior manutenibilida<strong>de</strong> aos sistemas<br />

construídos. Neste Capítulo, apresentamos alguns trabalhos que são resultados <strong>de</strong>sta<br />

busca por melhores métodos e técnicas para a arquitetura <strong>de</strong> software e resumimos as<br />

<strong>de</strong>ficiências <strong>de</strong>stes esforços em en<strong>de</strong>reçar a questão central <strong>de</strong>sta dissertação.<br />

5.1 Hofmeister, Nord e Soni<br />

Como apresentamos no Capítulo 2, o livro intitulado “ Applied Software Architecture” ,<br />

cujos autores são Hofmeister, Nord e Soni [27], é fruto da experiência <strong>de</strong>stes<br />

pesquisadores na área <strong>de</strong> arquitetura <strong>de</strong> software, e constitui um guia <strong>de</strong>talhado e prático<br />

para as tarefas <strong>de</strong> arquitetura <strong>de</strong> software. Seus autores, tendo como ponto <strong>de</strong> partida os<br />

aspectos necessários para a criação da arquitetura <strong>de</strong> um sistema, criaram quatro <strong>meta</strong>mo<strong>de</strong>los<br />

retratando estas características, ou visões arquiteturais. Cada uma <strong>de</strong>las po<strong>de</strong><br />

ser utilizada separadamente e en<strong>de</strong>reça diferentes interesses da arquitetura.<br />

A visão conceitual influenciou enormemente o trabalho aqui proposto. Esta<br />

visão foi a base para <strong>de</strong>finição dos <strong>meta</strong>_mo<strong>de</strong>los construídos. Entretanto, para<br />

satisfazer os aspectos intrínsecos aos estilos arquiteturais foi necessário realizar algumas<br />

alterações nesta visão, como apresentamos no Capítulo 3. Para retratar a arquitetura <strong>de</strong><br />

uma maneira mais <strong>de</strong>talhada foi necessário, também, acrescentar os atributos e<br />

operações básicas para interação entre componentes e utilizar a linguagem <strong>de</strong><br />

especificação Z para retratar as restrições mais claramente do que permitido pela UML.<br />

Apesar <strong>de</strong> reconhecer os limites impostos, Hofmeister, Nordi e Soni também utilizaram<br />

a UML como notação para <strong>de</strong>finir estas visões.<br />

100


A visão <strong>de</strong> módulo, <strong>de</strong>finida por Hofmeister, Nordi e Soni, possui similarida<strong>de</strong><br />

com o <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar arquiteturas em camadas, no que diz respeito a<br />

preocupação em organizar a arquitetura do sistema em camadas. Entretanto, esta<br />

abordagem é bastante diferente da abordagem <strong>de</strong>finida pelo estilo camadas. O estilo<br />

camadas estabelece que camadas são os componentes <strong>de</strong>sta arquitetura enquanto que na<br />

visão <strong>de</strong> módulo as camadas representam um conjunto <strong>de</strong> módulos que por sua vez<br />

po<strong>de</strong>m correspon<strong>de</strong>r a um único elemento conceitual (componente, porta, conector, ou<br />

papel) ou a um conjunto <strong>de</strong>les. Na visão <strong>de</strong> módulo, diferentemente do estabelecido<br />

pelo estilo camadas, nenhuma restrição quanto à interação entre camadas é feita. Desta<br />

forma, a visão <strong>de</strong> módulo se distingue completamente do que propomos com o <strong>meta</strong>mo<strong>de</strong>lo<br />

para mo<strong>de</strong>lar arquiteturas em camadas.<br />

5.2 Di Nitto e Rosenblum<br />

Dois trabalhos realizados por Di Nitto e Rosenblum [15][16] retratam a preocupação <strong>de</strong><br />

antecipadamente tomar algumas <strong>de</strong>cisões do nível <strong>de</strong> implementação durante o <strong>de</strong>sign<br />

da arquitetura. Eles apontam a escolha do middleware relevante arquiteturalmente, pois<br />

diferentes middlewares impõem restrições arquiteturais diferentes, e estas restrições<br />

<strong>de</strong>vem ser consistentes com a arquitetura da aplicação.<br />

Eles realizaram alguns estudos <strong>de</strong> caso que comprovaram esta preocupação. Um<br />

<strong>de</strong>les foi tentar integrar o estilo pipe-and-filter com os middlewares CORBA e JEDI.<br />

JEDI [13] é um middleware baseado em eventos. O resultado que eles obtiveram foi que<br />

CORBA induz um estilo arquitetural que é compatível com o estilo pipe-and-filter,<br />

enquanto JEDI induz um estilo arquitetural que é incompatível ou difícil <strong>de</strong> conciliar<br />

com o estilo pipe-and-filter.<br />

Estes trabalhos nos motivaram a realizar o presente trabalho <strong>de</strong> dissertação. Nós<br />

temos a mesma preocupação, porém além <strong>de</strong> investigar se o estilo camadas é consistente<br />

com o estilo induzido pelo padrão CORBA, nós elaboramos uma solução para integrarlos<br />

e fornecemos esta solução em forma <strong>de</strong> <strong>meta</strong>-mo<strong>de</strong>lo que po<strong>de</strong> ser facilmente<br />

utilizado para criar produtos que apresentem as restrições que eles impõem.<br />

101


5.3 Egyed, Mehta e Medvidovic<br />

Um trabalho recente <strong>de</strong> Egyed, Medvidovic e Mehta também foi motivador para o<br />

presente trabalho <strong>de</strong> dissertação, “ Software Connectors and Refinement in Family<br />

Architectures” [18]. Neste trabalho os autores <strong>de</strong>finem uma maneira <strong>de</strong> refinar e evoluir<br />

uma arquitetura <strong>de</strong> família até alcançar a arquitetura <strong>de</strong>talhada <strong>de</strong> um produto específico<br />

daquela família. Nós apresentamos esta abordagem no Capítulo 2.<br />

Entretanto, este é um trabalho em <strong>de</strong>senvolvimento. Eles não apresentaram<br />

estudos <strong>de</strong> caso que <strong>de</strong>monstrem a teoria <strong>de</strong>finida. Nesta dissertação, nós <strong>de</strong>finimos os<br />

<strong>meta</strong>-mo<strong>de</strong>los em um nível um pouco mais <strong>de</strong>talhado que a arquitetura <strong>de</strong> software<br />

propriamente dita. O uso da UML e do paradigma <strong>de</strong> orientação a objetos, facilita este<br />

refinamento, permitindo uma transformação mais gradual.<br />

5.4 Buschmann, Meunier, Rohnert, Sommerlad e Stal<br />

No livro intitulado “ A System of Patterns – Pattern-Oriented Software Architecture”<br />

[6], Bushmann et al. catalogaram vários <strong>padrões</strong> arquiteturais e <strong>de</strong> <strong>de</strong>sign comumente<br />

utilizados tais como, Camadas, Pipe-and-Filter, Cliente-Servidor etc. Eles adotaram o<br />

esquema <strong>de</strong> três partes, contexto, problema e solução para <strong>de</strong>screver cada um dos<br />

<strong>padrões</strong>. Além disto, utilizam o mo<strong>de</strong>lo <strong>de</strong> objetos da OMT [50] (Object Mo<strong>de</strong>ling<br />

Technique) e o diagrama <strong>de</strong> seqüência <strong>de</strong> mensagens (Message Sequence Charts) [26]<br />

padronizado no domínio <strong>de</strong> telecomunicações.<br />

Buschmann et al., também, <strong>de</strong>finiram um sistema <strong>de</strong> <strong>padrões</strong>. O sistema <strong>de</strong><br />

<strong>padrões</strong> mostra como combinar <strong>padrões</strong> individuais para construir estruturas<br />

heterogêneas. Um sistema <strong>de</strong> <strong>padrões</strong> para a arquitetura <strong>de</strong> software, segundo a própria<br />

<strong>de</strong>finição dos autores, é uma coleção <strong>de</strong> <strong>padrões</strong> para arquitetura <strong>de</strong> software,<br />

juntamente com um guia para sua implementação, combinação e uso prático no<br />

<strong>de</strong>senvolvimento <strong>de</strong> software.<br />

Embora tenhamos a intenção <strong>de</strong> divulgar os <strong>padrões</strong> que nós utilizamos, este não<br />

é nosso foco, nem tampouco, catalogar <strong>padrões</strong>. A nossa proposta também não é <strong>de</strong>finir<br />

novos <strong>padrões</strong> apesar <strong>de</strong> integrarmos dois <strong>padrões</strong> bastante distintos. A integração que<br />

realizamos entre o estilo camadas e as restrições impostas pelo padrão CORBA é uma<br />

solução que auxilia no <strong>de</strong>sign <strong>de</strong> sistemas que possuam ambas as características mas<br />

102


não é um padrão que po<strong>de</strong> ser classificado para ser utilizado em um domínio específico<br />

e para resolver um <strong>de</strong>terminado problema. Apesar <strong>de</strong> documentar o estilo camadas, e<br />

outros <strong>padrões</strong>, Buschmann et al. não retratou o estilo em termos <strong>de</strong> configuração,<br />

componentes, conectores, portas e papéis como nós realizamos <strong>através</strong> da <strong>de</strong>finição dos<br />

<strong>meta</strong>-mo<strong>de</strong>los.<br />

5.5 Gamma, Helm, Johnson e Vlissi<strong>de</strong>s<br />

O livro intitulado “ Design Patterns – Elements of Reusable Object-Oriented Software”<br />

[21] é uma das principais referências sobre <strong>padrões</strong>. Este livro é um catálogo <strong>de</strong> <strong>padrões</strong><br />

<strong>de</strong> <strong>de</strong>sign. Como dissemos na Seção 5.4, esta abordagem se distingue completamente<br />

dos nossos propósitos.<br />

5.6 Conclusões<br />

No Capítulo 5, apresentamos os principais trabalhos correlatos a esta dissertação. Estes<br />

trabalhos são trabalhos tradicionais, como o <strong>de</strong> Gamma et al., Buschmann et al. e<br />

Hofmeister et al. [27], ou ainda em <strong>de</strong>senvolvimento, como os <strong>de</strong> Egyed et al. e Di Nitto<br />

et al.. Cada um <strong>de</strong>les é correlato a esta dissertação por apresentar algum sub-objetivo em<br />

comum. Porém não encontramos na literatura uma abordagem que se proponha a cobrir<br />

todos os pontos que tratamos com a utilização dos <strong>meta</strong>-mo<strong>de</strong>los elaborados.<br />

A proposta <strong>de</strong> facilitar o <strong>de</strong>sign <strong>de</strong> arquiteturas e o refinamento <strong>de</strong>las, <strong>através</strong> <strong>de</strong><br />

um <strong>meta</strong>-mo<strong>de</strong>lo que po<strong>de</strong> ser instanciado para <strong>de</strong>finição <strong>de</strong> famílias <strong>de</strong> aplicações ou<br />

<strong>de</strong> produtos específicos, é uma abordagem que ajuda projetistas experientes e leigos a<br />

<strong>de</strong>senvolverem sistemas manuteníveis.<br />

103


6. CONCLUSÕES E TRABALHOS FUTUROS<br />

Nesta dissertação, apresentamos uma abordagem para <strong>de</strong>senvolver um sistema a partir<br />

<strong>de</strong> sua arquitetura, diminuindo o gap e as dificulda<strong>de</strong>s encontradas em transformar<br />

mo<strong>de</strong>los do nível abstrato em mo<strong>de</strong>los <strong>de</strong> um nível <strong>de</strong> abstração menor. Levantamos,<br />

também, <strong>de</strong>cisões normalmente consi<strong>de</strong>radas como <strong>de</strong> nível <strong>de</strong> implementação que se<br />

não são tomadas antecipadamente em nível arquitetural, po<strong>de</strong>m afetar negativamente o<br />

ciclo <strong>de</strong> vida do software.<br />

A elaboração dos <strong>meta</strong>-mo<strong>de</strong>los construídos foi fruto <strong>de</strong>stas preocupações. Com<br />

a elaboração <strong>de</strong>ste <strong>meta</strong>-mo<strong>de</strong>lo, nós alcançamos vários resultados <strong>de</strong> gran<strong>de</strong> relevância<br />

para a arquitetura e a engenharia <strong>de</strong> software como um todo. Nossas principais<br />

contribuições são apresentadas na Seção 6.1.<br />

O estudo <strong>de</strong> caso que realizamos com base no <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar uma<br />

família <strong>de</strong> aplicações distribuídas, apresentado no Capítulo 4, teve resultados<br />

satisfatórios para a efetivação <strong>de</strong>sta abordagem. Conseguimos facilmente projetar a<br />

arquitetura <strong>de</strong> uma aplicação bancária, por aplicar as características do <strong>meta</strong>-mo<strong>de</strong>lo,<br />

quanto aos componentes e formas <strong>de</strong> integração, para integrar os componentes e<br />

fornecer a funcionalida<strong>de</strong> <strong>de</strong>sejada.<br />

Desenvolvemos esta abordagem para um domínio específico, relativo às<br />

aplicações em camadas e que utilizam CORBA. Entretanto, a abordagem <strong>de</strong>senvolvida<br />

po<strong>de</strong> ser difundida e realizada para diversos domínios e aplicada, pelo menos, aos<br />

<strong>padrões</strong> arquiteturais mais conhecidos como Pipe-and-filter, Blackboard, Eventos etc.<br />

Tendo como base esta dissertação e especificamente o <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar<br />

estilos, <strong>de</strong>finido na Seção 3.3, torna-se mais fácil <strong>de</strong>senvolver estes novos <strong>meta</strong>mo<strong>de</strong>los.<br />

Disponibilizá-los na forma <strong>de</strong> <strong>meta</strong>-mo<strong>de</strong>los, por sua vez, torna mais fácil<br />

integrar cada um <strong>de</strong>les a outros <strong>padrões</strong>.<br />

Como apresentamos no Capítulo 5, a abordagem focada nesta dissertação está<br />

relacionada a trabalhos bastante diferentes. Entretanto, todos eles são trabalhos que<br />

motivaram e embasaram este. Através <strong>de</strong> soluções específicas para alguns problemas,<br />

como a difusão <strong>de</strong> <strong>padrões</strong> e visões arquiteturais, ou a solução para refinar uma<br />

arquitetura <strong>de</strong> família, e alguns problemas levantados, como os conflitos existentes entre<br />

os diversos middlewares e estilos, nós conseguimos reunir e elaborar uma solução que<br />

abrange todos estes problemas.<br />

104


Esta solução representa o início <strong>de</strong> uma série <strong>de</strong> pesquisas que po<strong>de</strong>m ser<br />

realizadas para melhorar os métodos e técnicas existentes para o <strong>de</strong>senvolvimento <strong>de</strong><br />

sistemas <strong>de</strong> software <strong>de</strong> qualida<strong>de</strong>. Na Seção 6.2 nós apresentamos algumas sugestões<br />

para trabalhos futuros.<br />

6.1 Resultados Obtidos<br />

6.1.1 Definição dos Meta-mo<strong>de</strong>los<br />

Cada um dos <strong>meta</strong>-mo<strong>de</strong>los elaborados e apresentados no Capítulo 3 oferece um<br />

conjunto <strong>de</strong> características intrínsecas a um <strong>de</strong>terminado domínio. Cada um <strong>de</strong>les ajuda<br />

na mo<strong>de</strong>lagem <strong>de</strong>talhada <strong>de</strong> um sistema que possui tais características. Estas<br />

características são retratadas <strong>através</strong> das linguagens UML e Z e <strong>através</strong> da explicação<br />

textual. Oferecemos o mínimo <strong>de</strong> informações consi<strong>de</strong>rado suficiente e necessário para<br />

que um leigo ou especialista esteja apto a mo<strong>de</strong>lar suas aplicações, tendo como base<br />

algum <strong>de</strong>stes <strong>meta</strong>-mo<strong>de</strong>los. Cada um dos <strong>meta</strong>-mo<strong>de</strong>los elaborados são em si uma<br />

contribuição para a comunida<strong>de</strong> <strong>de</strong> engenheiros <strong>de</strong> software.<br />

• Um <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar estilos - Este <strong>meta</strong>-mo<strong>de</strong>lo é um mo<strong>de</strong>lo<br />

genérico para mo<strong>de</strong>lagem <strong>de</strong> estilos ou <strong>de</strong> arquiteturas específicas, sem<br />

restrições impostas por estilos, tal como a visão conceitual <strong>de</strong>finida por<br />

Hofmeister et al. [27]. Entretanto com a <strong>de</strong>finição dos atributos e operações, e do<br />

diagrama <strong>de</strong> seqüências elaborado para este <strong>meta</strong>-mo<strong>de</strong>lo, nós fazemos algumas<br />

restrições quanto ao protocolo utilizado, a maneira em que portas e papéis estão<br />

conectados e como componentes se comunicam entre si.<br />

• Um <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar arquiteturas em camadas - Este <strong>meta</strong>mo<strong>de</strong>lo<br />

retrata as características e restrições impostas pelo estilo camadas.<br />

Apesar do estilo camadas ser bastante conhecido, na literatura, os trabalhos que<br />

o <strong>de</strong>screvem são, em geral, bastante sucintos e foi difícil reunir informações<br />

suficientes para elaborar o <strong>meta</strong>-mo<strong>de</strong>lo.<br />

105


• Um <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar aplicações que utilizam CORBA - Este<br />

<strong>meta</strong>-mo<strong>de</strong>lo retrata as características e restrições impostas por CORBA. Na<br />

Seção 3.5, apresentamos duas abordagens para retratar CORBA em uma<br />

arquitetura, CORBA como um componente e CORBA como um conector na<br />

arquitetura. Apresentamos as vantagens e <strong>de</strong>svantagens <strong>de</strong> cada uma <strong>de</strong>stas<br />

abordagens. A escolha entre elas <strong>de</strong>ve ser cuidadosa, e <strong>de</strong>ve ter em vista as<br />

características do sistema, pois esta escolha po<strong>de</strong> afetar drasticamente a<br />

arquitetura <strong>de</strong> um sistema.<br />

• Um <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar arquiteturas em camadas e distribuídas -<br />

Este <strong>meta</strong>-mo<strong>de</strong>lo integra os conjuntos <strong>de</strong> restrições impostos pelo estilo<br />

camadas e pelo padrão CORBA, oferecendo informações para mo<strong>de</strong>lagem <strong>de</strong><br />

uma família <strong>de</strong> aplicações. Para tanto, adotamos a solução <strong>de</strong> consi<strong>de</strong>rar<br />

CORBA como conector da arquitetura. Desta maneira, ambas as características<br />

po<strong>de</strong>m coexistir em um mesmo mo<strong>de</strong>lo.<br />

Os <strong>meta</strong>-mo<strong>de</strong>los oferecem informações para mo<strong>de</strong>lar sub-estilos e arquiteturas<br />

em termos <strong>de</strong> seus elementos arquiteturais, componentes, conectores, portas e papéis e<br />

mo<strong>de</strong>lar, também, estes elementos em termos <strong>de</strong> atributos e operações. Assim, uma<br />

arquitetura po<strong>de</strong> ser refinada <strong>de</strong> uma maneira mais gradual. A nossa proposta é utilizar<br />

os <strong>meta</strong>-mo<strong>de</strong>los e os estereótipos <strong>de</strong>finidos, <strong>de</strong> maneira a cobrir as fases <strong>de</strong> <strong>de</strong>sign da<br />

arquitetura (<strong>de</strong> alto nível <strong>de</strong> abstração) e o início da fase <strong>de</strong> <strong>de</strong>sign <strong>de</strong>talhado.<br />

Utilizar os estereótipos para mo<strong>de</strong>lar a arquitetura <strong>de</strong> alto nível, e o diagrama <strong>de</strong><br />

classes e seqüência para mo<strong>de</strong>lar a arquitetura em um nível mais <strong>de</strong>talhado é uma<br />

solução para documentar o projeto <strong>de</strong> um sistema <strong>de</strong> software. Por enquanto, é<br />

necessário que o projetista seja cuidadoso enquanto realiza a mo<strong>de</strong>lagem, pois ele<br />

precisa garantir que os mo<strong>de</strong>los <strong>de</strong> classe e <strong>de</strong> estereótipos são consistentes entre si e<br />

consistentes com o <strong>meta</strong>-mo<strong>de</strong>lo que <strong>de</strong>u origem a eles. Entretanto, esta solução po<strong>de</strong><br />

ser automatizada. Esta dissertação po<strong>de</strong> ser consi<strong>de</strong>rada um ponto inicial para criação <strong>de</strong><br />

uma ferramenta que automatize a <strong>de</strong>finição <strong>de</strong> sub-estilos ou <strong>de</strong> arquiteturas <strong>de</strong> sistemas<br />

práticos.<br />

106


6.1.2 Mo<strong>de</strong>lagem dos Meta-mo<strong>de</strong>los em UML<br />

A escolha da UML para mo<strong>de</strong>lar os <strong>meta</strong>-mo<strong>de</strong>los não foi aleatória. A UML possui<br />

várias características que contribuíram para alcançarmos estes resultados. Utilizá-la<br />

significa proporcionar maior facilida<strong>de</strong> para as pessoas enten<strong>de</strong>rem e utilizarem os<br />

<strong>meta</strong>-mo<strong>de</strong>los, pois a UML é fácil <strong>de</strong> enten<strong>de</strong>r e utilizar, é muito difundida,<br />

pesquisadores <strong>de</strong> diversas áreas têm interesse em integrá-la a métodos e técnicas mais<br />

consistentes e há muito interesse comercial em <strong>de</strong>senvolver ferramentas que auxiliem<br />

em sua utilização em todas as fases do <strong>de</strong>senvolvimento <strong>de</strong> software.<br />

Com a <strong>de</strong>finição dos <strong>meta</strong>-mo<strong>de</strong>los oferecemos suporte para que a UML<br />

<strong>de</strong>screva estilos. Como apresentamos na Seção 2.2, a UML não <strong>de</strong>screve estilos, ou seja<br />

a UML não possui estilos pré-<strong>de</strong>finidos, e nem mesmo o conceito <strong>de</strong> estilos. Através do<br />

<strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar estilos oferecemos os elementos necessários para <strong>de</strong>screver<br />

estilos.<br />

6.1.3 Especificação dos Meta-mo<strong>de</strong>los em Z<br />

A especificação dos <strong>meta</strong>-mo<strong>de</strong>los na linguagem <strong>de</strong> especificação Z, por sua vez,<br />

objetiva retratar as restrições que não foram ou foram pobremente retratadas pela UML.<br />

As especificações documentam o <strong>meta</strong>-mo<strong>de</strong>lo formalmente. Isto proporciona, ao<br />

projetista, maior facilida<strong>de</strong> para gerar especificações <strong>de</strong> produtos baseados nestes <strong>meta</strong>mo<strong>de</strong>los,<br />

ou seja, o projetista po<strong>de</strong> reutilizar a especificação ou os tipos <strong>de</strong>finidos pelos<br />

esquemas para criar a especificação <strong>de</strong> produtos específicos ou sub-estilos.<br />

6.2 Trabalhos Futuros<br />

Vários trabalhos po<strong>de</strong>m ser <strong>de</strong>senvolvidos a partir <strong>de</strong>sta dissertação. Nós dividimos<br />

estes trabalhos em duas categorias: aqueles relacionados aos próprios <strong>meta</strong>-mo<strong>de</strong>los e a<br />

abordagem em geral; e aqueles relacionados a ferramentas que facilitem a mo<strong>de</strong>lagem e<br />

garantam a consistência entre os vários mo<strong>de</strong>los criados durante o <strong>de</strong>senvolvimento <strong>de</strong><br />

software.<br />

107


6.2.1 Extensões para os Próprios Meta-mo<strong>de</strong>los e a Abordagem em Geral<br />

• Especificar outros estilos e sub-estilos – Por documentar e disponibilizar estilos<br />

em uma linguagem representativa, os <strong>meta</strong>-mo<strong>de</strong>los po<strong>de</strong>m ser mais facilmente<br />

utilizados. Assim, os estilos po<strong>de</strong>m ser melhor divulgados e utilizados tanto por<br />

pessoas leigas quanto por especialistas. Disponibilizar outros estilos como os<br />

disponibilizados aqui, facilita o uso <strong>de</strong>les e a composição ou integração <strong>de</strong>les<br />

com outros.<br />

• Realizar mais estudos <strong>de</strong> caso – Uma maneira efetiva <strong>de</strong> melhorar os <strong>meta</strong>mo<strong>de</strong>los<br />

é aplicá-los a sistemas <strong>de</strong> software maiores, e avaliar quão bem eles<br />

estão aptos a satisfazer as necessida<strong>de</strong>s <strong>de</strong> sistemas práticos.<br />

• Esten<strong>de</strong>r a especificação em Z – A especificação em Z po<strong>de</strong> ser estendida para<br />

englobar os estados e a semântica dos elementos arquiteturais. Além disto, é<br />

interessante gerar casos <strong>de</strong> teste, provas e simulações para a especificação, pois<br />

nós realizamos apenas as verificações <strong>de</strong> tipos.<br />

• Utilizar os <strong>meta</strong>-mo<strong>de</strong>los durante a engenharia <strong>de</strong> software – Nesta dissertação,<br />

propomos os <strong>meta</strong>-mo<strong>de</strong>los como um artefato que torna a evolução <strong>de</strong><br />

arquiteturas um trabalho menos árduo. Entretanto, <strong>de</strong>senvolver uma metodologia<br />

para o <strong>de</strong>senvolvimento baseado nestes <strong>meta</strong>-mo<strong>de</strong>los é crucial para o bom uso<br />

<strong>de</strong>les. É necessário <strong>de</strong>finir <strong>de</strong> maneira exata como refinar os <strong>meta</strong>-mo<strong>de</strong>los para<br />

que eles atinjam um nível <strong>de</strong> abstração que possa, realmente ser implementado.<br />

• Utilizar os <strong>meta</strong>-mo<strong>de</strong>los durante a engenharia reversa – De maneira similar,<br />

uma abordagem po<strong>de</strong> ser criada para transformar mo<strong>de</strong>los implementados em<br />

arquiteturas <strong>de</strong> software <strong>de</strong> alta abstração.<br />

6.2.3 Extensões Quanto a Ferramentas<br />

• Ferramentas que integrem os artefatos dos <strong>meta</strong>-mo<strong>de</strong>los – É <strong>de</strong> gran<strong>de</strong><br />

relevância <strong>de</strong>senvolver ferramentas que integrem os estereótipos <strong>de</strong>finidos aos<br />

diagramas <strong>de</strong> classes e estes aos diagramas dinâmicos e todos a especificação<br />

formal em Z. É necessário garantir a consistência entre estes mo<strong>de</strong>los.<br />

• Ferramentas que dêem suporte a <strong>de</strong>scrição <strong>de</strong> estilos baseados nestes <strong>meta</strong>mo<strong>de</strong>los<br />

– Uma ferramenta que permita a <strong>de</strong>finição <strong>de</strong> outros estilos tendo como<br />

108


ase o <strong>meta</strong>-mo<strong>de</strong>lo para mo<strong>de</strong>lar estilos, permitir a integração <strong>de</strong> dois ou mais<br />

estilos pré-<strong>de</strong>finidos e, também, a <strong>de</strong>finição <strong>de</strong> novos elementos adicionais. Com<br />

isto, é possível criar uma biblioteca <strong>de</strong> estilos pré-<strong>de</strong>finidos, que po<strong>de</strong>m ser<br />

utilizados, ou melhor, reutilizados para a construção <strong>de</strong> arquiteturas baseadas<br />

neles.<br />

• Ferramentas que dêem suporte à <strong>de</strong>scrição <strong>de</strong> arquiteturas específicas baseadas<br />

nestes <strong>meta</strong>-mo<strong>de</strong>los – Uma ferramenta que dê suporte a <strong>de</strong>finição <strong>de</strong> sistemas<br />

baseados em uma biblioteca <strong>de</strong> estilos pré-<strong>de</strong>finidos e que possibilite o<br />

refinamento <strong>de</strong>les, da arquitetura até um nível passível <strong>de</strong> implementação.<br />

Garantir a consistência entre os diversos artefatos e entre os mo<strong>de</strong>los gerados em<br />

níveis <strong>de</strong> abstração diferentes tornaria o processo <strong>de</strong> <strong>de</strong>senvolvimento mais<br />

efetivo.<br />

109


REFERÊNCIAS BIBLIOGRÁFICAS<br />

[1] ALLEN, R., GARLAN, D.. A formal basis for architectural connection. ACM<br />

Transactions on Software Engineering and Methodology, vol. 6, no. 3, p. 213-<br />

249, July 1997.<br />

[2] BACHMANN, Felix, BASS, Len, CHASTEK, Gary, DONOHOE, Pat e<br />

PERUZZI, Fabio. The architecture based <strong>de</strong>sign method. Techinical Report,<br />

Carnegie Mellon University, Pittsburgh, PA, 2000.<br />

[3] BATISTA, Thaís Vasconcelos. Programação concorrente e distribuída – O<br />

padrão CORBA. Notas <strong>de</strong> aula. UFRN.<br />

[4] BOOCH, Grady, RUMBAUGH, James e JACOBSON, Ivar. The Unified<br />

Mo<strong>de</strong>ling Language User Gui<strong>de</strong>. Addison Wesley, 1999.<br />

[5] BOSCH, Jan. Design & Use of Software Architectures. Addison Wesley, 2000.<br />

[6] BREDEMEYER, Dana e MALAN, Ruth. The role of the architect in software<br />

<strong>de</strong>velopment. Technical report, http://www.bre<strong>de</strong>meyer.com/role.pdf, 1999.<br />

[7] BUSCHMANN, Frank, MEUNIER, Regine, ROHNERT, Hans, SOMMERLAD,<br />

Peter, STAL, Michael. A system of patterns – Pattern-Oriented Software<br />

Architecture. Wiley, 1996.<br />

[8] CARDOSO, Gustavo D., CARDOSO, Mércia e FRANCIOLI. Capítulo 9 – O<br />

padrão Corba: uma arquitetura baseada em objetos distribuídos.<br />

www.nautilus.com.br/~francioli/<br />

[9] CHENG. Shang-Wen e GARLAN. David. Mapping architectural concepts to<br />

UML-RT. International Conference on Parallel and Distributed Processing<br />

Techniques and Applications, Monte Carlo Resort, Las Vegas, Nevada, USA,<br />

June, 2001.<br />

[10] CLEMENTS, Paul. A survey of architecture <strong>de</strong>scription languages. Eighth<br />

International Workshop on Software Specification and Design, Germany, march<br />

1996.<br />

[11] COPLIEN, James. Foundation of pattern concepts and pattern writing. Tutorial,<br />

XV Simpósio Brasileiro em Engenharia <strong>de</strong> Software, RJ, Brasil, 2001.<br />

110


[12] CUESTA, Carlos E., FUENTE Pablo De La, SOLÓRZANO Manuel Barrio. An<br />

architectural perspective of the static invocation in CORBA. WICSA1 First<br />

Working IFIP Conference on Software Architecture, San Antonio, TX - USA,<br />

February 22-24, 1999. http://www.ece.utexas.edu/~perry/prof/wicsa1/final/quintero.pdf.<br />

[13] CUGOLA, G., DI NITTO, E. e FUGGETTA, A.. Exploiting na event-based<br />

infrastructure to <strong>de</strong>velop complex distributed systems. Proc. 20 th International<br />

Conference on Software Engineering, Kyoto, Japan, pp. 261-270, April 1998.<br />

[14] DASHOFY, Eric, MEDIVIDOVIC, Nenad e TAYLOR, Richard N.. Using offthe-shelf<br />

middleware to implement connectors in distributed software<br />

architectures, ICSE, Los Angeles CA, 1999.<br />

[15] DI NITTO, Elisabetta e ROSENBLUM, David. Exploiting ADLs to Specify<br />

Architectural Syles Induced by Middleware Infrastructures. 21 st International<br />

Conference on Software Engineering (ICSE’ 99), Los Angeles, CA, pp. 13-22,<br />

1999.<br />

[16] DI NITTO, Elisabetta e ROSENBLUM, David. On the role of style in selecting<br />

middleware and un<strong>de</strong>rwear. Proceedings os the ICSE’ 99 Workshop on<br />

Engineering Distributed Objects (EDO’ 99), Los Angeles, CA, May 17-18, 1999.<br />

[17] EGYED, Alexan<strong>de</strong>r. Integrating Architectural Views in UML. Technical report,<br />

USC/CSE-99-TR-514, march 1999.<br />

[18] EGYED, Alexan<strong>de</strong>r, MEHTA, Nikunj e MEDVIDOVIC, Nenad. Software<br />

Connectors and Refinement in Family Architectures. 3º International Workshop –<br />

Software Architectures for Product Families, Las Palmas <strong>de</strong> Gran Canria, Spain,<br />

March 15-17, 2000.<br />

[19] FARIAS, Cléver R.G., SINDEREN, Marten V. and PIRES, Luís Ferreira. A<br />

Systematic Approach for Component-Based Software Development. In proceeding<br />

of the seventh European Concurrent Engineering Conference, Leicester-United<br />

Kingdom, pp.127-131, april/2000.<br />

[20] FURLAN, José Davi. Mo<strong>de</strong>lagem <strong>de</strong> Objetos <strong>através</strong> da UML – The Unified<br />

Mo<strong>de</strong>ling Language, São Paulo, Makron Books, 1998.<br />

[21] GAMMA, Erich, HELM, Richard, JOHNSON, Ralph e VLISSIDES, John.<br />

Design Patterns – Elements of Reusable Object-Oriented Software. Addison<br />

Wesley, 1995.<br />

111


[22] GARLAN, David, ALLEN, R., OCKERBLOOM, J.. Exploiting style in<br />

architectural <strong>de</strong>sign environments. In Proceedings of SIGSOFT’ 94. Foundations<br />

of Software Engineering, pp. 175-188, New Orleans, Louisiana, USA, December<br />

1994.<br />

[23] GARLAN, David. Style-based refinament for software architecture. Proceedings<br />

of SIGSOFT '93: Symposium on the Foundations of Software Engineering,<br />

December, 1993.<br />

[24] GARLAN, David. Higher-or<strong>de</strong>r connectors. Workshop on Compositional<br />

Sotware Architrectures, Monterey, CA, 1998.<br />

[25] GARLAN, David, CHENG, Shang-Wen, KOMPANEK, Andrew. Reconciling<br />

the needs of architectural <strong>de</strong>scription with object-mo<strong>de</strong>ling notations. To Appear.<br />

Science of Computer Programming Journal, Special UML Edition, Elsevier<br />

Science, 2001.<br />

[26] GRABOWSKI, J., GRAUBMANN, P., RUDOLPH, E. The Standardization of<br />

Message Sequence Charts. In Software Engineering Standards Symposium,<br />

Brighton, UK, 1993.<br />

[27] HOFMEISTER, Christine, NORD, Robert, SONI, Dilip. Applied Software<br />

Architecture. Addison Wesley, 2000.<br />

[28] IONA Technologies PLC. Orbix 3.1 – The Iternet ORB. 1999.<br />

www.iona.com/info/products/docs/oweb-whitepaper2.pdf<br />

[29] JACOBSON, Ivar, GRISS, Martin and JONSSON, Patrick. Software Reuse.<br />

Addison Wesley, 1997.<br />

[30] KLEIN, Mark e KAZMAN, Rick. Attribute-based Architectural Styles.<br />

CMU/SEI-99-TR-022, 1999.<br />

[31] LUCKHAM, D.C., VERA, J.. An event-based architecture <strong>de</strong>finition language.<br />

IEEE Transactions on Software Engineering, vol.21, no. 9, pp. 717-734,<br />

September 1995.<br />

[32] MACÊDO, Rodrigo C.. Internet Tra<strong>de</strong>r – Um Serviço para Localização <strong>de</strong><br />

Objetos Distribuídos na Internet. Dissertação <strong>de</strong> Mestrado, UFPE, 2000.<br />

[33] MAGEE, J., KRAMER. Dynamic structure in software architectures. In<br />

Poceedings of ACM SIGSOFT’ 96. Fourth Symposium on the Foundations of<br />

Software Engineering (FSE4), pp.3-14, San Francisco, CA, Octuber 1996.<br />

112


[34] MARANHÃO, Dina. Integração da Linguagem <strong>de</strong> <strong>de</strong>scrição <strong>de</strong> arquitetura<br />

software ZCL com UML. Relatório <strong>de</strong> Graduação, UFRN, junho, 2000.<br />

[35] MEDVIDOVIC, Nenad. Architecture-based specification-time software<br />

evolution. Dissertation, University of California, Irvine, CA, 1999.<br />

[36] MEDVIDOVIC, N., ROSENBLUM, D. S., TAYLOR, R. N. A Language and<br />

Enviroment for Architecture-Based Software Development and Evolution. In<br />

Proceedings of the 1999 International Conference on Software Engineering, pp.<br />

44-53, 1999.<br />

[37] MEDVIDOVIC, Nenad and TAYLOR, Richard N.. A Classification and<br />

Comparison Framework for Software Architecture Description Languages. IEEE<br />

Transactions on Software Engineering (TSE), Volume 26, Number 1, pp. 70-93,<br />

January 2000.<br />

[38] MEHTA, Nikunj R., MEDVIDOVIC, Nenad e PHADKE, San<strong>de</strong>ep. Towards a<br />

taxonomy of software connectors. ICSE 2000, Proceedings of the 22nd<br />

International Conference on on Software Engineering, pp. 178-187, June 4-11,<br />

2000, Limerick Ireland. ACM, 2000.<br />

[39] Microsoft Corporation. DCOM Technical Overview. 1996.<br />

[40] Object Oriented Concepts – OOC. ORBacus for C++ and Java. 2000.<br />

[41] OMG. A discussion of the object management architecture. www.omg.org<br />

[42] OMG. The object mo<strong>de</strong>l. www.omg.org<br />

[43] ORA Canada. Software Manual for Windows Z/EVES. Version 2.1, July 2000.<br />

www.ora.on.ca/z-eves/zbrowser.html<br />

[44] ORFALI, Robert e HARKEY, Dan. Client/Server Programming with Java and<br />

CORBA. 2 nd , Wiley, 1998.<br />

[45] PAULA, Virgínia C.C. <strong>de</strong>. ZCL. A formal framework for specifying dynamic<br />

distributed software architectures. Tese <strong>de</strong> Doutorado, Universida<strong>de</strong> Fe<strong>de</strong>ral <strong>de</strong><br />

Pernambuco, Recife, 1999.<br />

[46] RATIONAL. UML Sumary. Versão 1.1, 09/1997. http://www.rational.com/uml<br />

[47] RATIONAL. Especificación <strong>de</strong>l Lenguaje <strong>de</strong> Restricciones para Objetos.<br />

Versión 1.1, 09/1997. http://www.software.ibm.com/ad/ocl<br />

[48] ROBBINS, Jason, REDMILES, David, ROSEMBLUM, David. Integrating C2<br />

with the Unified Mo<strong>de</strong>ling Language. From the Proceedings of the 1997<br />

California Software Symposium, Invirne, CA, November 1997.<br />

113


[49] ROBBINS, Jason, MEDVIDOVIC, Nenad, REDMILES, David, ROSEMBLUM,<br />

David. Integrating architecture <strong>de</strong>scription languages with a standard <strong>de</strong>sign<br />

method. 20 th International Conference on Software Engineering, Kyoto, Japan,<br />

April 1998.<br />

[50] RUMBAUGH, J., BLAHA. M., PREMERLANI, F., EDDY, F., LORENSEN, W.<br />

. Object-Oriented Mo<strong>de</strong>ling and Design, Prentice Hall, 1991.<br />

[51] SHAW, M., DELINE, R., KLEIN, D.V., ROSS, T.L., YOUNG, D.M.<br />

ZELESNIK, G.. Abstractions for software architecture and tools to support them.<br />

IEEE Transactions on Software Engineering, vol. 21, no. 4, pp. 314-335, April<br />

1995.<br />

[52] SHAW, Mary, GARLAN, David. Software Architecture – Perspectives on an<br />

Emerging Discipline. Prentice-Hall, 1996.<br />

[53] SILVA, Lyrene F. e PAULA, Virgínia C.C. <strong>de</strong>. A Arquitetura <strong>de</strong> Software e a<br />

UML. I Workshop Técnico-Científico – 15 Aos Dimap, UFRN, Brazil, 2000.<br />

[54] SILVA, Lyrene F. e PAULA, Virgínia C.C. <strong>de</strong>. Arquitetura em Camadas para o<br />

Desenvolvimento Baseado em Componentes. I Workshop sobre Desenvolvimento<br />

Baseado em Componentes, Maringá-PR, Junho 2001.<br />

[55] Sun. A New Approach to Distributed Computing. Microsystems. Inc. 1998.<br />

[56] Sun. Making Distributed Applications Simple and Dynamic. Microsystems. Inc.<br />

1998.<br />

[57] Visigenic Software, Inc., Visibroker for Java. Reference Manual. Version 3.0,<br />

1997.<br />

[58] WOODCOCK, Jim e DAVIES, Jim. Using Z – Specification, Refinement, and<br />

Proof. Prentice Hall, 1996.<br />

[59] WORDSWORTH, J. B. Software Development with Z. Addison Wesley, 1993.<br />

[60] YANG, Zhonghua e DUDDY, Keith. CORBA- A Plataform for Distributed<br />

Object Computing (A State-of-the-Art Report on OMG/CORBA) Operating<br />

Systems Review, vol.30, nº2, Abril, 1996.<br />

114


ANEXO A<br />

- ANÁLISE DA UML COMO LINGUAGEM DE<br />

DESCRIÇÃO DE ARQUITETURA<br />

Esta análise foi parte <strong>de</strong> um trabalho que nós <strong>de</strong>senvolvemos na disciplina<br />

Arquitetura <strong>de</strong> Software e apresentamos no I Workshop Técnico-Científico – 15<br />

Anos Dimap, 2000.<br />

A UML consiste <strong>de</strong> um conjunto <strong>de</strong> diagramas pouco integrados, que juntos tentam<br />

oferecer uma visão completa do sistema, dando suporte a todo o processo <strong>de</strong><br />

<strong>de</strong>senvolvimento <strong>de</strong> sistemas. No entanto, estes diagramas po<strong>de</strong>m ser utilizados da<br />

maneira que melhor se a<strong>de</strong>quar ao <strong>de</strong>senvolvedor. Po<strong>de</strong>-se utilizar todos ou apenas<br />

alguns diagramas com nível <strong>de</strong> <strong>de</strong>talhamento variado. Esta flexibilida<strong>de</strong> faz com que<br />

muitos <strong>de</strong>senvolvedores tentem utilizá-la para <strong>de</strong>scrição <strong>de</strong> arquiteturas.<br />

Embora não seja uma ADL, a UML, <strong>através</strong> <strong>de</strong> seus diagramas, po<strong>de</strong> representar<br />

parcialmente os aspectos arquiteturais <strong>de</strong> um sistema, com a vantagem <strong>de</strong> po<strong>de</strong>r evoluir<br />

gradativamente, expandindo e/ou <strong>de</strong>talhando, para representar os aspectos<br />

comportamentais até chegar ao nível <strong>de</strong> implementação.<br />

Apesar <strong>de</strong> ser capaz <strong>de</strong> retratar a estrutura gráfica <strong>de</strong> uma arquitetura, a UML<br />

não po<strong>de</strong> substituir uma ADL pois, é impossibilitada <strong>de</strong> <strong>de</strong>senvolver as funções<br />

avaliativas oferecidas pelas linguagens <strong>de</strong> <strong>de</strong>scrição <strong>de</strong> arquiteturas.<br />

Para ter uma visão do quanto a UML se distancia <strong>de</strong> uma ADL, o questionário<br />

avaliativo [10] <strong>de</strong> ADLs, foi aplicado à UML. Este questionário é estruturado nas<br />

seguintes categorias: orientado a sistema, orientado a linguagem e orientado a<br />

processos. Como a seguir:<br />

1 - Características orientadas a sistema<br />

São características relacionadas à aplicabilida<strong>de</strong> do sistema, <strong>de</strong>rivadas da <strong>de</strong>scrição da<br />

arquitetura.<br />

• Permite a <strong>de</strong>scrição <strong>de</strong> estilos: A UML permite a <strong>de</strong>scrição <strong>de</strong> estilos <strong>através</strong> <strong>de</strong><br />

<strong>meta</strong>-mo<strong>de</strong>los. Porém, estes mo<strong>de</strong>los não se encontram ainda a disposição,<br />

constituindo um trabalho interessante a ser realizado.<br />

115


• Que classes <strong>de</strong> sistema po<strong>de</strong> ser representado, arquiteturas dinâmicas,<br />

distribuídas, hardware <strong>de</strong> tempo-real, software <strong>de</strong> tempo-real: A UML se propõe<br />

a representar qualquer tipo <strong>de</strong> sistema.<br />

Sob estes aspectos a UML satisfaz, ainda, parcialmente aos requisitos exigidos <strong>de</strong> uma<br />

ADL.<br />

2 - Características orientadas a linguagem<br />

São características da linguagem em si, in<strong>de</strong>pen<strong>de</strong>nte dos sistemas <strong>de</strong>scritos por ela.<br />

Estes atributos incluem o tipo <strong>de</strong> informação, geralmente, encontrada no manual <strong>de</strong><br />

referência da linguagem. São elas:<br />

• Formalismo: UML não é uma linguagem formal, entretanto possui sua sintaxe e<br />

semântica bem <strong>de</strong>finidas. A sintaxe da representação gráfica é especificada por<br />

um mapeamento dos elementos gráficos em elementos <strong>de</strong> um mo<strong>de</strong>lo semântico<br />

subjacente. A sintaxe e semântica <strong>de</strong>ste mo<strong>de</strong>lo subjacente é especificado semiformalmente<br />

via um <strong>meta</strong>-mo<strong>de</strong>lo, texto <strong>de</strong>scritivo e restrições [49]. As<br />

restrições semânticas são expressadas em OCL (Object Constraints Language)<br />

que é uma linguagem textual baseada na lógica <strong>de</strong> predicados <strong>de</strong> primeiraor<strong>de</strong>m.<br />

• Completu<strong>de</strong>: UML permite a especificação <strong>de</strong> sistemas a qualquer nível <strong>de</strong><br />

completu<strong>de</strong>, inclusive a nível arquitetural.<br />

• Consistência: UML não provê mecanismos para garantir a consistência <strong>de</strong> seus<br />

diagramas.<br />

• Escopo da linguagem: UML po<strong>de</strong> representar informações <strong>de</strong> hardware, <strong>de</strong><br />

software e <strong>de</strong> documentação e relacionamentos entre eles.<br />

• História <strong>de</strong> <strong>de</strong>sign: UML provê uma boa documentação gráfica <strong>de</strong> <strong>de</strong>sign da<br />

arquitetura.<br />

• Visões: UML suporta várias visões.<br />

• Escalabilida<strong>de</strong>: UML admite hierarquia, capacida<strong>de</strong> <strong>de</strong> subconjunto e herança.<br />

• Po<strong>de</strong>r expressivo: UML trabalha com orientação a objetos.<br />

Sob este aspecto, a UML po<strong>de</strong> ser referenciada para <strong>de</strong>screver arquiteturas mas, não<br />

po<strong>de</strong> ser referenciada como linguagem <strong>de</strong> <strong>de</strong>scrição <strong>de</strong> arquitetura pois não é uma<br />

linguagem formal nem provê artifícios para garantir a consistência entre os mo<strong>de</strong>los<br />

(diagramas).<br />

116


3 - Características orientadas a processos<br />

São características <strong>de</strong> um processo relacionadas ao uso da linguagem para criar, validar,<br />

analisar e refinar uma <strong>de</strong>scrição <strong>de</strong> arquitetura e construir uma aplicação a partir <strong>de</strong>la.<br />

São elas:<br />

• Suporte <strong>de</strong> criação <strong>de</strong> arquitetura: UML possui editores gráficos.<br />

• Suporte <strong>de</strong> validação <strong>de</strong> arquitetura: Não possui.<br />

• Suporte <strong>de</strong> refinamento da arquitetura: UML permite <strong>de</strong>senvolvimento<br />

incremental <strong>de</strong> um sistema. Mas não provê nenhuma ferramenta que garanta a<br />

consistência entre os mo<strong>de</strong>los.<br />

• Suporte <strong>de</strong> análise <strong>de</strong> arquitetura: Não possui.<br />

• Aplicação <strong>de</strong> construção: A ferramenta Rational Rose, para edição <strong>de</strong> mo<strong>de</strong>los<br />

em UML, é capaz <strong>de</strong> mapear os mo<strong>de</strong>los construídos para uma linguagem <strong>de</strong><br />

programação (escreve os cabeçalhos das classes, e possibilita o <strong>de</strong>senvolvedor a<br />

escrever o conteúdo <strong>de</strong>las) e assim, compilar e executar estas linguagens.<br />

Sob este aspecto a UML não provê os principais requisitos, que são ferramentas para<br />

validação e análise <strong>de</strong> arquiteturas.<br />

Consi<strong>de</strong>rações Finais<br />

A UML fornece recursos padronizados (diagramas) para mo<strong>de</strong>lagem <strong>de</strong> sistemas<br />

computacionais. Esta linguagem <strong>de</strong> mo<strong>de</strong>lagem po<strong>de</strong> ser utilizada para representar,<br />

graficamente, arquiteturas <strong>de</strong> software. Por outro lado, ela não é capaz, ainda, <strong>de</strong><br />

oferecer todo o subsídio que uma linguagem <strong>de</strong> <strong>de</strong>scrição <strong>de</strong> arquitetura possui. Isto é<br />

uma questão <strong>de</strong> tempo, pois existe um gran<strong>de</strong> interesse <strong>de</strong> pesquisadores em adaptar ou<br />

expandir a UML para que atenda eficientemente estes requisitos.<br />

Vários trabalhos procuram integrar a UML a linguagens formais e/ou linguagens <strong>de</strong><br />

<strong>de</strong>scrição <strong>de</strong> arquiteturas já existentes [34][48][49]. Assim, tentam atrair a parcela <strong>de</strong><br />

<strong>de</strong>senvolvedores que primam por uma linguagem fácil <strong>de</strong> enten<strong>de</strong>r e manipular como a<br />

UML, ao contrário da maioria <strong>de</strong> linguagens formais que possuem uma sintaxe mais<br />

complicada. Assim, une-se a avaliação analítica, geralmente focada pelos pesquisadores<br />

acadêmicos, com a facilida<strong>de</strong> <strong>de</strong> expressão, geralmente focada pelo mundo comercial e<br />

industrial.<br />

117


dir: DIR ž<br />

ž<br />

mo<strong>de</strong>: ž MODE<br />

type: TYPE<br />

ž<br />

Synchonize: SYNCHRONIZATION<br />

serv_ofer: SERVICO ž<br />

ž<br />

propr: Proprieda<strong>de</strong><br />

¢¤¢¢£¦¢£¢¢¢¢£¢¢¥¢¢¢¤¥¢¢¢¢¥¢¢£¢¢¢¢£¦¢¤¢<br />

Ÿ<br />

Porta_exp¢¥¢¢¢¤¥¢¢¢£¦¢££¦¢£¢¢¥£¢¢¢¢¥¢¢£<br />

Ϣ<br />

id_port_exp: PORTA ž<br />

ž<br />

serv_req: ž SERVICO<br />

propr: Proprieda<strong>de</strong><br />

¢¤¢¢£¦¢£¢¢¢¢£¢¢¥¢¢¢¤¥¢¢¢¢¥¢¢£¢¢¢¢£¦¢¤¢<br />

Ÿ<br />

Componentes£¢¢¤¢¥¢¢¢¢¥¢¤¢¢¥¢¢£¦¢¤¢£¢¢¥¢¢¢¤¥<br />

Ϣ<br />

# conf § 2 Ÿ<br />

ž<br />

¢¤¢¢£¦¢£¢¢¢¢£¢¢¥¢¢¢¤¥¢¢¢¢¥¢¢£¢¢¢¢£¦¢¤¢<br />

ANEXO B - ESPECIFICAÇÃO FORMAL EM Z DO META-<br />

MODELO PARA MODELAR ESTILOS.<br />

[PORTA, PAPEL, SERVICO, COMPONENTE, CONECTOR, INTERFACE, CONFIGURAÇÃO,<br />

PAPELIN, PAPELOUT]<br />

DIR ::š entry › exit<br />

TYPE ::š real › integer › string<br />

MODE ::š reply › rereply<br />

SYNCHRONIZATION ::š Synchrono › Assynchrono › Defered_Synchrono<br />

œ¢ Proprieda<strong>de</strong>¢¥¢¤¢¢¥¢¢¢£¦¤¢¢£¦¢£¢¦¤¢£¢¢¢¥¢¢¤¢<br />

¢¤¢¢£¦¢£¢¢¢¢£¢¢¥¢¢¢¤¥¢¢¢¢¥¢¢£¢¢¢¢£¦¢¤¢<br />

Ÿ<br />

Porta_rec£¢¢¢¥¢¢¤¢¥¢¢¢£¦¢¤¢£¦¢¥¢¢££¢¦£¢¢¢<br />

žœ¢ id_port_rec: PORTA<br />

ž<br />

ž<br />

ž<br />

ž<br />

ž<br />

id_comp: COMPONENTE<br />

in_port: Porta_rec<br />

out_port: Porta_exp<br />

serv_req, serv_ofer: SERVICO<br />

conf: CONFIGURAÇÃO<br />

¢¤¢¢£¦¢£¢¢¢¢£¢ ¡<br />

c1, c2: Porta_rec › c1 £ in_port ¤ c2 £ in_port<br />

ž<br />

ž¥¢<br />

c1 . id_port_rec = c2 . id_port_rec ¦ c1 = c2<br />

ž¥¢ ¥<br />

c1, c2: › Porta_exp £ c1 ¤ out_port £ c2 ž out_port<br />

c1 . id_port_exp = c2 . id_port_exp ¦ c1 = c2<br />

ž¥¢<br />

x: SERVICO; y: Porta_rec › y £ in_port ¥ x = y . serv_ofer ¦ x £ serv_ofer<br />

¥<br />

x: SERVICO; y: Porta_exp › y £ out_port ¥ x = y . serv_req ¦ x £ serv_req<br />

ž¥¢<br />

118


ž<br />

id_inpap: PAPEL<br />

ž¥¢<br />

x: Porta_exp › x £ port_exp ¥ x . propr = propr<br />

¢¤¢¢£¦¢£¢¢¢¢£¢¢¥¢¢¢¤¥¢¢¢¢¥¢¢£¢¢¢¢£¦¢¤¢<br />

Ÿ<br />

PapelOUT ¢¢¢£¢¢¢¢£¦¢£¢¢¢¢£¢¢¥¦¢¤¢£¢¢¥¢¢¢¤¥<br />

Ϣ<br />

ž<br />

id_outpap: PAPEL<br />

ž¥¢<br />

x: PapelIN › x £ inpap ¥ x . propr = propr<br />

¢¤¢¢£¦¢£¢¢¢¢£¢¢¥¢¢¢¤¥¢¢¢¢¥¢¢£¢¢¢¢£¦¢¤¢<br />

Ÿ<br />

RelacPapelPAPEL¢¢£¢¦£¢¢¢¢£¢¢¢¥¢¢¢£¢¢¢¢£¦¢¤¢£¦<br />

Ϣ<br />

Atr2: PAPELOUT ¨ PAPELIN<br />

ž<br />

¢¤¢¢£¦¢£¢¢¢¢£¢ ¡<br />

ž<br />

papIN = dom papin<br />

Atr2 £ papOUT ¨ papIN<br />

ž<br />

¢¤¢¢£¦¢£¢¢¢¢£¢¢¥¢¢¢¤¥¢¢¢¢¥¢¢£¢¢¢¢£¦¢¤¢<br />

Ÿ<br />

ž<br />

ž port_exp: Porta_exp<br />

outpap: PAPELOUT<br />

PapelIN¢£¢¢¢¢£¢¢¢¥¢¢¢£¢¢¢¢£¦¢¥¤¢¢¢£¢¦£¢¤¢<br />

Ϣ<br />

propr: Proprieda<strong>de</strong><br />

ž<br />

¡ ¢¤¢¢£¦¢£¢¢¢¢£¢<br />

propr: Proprieda<strong>de</strong> ž<br />

ž<br />

port_rec: ž Porta_rec<br />

inpap: PapelIN<br />

¢¤¢¢£¦¢£¢¢¢¢£¢ ¡<br />

x: Porta_rec › x £ port_rec ¥ x . propr = propr<br />

ž¥¢<br />

papIN: PAPELIN<br />

ž<br />

papOUT: PAPELOUT<br />

ž<br />

papin: PAPELIN ¨ PapelIN<br />

ž<br />

papout: PAPELOUT ¨ PapelOUT<br />

ž<br />

ž<br />

Atr1: ¨ PAPELIN PAPELOUT<br />

ž<br />

papOUT = dom papout<br />

ž<br />

Atr1 £ papIN ¨ papOUT<br />

119


ž ¥ c1 . id_outpap = c2 . id_outpap ¦ c1 = c2<br />

# conf § 2 Ÿ<br />

ž<br />

¢¤¢¢£¦¢£¢¢¢¢£¢¢¥¢¢¢¤¥¢¢¢¢¥¢¢£¢¢¢¢£¦¢¤¢<br />

ž<br />

ž in_pap: PapelIN<br />

out_pap: PapelOUT<br />

Conectores ¢¢£¦¢£¢¢¢¢£¢¢¥¢¢¢¢£¢¦£¢¢¢¢£¢¢¢¢£<br />

žœ¢ id_con: CONECTOR<br />

ž<br />

port_pap1: Porta_rec © PapelOUT<br />

ž<br />

conf:<br />

CONFIGURAÇÃO<br />

ž<br />

pap_pap: PapelIN © PapelOUT<br />

ž<br />

port_pap2: Porta_exp © PapelIN<br />

¢¤¢¢£¦¢£¢¢¢¢£¢ ž¥¢<br />

¡<br />

c1, c2: › PapelIN £ c1 ¤ in_pap £ c2 ž in_pap<br />

c1 . id_inpap = c2 . id_inpap ¦ c1 = c2<br />

ž¥¢<br />

c1, c2: PapelOUT › c1 £ out_pap ¤ c2 £ out_pap<br />

¥<br />

in_pap ª « ž<br />

ž<br />

ª « ž¥¢ out_pap<br />

x: Porta_rec; y: ›U¬ x­ y® £ PapelOUT ¥ port_pap1 £ y ž¥¢ out_pap<br />

x: Porta_exp; y: ›U¬ x­ y® £ PapelIN ¥ port_pap2 £ y ž¥¢ in_pap<br />

x: PapelIN; y: ›P¬ x­ y® £ PapelOUT ž ¥<br />

pap_pap<br />

¯ x ¤ in_pap £ y ° out_pap £ x ¤ in_pap ¯ y out_pap<br />

120


ž<br />

comp_comp: Componentes © Componentes<br />

ž<br />

ž<br />

ž<br />

ž<br />

ž<br />

ž<br />

ž<br />

B1: COMPONENTE © CONFIGURAÇÃO<br />

¡<br />

ž<br />

¢¤¢¢£¦¢£¢¢¢¢£¢<br />

conf = dom conf1 ž<br />

ž<br />

con = dom con1<br />

B1 £ comp © conf Ÿ<br />

ž<br />

¢¤¢¢£¦¢£¢¢¢¢£¢¢¥¢¢¢¤¥¢¢¢¢¥¢¢£¢¢¢¢£¦¢¤¢<br />

Configuração £¢¢¢¤¢¢£¢¢¥¢¢¤¦£¢¢¢¥¢¢¤¢¢£¦¢£¢¢<br />

žœ¢ comp: Componentes<br />

ž<br />

con:<br />

Conectores<br />

port_pap1: Porta_rec © PapelOUT<br />

ž<br />

port_pap2: Porta_exp © PapelIN<br />

ž<br />

ž<br />

pap_pap: © PapelIN PapelOUT<br />

¢¤¢¢£¦¢£¢¢¢¢£¢ ¡<br />

c1, c2: Componentes › c1 £ comp ¤ c2 £ comp<br />

ž<br />

ž¥¢<br />

c1 . id_comp = c2 . id_comp ¦ c1 = c2<br />

ž¥¢ ¥<br />

c1, c2: › Conectores £ c1 ¤ con £ c2 ž ¥<br />

con<br />

c1 . id_con = c2 . ¦ id_con c1 = ž¥¢ c2<br />

x: › Componentes £ x ž comp<br />

z: Componentes › z £ comp ¥¬ z­ x® £ comp_comp ° ¬ x­ z® £ comp_comp<br />

ž¥¢<br />

x: Porta_rec; y: PapelOUT<br />

¥±<br />

x­ y® £ port_pap1<br />

ž ¥± cp: Componentes; cn: Conectores › cp £ comp ¤ cn £ con<br />

›U¬<br />

¥¬ x­ y® £ cn . port_pap1 ¤ x £ cp . in_port<br />

x: Porta_exp; y: PapelIN ›U¬ x­ y® £ port_pap2<br />

ž<br />

ž¥¢<br />

cp: Componentes; cn: Conectores › cp £ comp ¤ cn £ con<br />

¥±<br />

¥¬ x­ y® £ cn . port_pap2 ¤ x £ cp . out_port<br />

x: PapelIN; y: PapelOUT ›P¬ x­ y® £ pap_pap<br />

ž¥¢<br />

¥± z, w: Conectores › z £ con ¤ w £ con<br />

ž<br />

¥ x £ z . in_pap ¤ y £ w . out_pap ¤ w . id_con ª z . id_con<br />

x, y: Componentes › x £ comp ¤ y £ comp ¤ ¬ x­ y® £ comp_comp<br />

ž¥¢<br />

¥± z, w: SERVICO › z £ x . serv_req ¤ w £ y . serv_ofer<br />

ž<br />

± k: Conectores; l: Porta_rec; m: Porta_exp; n: PapelOUT;<br />

¤<br />

o: ›U¬ l­ n® £ PapelIN k . ¤ ¬ m­ o® £ port_pap1 k . port_pap2<br />

¥ z = w<br />

¢¤¢¢£¦¢£¢¢¢¢£¢¢¥¢¢¢¤¥¢¢¢¢¥¢¢£¢¢¢¢£¦¢¤¢<br />

Ÿ<br />

RelacCONFConf¢¢¢£¦¢££¦¢£¢¢¥¢¤¦¢£¢¢¢¢£¢¢¢¢¥¢<br />

žœ¢ conf: ž CONFIGURAÇÃO<br />

conf1: ¨ CONFIGURAÇÃO Configuração<br />

¥¬ l £ y . in_port ¤ m £ x . out_port®®<br />

ž<br />

ž<br />

con: CONECTOR<br />

comp: COMPONENTE<br />

con1: CONECTOR ¨ Conectores<br />

ž<br />

comp1: COMPONENTE ¨ Componentes<br />

ž<br />

A: CONFIGURAÇÃO © CONECTOR<br />

ž<br />

ž<br />

A1: © CONECTOR ž CONFIGURAÇÃO<br />

B: © CONFIGURAÇÃO COMPONENTE<br />

ž<br />

comp = dom comp1<br />

A £ conf © con ž<br />

ž<br />

£ A1 © con ž conf<br />

£ B © conf comp<br />

121


dir: DIR ž<br />

ž<br />

mo<strong>de</strong>: ž MODE<br />

type: TYPE<br />

ž<br />

Synchonize: SYNCHRONIZATION<br />

¢¤¢¢£¦¢£¢¢¢¢£¢¢¥¢¢¢¤¥¢¢¢¢¥¢¢£¢¢¢¢£¦¢¤¢<br />

Ÿ<br />

Porta_rec£¢¢¢¥¢¢¤¢¥¢¢¢£¦¢¤¢£¦¢¥¢¢££¢¦£¢¢¢<br />

Ϣ<br />

id_port_rec: PORTA ž<br />

ž<br />

serv_ofer: ž SERVICO<br />

propr: Proprieda<strong>de</strong><br />

¢¤¢¢£¦¢£¢¢¢¢£¢¢¥¢¢¢¤¥¢¢¢¢¥¢¢£¢¢¢¢£¦¢¤¢<br />

Ÿ<br />

Porta_exp¢¥¢¢¢¤¥¢¢¢£¦¢££¦¢£¢¢¥£¢¢¢¢¥¢¢£<br />

Ϣ<br />

id_port_exp: PORTA ž<br />

ž<br />

serv_req: ž SERVICO<br />

propr: Proprieda<strong>de</strong><br />

# conf § 2<br />

ž<br />

¢¤¢¢£¦¢£¢¢¢¢£¢¢¥¢¢¢¤¥¢¢¢¢¥¢¢£¢¢¢¢£¦¢¤¢<br />

Ÿ<br />

ANEXO C - ESPECIFICAÇÃO FORMAL EM Z DO META-<br />

MODELO PARA MODELAR ARQUITETURAS EM CAMADAS.<br />

[PORTA, PAPEL, SERVICO, COMPONENTE, CONECTOR, CONFIGURAÇÃO, PAPELOUT,<br />

PAPELIN]<br />

COMUNICAÇÃO ::š top1 › top2 › topbot1 › topbot2 › bot1 › bot2<br />

DIR ::š entry › exit<br />

TYPE ::š real › integer › string<br />

MODE ::š reply › rereply<br />

SYNCHRONIZATION ::š Synchrono › Assynchrono › Defered_Synchrono<br />

œ¢ Proprieda<strong>de</strong>¢¥¢¤¢¢¥¢¢¢£¦¤¢¢£¦¢£¢¦¤¢£¢¢¢¥¢¢¤¢<br />

¢¤¢¢£¦¢£¢¢¢¢£¢¢¥¢¢¢¤¥¢¢¢¢¥¢¢£¢¢¢¢£¦¢¤¢<br />

Ÿ<br />

Componentes£¢¢¤¢¥¢¢¢¢¥¢¤¢¢¥¢¢£¦¢¤¢£¢¢¥¢¢¢¤¥<br />

žœ¢ id_comp: COMPONENTE<br />

ž<br />

ž<br />

ž<br />

ž<br />

in_port: Porta_rec<br />

out_port: Porta_exp<br />

serv_req, serv_ofer: SERVICO<br />

conf: CONFIGURAÇÃO<br />

¢¤¢¢£¦¢£¢¢¢¢£¢ ¡<br />

c1, c2: Porta_rec › c1 £ in_port ¤ c2 £ in_port<br />

ž¥¢<br />

¥ c1 . id_port_rec = c2 . id_port_rec ¦ c1 = c2<br />

ž¥¢<br />

ž<br />

c1, c2: › Porta_exp £ c1 ¤ out_port £ c2 ž out_port<br />

c1 . id_port_exp = c2 . id_port_exp ¦ c1 = c2<br />

ž¥¢ ¥<br />

x: SERVICO; y: › Porta_rec £ y ¥ in_port x = y . ¦ serv_ofer £ x ž¥¢ serv_ofer<br />

x: SERVICO; y: › Porta_exp £ y ¥ out_port x = y . ¦ serv_req £ x serv_req<br />

122


ž<br />

id_inpap: PAPEL<br />

ž¥¢<br />

x: Porta_exp › x £ port_exp ¥ x . propr = propr<br />

¢¤¢¢£¦¢£¢¢¢¢£¢¢¥¢¢¢¤¥¢¢¢¢¥¢¢£¢¢¢¢£¦¢¤¢<br />

Ÿ<br />

PapelOUT ¢¢¢£¢¢¢¢£¦¢£¢¢¢¢£¢¢¥¦¢¤¢£¢¢¥¢¢¢¤¥<br />

Ϣ<br />

ž<br />

id_outpap: PAPEL<br />

ž¥¢<br />

x: PapelIN › x £ inpap ¥ x . propr = propr<br />

ž ¥ c1 . id_outpap = c2 . id_outpap ¦ c1 = c2<br />

# conf § 2 Ÿ<br />

ž<br />

¢¤¢¢£¦¢£¢¢¢¢£¢¢¥¢¢¤¢¥¢¢¢¢¥¢¢£¢¢¢¢£¦¢¤¢<br />

ž<br />

ž port_exp: Porta_exp<br />

outpap: PAPELOUT<br />

PapelIN¢£¢¢¢¢£¢¢¢¥¢¢¢£¢¢¢¢£¦¢¥¤¢¢¢£¢¦£¢¤¢<br />

Ϣ<br />

propr: Proprieda<strong>de</strong><br />

ž<br />

¡ ¢¤¢¢£¦¢£¢¢¢¢£¢<br />

propr: Proprieda<strong>de</strong> ž<br />

ž<br />

port_rec: ž Porta_rec<br />

inpap: PapelIN<br />

¢¤¢¢£¦¢£¢¢¢¢£¢ ¡<br />

x: Porta_rec › x £ port_rec ¥ x . propr = propr<br />

ž¥¢<br />

¢¤¢¢£¦¢£¢¢¢¢£¢¢¥¢¢¢¤¥¢¢¢¢¥¢¢£¢¢¢¢£¦¢¤¢<br />

Ÿ<br />

Conectores ¢¢£¦¢£¢¢¢¢£¢¢¥¢¢¢¤¥¢¦£¢¢¢¢¤¥¢¢¢£<br />

žœ¢ id_con: CONECTOR<br />

ž<br />

ž in_pap: PapelIN<br />

out_pap: PapelOUT<br />

ž<br />

port_pap1: Porta_rec © PapelOUT<br />

ž<br />

conf:<br />

CONFIGURAÇÃO<br />

ž<br />

pap_pap: PapelIN © PapelOUT<br />

ž<br />

port_pap2: Porta_exp © PapelIN<br />

¢¤¢¢£¦¢£¢¢¢¢£¢ ž¥¢<br />

¡<br />

c1, c2: › PapelIN £ c1 ¤ in_pap £ c2 ž in_pap<br />

c1 . id_inpap = c2 . id_inpap ¦ c1 = c2<br />

ž¥¢ ¥<br />

c1, c2: › PapelOUT £ c1 ¤ out_pap £ c2 out_pap<br />

in_pap ª « ž<br />

out_pap ª « ž¥¢<br />

ž<br />

x: PapelIN; y: ›P¬ x­ y® £ PapelOUT ž pap_pap<br />

x ¯ in_pap ¤ y £ out_pap ° x £ in_pap ¤ y ¯ out_pap<br />

¥<br />

123


ž<br />

comp_comp: Componentes © Componentes<br />

ž<br />

ž<br />

ž<br />

ž<br />

ž<br />

ž<br />

ž<br />

¢¤¢¢£¦¢£¢¢¢¢£¢¢¥¢¢¢¤¥¢¢¢¢¥¢¢£¢¢¢¢£¦¢¤¢<br />

Ÿ<br />

RelacCONFConf¢¢¢£¦¢££¦¢£¢¢¥¢¤¦¢£¢¢¢¢£¢¢¢¢¥¢<br />

Ϣ<br />

B1: COMPONENTE © CONFIGURAÇÃO<br />

¡<br />

ž<br />

¢¤¢¢£¦¢£¢¢¢¢£¢<br />

conf = dom conf1<br />

ž<br />

con = dom con1<br />

ž<br />

B1 £ comp © conf<br />

ž<br />

¢¤¢¢£¦¢£¢¢¢¢£¢¢¥¢¢¢¤¥¢¢¢¢¥¢¢£¢¢¢¢£¦¢¤¢<br />

Ÿ<br />

Configuração £¢¢¢¤¢¢£¢¢¥¢¢¤¦£¢¢¢¥¢¢¤¢¢£¦¢£¢¢<br />

žœ¢ comp: Componentes<br />

ž<br />

con:<br />

Conectores<br />

port_pap1: Porta_rec © PapelOUT<br />

ž<br />

port_pap2: Porta_exp © PapelIN<br />

ž<br />

pap_pap: PapelIN © PapelOUT<br />

ž<br />

¢¤¢¢£¦¢£¢¢¢¢£¢ ¡<br />

c1, c2: Componentes › c1 £ comp ¤ c2 £ comp<br />

ž<br />

ž¥¢<br />

c1 . id_comp = c2 . id_comp ¦ c1 = c2<br />

ž¥¢ ¥<br />

c1, c2: › Conectores £ c1 ¤ con £ c2 ž ¥<br />

con<br />

c1 . id_con = c2 . ¦ id_con c1 = ž¥¢ c2<br />

x: › Componentes £ x ž comp<br />

z: Componentes › z £ comp ¥¬ z­ x® £ comp_comp ° ¬ x­ z® £ comp_comp<br />

ž¥¢<br />

x: Porta_rec; y: PapelOUT ›U¬ x­ y® £ port_pap1<br />

¥±<br />

¥± cp: Componentes; cn: Conectores › cp £ comp ¤ cn £ con<br />

ž<br />

¥¬ x­ y® £ cn . port_pap1 ¤ x £ cp . in_port<br />

x: Porta_exp; y: PapelIN ›U¬ x­ y® £ port_pap2<br />

ž<br />

ž¥¢<br />

cp: Componentes; cn: Conectores › cp £ comp ¤ cn £ con<br />

¥±<br />

¥¬ x­ y® £ cn . port_pap2 ¤ x £ cp . out_port<br />

x: PapelIN; y: PapelOUT ›P¬ x­ y® £ pap_pap<br />

ž¥¢<br />

¥± z, w: Conectores › z £ con ¤ w £ con<br />

ž<br />

¥ x £ z . in_pap ¤ y £ w . out_pap ¤ w . id_con ª z . id_con<br />

x, y: Componentes › x £ comp ¤ y £ comp ¤ ¬ x­ y® £ comp_comp<br />

ž<br />

ž¥¢<br />

z, w: SERVICO › z £ x . serv_req ¤ w £ y . serv_ofer<br />

¥±<br />

± k: Conectores; l: Porta_rec; m: Porta_exp; n: PapelOUT;<br />

¤<br />

o: ›U¬ l­ n® £ PapelIN k . ¤ ¬ m­ o® £ port_pap1 k . port_pap2<br />

¥ z = w<br />

conf:<br />

ž<br />

con:<br />

ž<br />

¥¬ l £ y . in_port ¤ m £ x . out_port®®<br />

CONFIGURAÇÃO<br />

conf1: CONFIGURAÇÃO ¨ Configuração<br />

ž<br />

ž CONECTOR<br />

con1: ¨ CONECTOR Conectores<br />

ž<br />

comp:<br />

COMPONENTE<br />

comp1: COMPONENTE ¨ Componentes<br />

ž<br />

A: CONFIGURAÇÃO © CONECTOR<br />

ž<br />

A1: CONECTOR © CONFIGURAÇÃO<br />

ž<br />

ž<br />

B: © CONFIGURAÇÃO COMPONENTE<br />

ž<br />

comp = dom comp1<br />

A £ conf © con<br />

ž<br />

A1 £ con © conf ž<br />

ž<br />

£ B © conf comp<br />

124


Configuração<br />

ž<br />

tipo_interação: COMUNICAÇÃO<br />

ž<br />

ž<br />

nível: Componentes ¨ ²<br />

³ ¬¢<br />

x, y: Componentes › x £ comp ¤ y £ comp ¤ ¬ x­ y® £ comp_comp<br />

ž<br />

ž<br />

ž ³ ¬¢<br />

x, y: Componentes › x £ comp ¤ y £ comp ¤ ¬ x­ y® £ comp_comp<br />

³ ¬¢<br />

x, y: Componentes › x £ comp ¤ y £ comp ¤ ¬ x­ y® £ comp_comp<br />

ž<br />

ž<br />

³ ¬¢<br />

x, y: Componentes › x £ comp ¤ y £ comp ¤ ¬ x­ y® £ comp_comp<br />

ž<br />

ž<br />

³ ¬¢<br />

x, y: Componentes › x £ comp ¤ y £ comp ¤ ¬ x­ y® £ comp_comp<br />

ž<br />

ž<br />

³ ¬¢<br />

x, y: Componentes › x £ comp ¤ y £ comp ¤ ¬ x­ y® £ comp_comp<br />

ž<br />

ž<br />

¢¤¢¢£¦¢£¢¢¢¢£¢¢¥¢¢¢¤¥¢¢¢¢¥¢¢£¢¢¢¢£¦¢¤¢<br />

Ÿ<br />

œ¢ Configuração_Camadas ¢¢¢¢£¢¤¢¢¢¢£¢¦¥¤¢¢¢£¢¦£¢¤¢¦<br />

¢¤¢¢£¦¢£¢¢¢¢£¢ ¡<br />

x: Componentes; y: ² ›P¬ x­ y® £ nível ¥ x £ comp<br />

ž<br />

ž¥¢<br />

tipo_interação = bot1 ¬<br />

¥ nível x = nível y - 1®®<br />

ž ° ¬ tipo_interação = topbot1<br />

¥ nível x = nível y + 1 ° nível x = nível y - 1®®<br />

ž ° ¬ tipo_interação = topbot2<br />

¥ nível x ª nível y®®<br />

ž ° ¬ tipo_interação = top2<br />

¥ nível x ´ nível y®>®<br />

125


dir: DIR<br />

¹<br />

mo<strong>de</strong>: MODE ¹<br />

¹<br />

type: TYPE<br />

¹<br />

Synchronize: SYNCHRONIZATION<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

º<br />

Porta_rec¸£¸¢¸¢¸¢¸¥¸¢¸¢¸¤¸¢¸¥¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸£¸¦¸¢¸¥¸¢¸¢¸£¸¸£¸¢¸¦¸£¸¢¸¢¸¢¸<br />

·¢¸<br />

id_port_rec: PORTA<br />

¹<br />

serv_ofer: SERVICO ¹<br />

¹<br />

propr: Proprieda<strong>de</strong><br />

serv_req: SERVICO<br />

¹<br />

propr: Proprieda<strong>de</strong><br />

¹<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

º<br />

Porta_div¸¢¸¢¸¢¸¢¸£¸¢¸¦¸£¸¢¸¤¸¢¸¦¸£¸¢¸¢¸¢¸¥¸¤¸¢¸¢¸¢¸¥¸¢¸¢¸¢¸£¸¢¸¤¸¦¸¢¸£¸¢¸¢¸<br />

·¢¸<br />

Porta_exp ¹<br />

¹<br />

interface: INTERFACE<br />

º ¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

ANEXO D - ESPECIFICAÇÃO FORMAL EM Z DO META-<br />

MODELO PARA MODELAR APLICAÇÕES BASEADAS EM CORBA<br />

– CORBA COMO UM CONECTOR DA ARQUITETURA.<br />

[PORTA, PAPEL, SERVICO, COMPONENTE, CONECTOR, INTERFACE, CONFIGURAÇÃO,<br />

PAPELIN, PAPELOUT]<br />

DIR ::µ entry exit<br />

TYPE ::µ real integer string<br />

MODE ::µ reply rereply<br />

SYNCHRONIZATION ::µ Synchrono Assynchrono Defered_Synchrono<br />

·¢¸ Proprieda<strong>de</strong>¸¢¸¥¸¢¸¤¸¢¸¢¸¥¸¢¸¢¸¢¸£¸¦¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¦¸¤¸¢¸£¸¢¸¢¸¢¸¥¸¢¸¢¸¤¸¢¸<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

º<br />

Porta_exp¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸£¸¦¸¢¸£¸¸£¸¦¸¢¸£¸¢¸¢¸¥¸¸£¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¸<br />

¹ ·¢¸<br />

id_port_exp: PORTA<br />

126


¹<br />

conf: » CONFIGURAÇÃO<br />

¹<br />

# conf  2<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

º<br />

PapelIN_C¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¤¸¦¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¦¸<br />

·¢¸<br />

¹<br />

id_inpap: PAPEL<br />

¹<br />

outpap: » PAPELOUT<br />

¹<br />

inpap: » PapelIN_C<br />

x: PapelIN_C x ¾ inpap À x . propr = propr<br />

¹¥½<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

º<br />

Componentes_C¸¢¸¢¸¢¸£¸¸£¸¢¸¦¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¢¸¥¸¦¸£¸¢¸¤¸¢¸¢¸¢¸¥¸¢¸¢¸¢¸£¸¢¸<br />

¹ ·¢¸<br />

id_comp: ¹ COMPONENTE<br />

» in_port: Porta_rec<br />

out_port: » Porta_exp<br />

¹<br />

div_port: » Porta_div<br />

¹<br />

¹<br />

serv_req, serv_ofer: » SERVICO<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸ ¼<br />

c1, c2: Porta_rec c1 ¾ in_port ¿ c2 ¾ in_port<br />

¹<br />

¹¥½<br />

c1 . id_port_rec = c2 . id_port_rec Á c1 = c2<br />

¹¥½ À<br />

c1, c2: Porta_exp ¾ c1 ¿ out_port ¾ c2 ¹ À<br />

out_port<br />

c1 . id_port_exp = c2 . Á id_port_exp c1 = ¹¥½ c2<br />

c1, c2: Porta_div ¾ c1 ¿ div_port ¾ c2 ¹ div_port<br />

c1 . id_port_exp = c2 . id_port_exp Á c1 = c2<br />

¹¥½<br />

x: SERVICO; y: Porta_rec y ¾ in_port À x = y . serv_ofer Á x ¾ serv_ofer<br />

À<br />

¹¥½<br />

x: SERVICO; y: Porta_exp y ¾ out_port À x = y . serv_req Á x ¾ serv_req<br />

¹<br />

propr: Proprieda<strong>de</strong><br />

port_exp: » Porta_exp<br />

¹<br />

port_div: » Porta_div<br />

¹<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸ ¼<br />

x: Porta_exp x ¾ port_exp À x . propr = propr<br />

¹¥½<br />

¹¥½<br />

x: Porta_div ¾ x À port_div x . propr = propr<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

º<br />

PapelOUT ¸¢¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¦¸¢¸¤¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸<br />

¹ ·¢¸<br />

id_outpap: PAPEL<br />

¹<br />

propr: Proprieda<strong>de</strong><br />

¹<br />

port_rec: » Porta_rec<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸ ¼<br />

x: Porta_rec x ¾ port_rec À x . propr = propr<br />

¹¥½<br />

127


¹<br />

conf: » CONFIGURAÇÃO<br />

¹ À x Ç in_pap ¿ y ¾ out_pap È x ¾ in_pap ¿ y Ç out_pap<br />

# conf  2 º<br />

¹<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

Conectores_C ¸¤¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¸¥¸¢¸¢¸£¸¢¸¦¸£¸¢¸¤¸¦¸¢¸£¸¢¸¢¸¢¸¢¸¥¸¤¸¢¸¢¸¢¸<br />

¹ ·¢¸<br />

id_con: ¹ CONECTOR<br />

» in_pap: PapelIN_C<br />

out_pap: » PapelOUT<br />

¹<br />

port_pap1: Porta_rec à PapelOUT<br />

¹<br />

port_pap2: Porta_exp à PapelIN_C<br />

¹<br />

¹<br />

port_pap3: Ã Porta_div PapelIN_C<br />

¹<br />

pap_pap: PapelIN_C Ã PapelOUT<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸ ¼<br />

c1, c2: PapelIN_C c1 ¾ in_pap ¿ c2 ¾ in_pap<br />

¹¥½<br />

À c1 . id_inpap = c2 . id_inpap Á c1 = c2<br />

¹¥½<br />

¹<br />

c1, c2: PapelOUT ¾ c1 ¿ out_pap ¾ c2 ¹ out_pap<br />

c1 . id_outpap = c2 . id_outpap Á c1 = c2<br />

¹¥½<br />

x: PapelIN_C; y: PapelOUT PÄ xÅ yÆ ¾ pap_pap<br />

À<br />

in_pap É Ê ¹<br />

¹<br />

É Ê ¹¥½out_pap x: Porta_rec; y: UÄ xÅ yÆ ¾ PapelOUT À port_pap1 ¾ y ¹¥½ out_pap<br />

x: Porta_exp; y: UÄ xÅ yÆ ¾ PapelIN_C À port_pap2 ¾ y ¹¥½ in_pap<br />

x: PapelIN_C; y: PÄ xÅ yÆ ¾ PapelOUT pap_pap<br />

¹ À x Ç in_pap ¿ y ¾ out_pap È x ¾ in_pap ¿ y Ç out_pap<br />

128


¹<br />

comp_comp: Componentes_C Ã Componentes_C<br />

¹ ¿ ÄË k: Conectores_C; l: Porta_rec; m: Porta_exp; n: PapelOUT; o,<br />

¿ Ä jÅ pÆ ¾ k . port_pap3<br />

¹<br />

À Ä l ¾ y . in_port ¿ m ¾ x . out_port ¿ j ¾ y . div_portÆ>Æ<br />

º<br />

¹<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

¹<br />

comp: » Componentes_C<br />

Configuração_CORBA ¸¤¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¢¸¥¸¤¸¢¸¢¸¢¸¥¸¢¸¢¸¢¸£¸¸£¸¦¸¢¸£¸¢¸¢¸¥¸¢¸<br />

·¢¸<br />

con: » Conectores_C ¹<br />

¹<br />

port_pap1: Ã Porta_rec PapelOUT<br />

port_pap2: Porta_exp à PapelIN_C<br />

¹<br />

port_pap3: Porta_div à PapelIN_C<br />

¹<br />

¹<br />

pap_pap: PapelIN_C Ã PapelOUT<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸ ¹¥½<br />

¼<br />

c1, c2: Componentes_C ¾ c1 ¿ comp ¾ c2 ¹ comp<br />

c1 . id_comp = c2 . id_comp Á c1 = c2<br />

¹¥½<br />

c1, c2: Conectores_C c1 ¾ con ¿ c2 ¾ con<br />

À<br />

À c1 . id_con = c2 . id_con Á c1 = c2<br />

¹<br />

x: Componentes_C x ¾ comp<br />

¹<br />

¹¥½<br />

z: Componentes_C z ¾ comp À Ä zÅ xÆ ¾ comp_comp È Ä xÅ zÆ ¾ comp_comp<br />

¹¥½ ÀË<br />

x: Porta_rec; y: UÄ xÅ yÆ ¾ PapelOUT ¹ port_pap1<br />

cp: Componentes_C; cn: Conectores_C cp ¾ comp ¿ cn ¾ con<br />

¹ À Ä xÅ yÆ ¾ cn . port_pap1 ¿ x ¾ cp . in_port<br />

ÀË<br />

x: Porta_exp; y: PapelIN_C UÄ xÅ yÆ ¾ port_pap2<br />

¹¥½<br />

ÀË cp: Componentes_C; cn: Conectores_C cp ¾ comp ¿ cn ¾ con<br />

¹<br />

¹<br />

Ä xÅ yÆ ¾ cn . port_pap2 ¿ x ¾ cp . out_port<br />

¹¥½ À<br />

x: Porta_div; y: UÄ xÅ yÆ ¾ PapelIN_C ¹ port_pap3<br />

cp: Componentes_C; cn: Conectores_C cp ¾ comp ¿ cn ¾ con<br />

¹ À Ä xÅ yÆ ¾ cn . port_pap3 ¿ x ¾ cp . div_port<br />

ÀË<br />

x: PapelIN_C; y: PapelOUT PÄ xÅ yÆ ¾ pap_pap<br />

¹¥½<br />

ÀË z, w: Conectores_C z ¾ con ¿ w ¾ con<br />

¹<br />

¹<br />

x ¾ z . in_pap ¿ y ¾ w . out_pap ¿ w . id_con É z . id_con<br />

¹¥½ À<br />

x, y: Componentes_C ¾ x ¿ comp ¾ y ¿ Ä xÅ yÆ ¾ comp ¹ comp_comp<br />

z, w: SERVICO z ¾ x . serv_req ¿ w ¾ y . serv_ofer<br />

¹ À z = w<br />

ÀË<br />

¹<br />

p: PapelIN_C; j: Porta_div<br />

PÄ lÅ nÆ ¾ k . port_pap1<br />

¹<br />

¿ Ä mÅ oÆ ¾ k . port_pap2<br />

¹<br />

129


dir: DIR ¹<br />

¹<br />

mo<strong>de</strong>: ¹ MODE<br />

type: TYPE<br />

¹<br />

Synchronize: SYNCHRONIZATION<br />

serv_ofer: SERVICO ¹<br />

¹<br />

propr: Proprieda<strong>de</strong><br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

º<br />

Porta_exp¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸£¸¦¸¢¸£¸¸£¸¦¸¢¸£¸¢¸¢¸¥¸¸£¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¸<br />

·¢¸<br />

id_port_exp: PORTA ¹<br />

¹<br />

serv_req: ¹ SERVICO<br />

propr: Proprieda<strong>de</strong><br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

º<br />

Porta_div¸¢¸¢¸¢¸¢¸£¸¢¸¦¸£¸¢¸¤¸¢¸¦¸£¸¢¸¢¸¢¸¥¸¤¸¢¸¢¸¢¸¥¸¢¸¢¸¢¸£¸¢¸¤¸¦¸¢¸£¸¢¸¢¸<br />

·¢¸<br />

Porta_exp ¹<br />

¹<br />

interface: INTERFACE<br />

º ¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

ANEXO E - ESPECIFICAÇÃO FORMAL EM Z DO META-<br />

MODELO PARA MODELAR APLICAÇÕES BASEADAS EM CORBA<br />

– CORBA COMO UM COMPONENTE DA ARQUITETURA.<br />

[PORTA, PAPEL, SERVICO, COMPONENTE, CONECTOR, INTERFACE, CONFIGURAÇÃO,<br />

PAPELIN, PAPELOUT]<br />

DIR ::µ entry exit<br />

TYPE ::µ real integer string<br />

MODE ::µ reply rereply<br />

SYNCHRONIZATION ::µ Synchrono Assynchrono Defered_Synchrono<br />

·¢¸ Proprieda<strong>de</strong>¸¢¸¥¸¢¸¤¸¢¸¢¸¥¸¢¸¢¸¢¸£¸¦¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¦¸¤¸¢¸£¸¢¸¢¸¢¸¥¸¢¸¢¸¤¸¢¸<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

º<br />

Porta_rec¸£¸¢¸¢¸¢¸¥¸¢¸¢¸¤¸¢¸¥¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸£¸¦¸¢¸¥¸¢¸¢¸£¸¸£¸¢¸¦¸£¸¢¸¢¸¢¸<br />

¹ ·¢¸<br />

id_port_rec: PORTA<br />

130


¹<br />

conf: » CONFIGURAÇÃO<br />

¹<br />

# conf  2<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

º<br />

Comp_da_aplicação¸¤¸¢¸¢¸¢¸£¸¢¸¢¸¢¸¥¸¢¸¤¸¢¸¢¸¥¸¢¸¢¸¥¸¢¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸<br />

·¢¸<br />

¹<br />

div_port: » Porta_div<br />

¹ À c1 . id_port_exp = c2 . id_port_exp Á c1 = c2<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

º<br />

Comp_CORBA ¸¤¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¢¸¥¸¢¸¤¸¢¸¢¸¥¸¢¸<br />

·¢¸<br />

¹<br />

div_port: » Porta_div<br />

x: Porta_div x ¾ port_div À x . propr = propr<br />

º<br />

¹¥½<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

·¢¸ Componentes¸£¸¢¸¢¸¤¸¢¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¤¸¢¸¢¸¥¸¢¸¢¸£¸¦¸¢¸¤¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸<br />

¹<br />

id_comp: COMPONENTE<br />

in_port: » Porta_rec ¹<br />

¹<br />

» out_port: Porta_exp<br />

¹<br />

serv_req, serv_ofer: » SERVICO<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸ ¼<br />

c1, c2: Porta_rec c1 ¾ in_port ¿ c2 ¾ in_port<br />

¹¥½<br />

À c1 . id_port_rec = c2 . id_port_rec Á c1 = c2<br />

¹¥½<br />

¹<br />

c1, c2: Porta_exp ¾ c1 ¿ out_port ¾ c2 ¹ out_port<br />

c1 . id_port_exp = c2 . id_port_exp Á c1 = c2<br />

¹¥½<br />

x: SERVICO; y: Porta_rec y ¾ in_port À x = y . serv_ofer Á x ¾ serv_ofer<br />

À<br />

¹¥½<br />

x: SERVICO; y: Porta_exp y ¾ out_port À x = y . serv_req Á x ¾ serv_req<br />

¹<br />

Componentes<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸ ¼<br />

c1, c2: Porta_div c1 ¾ div_port ¿ c2 ¾ div_port<br />

¹¥½<br />

¹<br />

Componentes<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸ ¹¥½<br />

¼<br />

c1, c2: Porta_div ¾ c1 ¿ div_port ¾ c2 ¹ div_port<br />

c1 . id_port_exp = c2 . id_port_exp Á c1 = c2<br />

À<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

º<br />

PapelIN¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¢¸¥¸¢¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¥¸¤¸¢¸¢¸¢¸£¸¢¸¦¸£¸¢¸¤¸¢¸<br />

¹ ·¢¸<br />

id_inpap: PAPEL<br />

¹<br />

propr: Proprieda<strong>de</strong><br />

port_exp: » Porta_exp ¹<br />

¹<br />

» port_div: ¹ Porta_div<br />

» outpap: ¼ ¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸<br />

PAPELOUT<br />

¹¥½<br />

x: Porta_exp x ¾ port_exp À x . propr = propr<br />

131


¹<br />

id_outpap: PAPEL<br />

¹<br />

inpap: » PapelIN<br />

¹¥½<br />

x: PapelIN x ¾ inpap À x . propr = propr<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

º<br />

Conectores ¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¢¸£¸¢¸¦¸£¸¢¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸£¸<br />

·¢¸<br />

¹<br />

conf: » CONFIGURAÇÃO<br />

¹ À c1 . id_outpap = c2 . id_outpap Á c1 = c2<br />

# conf  2<br />

¹<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

º<br />

·¢¸ PapelOUT ¸¢¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¦¸¢¸¤¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸<br />

¹<br />

propr: Proprieda<strong>de</strong><br />

¹<br />

port_rec: » Porta_rec<br />

¼ ¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸<br />

¹¥½<br />

x: Porta_rec x ¾ port_rec À x . propr = propr<br />

¹<br />

id_con: CONECTOR<br />

¹<br />

in_pap: » PapelIN<br />

out_pap: » PapelOUT<br />

¹<br />

port_pap1: Porta_rec à PapelOUT<br />

¹<br />

port_pap2: Porta_exp à PapelIN<br />

¹<br />

¹<br />

port_pap3: Ã Porta_div PapelIN<br />

¹<br />

pap_pap: PapelIN Ã PapelOUT<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸ ¼<br />

c1, c2: PapelIN c1 ¾ in_pap ¿ c2 ¾ in_pap<br />

¹¥½<br />

À c1 . id_inpap = c2 . id_inpap Á c1 = c2<br />

¹<br />

c1, c2: PapelOUT c1 ¾ out_pap ¿ c2 ¾ out_pap<br />

¹¥½<br />

in_pap É Ê ¹<br />

out_pap É Ê ¹<br />

x: PapelIN; y: PapelOUT PÄ xÅ yÆ ¾ pap_pap<br />

¹¥½<br />

¹ À x Ç in_pap ¿ y ¾ out_pap È x ¾ in_pap ¿ y Ç out_pap<br />

132


¹<br />

comp_comp: Componentes à Componentes<br />

o: PapelIN UÄ lÅ nÆ ¾ k . port_pap1 ¿ Ä mÅ oÆ ¾ k . port_pap2<br />

¹<br />

À Ä l ¾ y . in_port ¿ m ¾ x . out_portÆÆ<br />

¹<br />

¹<br />

corb_corb: Comp_CORBA Ã Comp_CORBA<br />

¹¥½<br />

x: Porta_rec; y: PapelOUT UÄ xÅ yÆ ¾ port_pap1<br />

Configuração ¸£¸¢¸¢¸¢¸¤¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¤¸¦¸£¸¢¸¢¸¢¸¥¸¢¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸<br />

¹ ·¢¸<br />

» comp: ¹ Componentes<br />

» con: ¹ Conectores<br />

port_pap1: Ã Porta_rec ¹ PapelOUT<br />

port_pap2: Ã Porta_exp PapelIN<br />

¹<br />

pap_pap: PapelIN Ã PapelOUT<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸ ¼<br />

c1, c2: Componentes c1 ¾ comp ¿ c2 ¾ comp<br />

¹<br />

¹¥½<br />

c1 . id_comp = c2 . id_comp Á c1 = c2<br />

¹¥½ À<br />

c1, c2: Conectores ¾ c1 ¿ con ¾ c2 ¹ À<br />

con<br />

c1 . id_con = c2 . Á id_con c1 = ¹¥½ c2<br />

x: Componentes ¾ x ¹ comp<br />

z: Componentes z ¾ comp À Ä zÅ xÆ ¾ comp_comp È Ä xÅ zÆ ¾ comp_comp<br />

¹¥½<br />

x: Porta_rec; y: PapelOUT UÄ xÅ yÆ ¾ port_pap1<br />

ÀË<br />

ÀË cp: Componentes; cn: Conectores cp ¾ comp ¿ cn ¾ con<br />

¹<br />

À Ä xÅ yÆ ¾ cn . port_pap1 ¿ x ¾ cp . in_port<br />

¹¥½<br />

¹<br />

x: Porta_exp; y: UÄ xÅ yÆ ¾ PapelIN ¹ ÀË<br />

port_pap2<br />

cp: Componentes; cn: Conectores ¾ cp ¿ comp ¾ cn ¹ con<br />

Ä xÅ yÆ ¾ cn . port_pap2 ¿ x ¾ cp . out_port<br />

¹¥½<br />

x: PapelIN; y: PapelOUT PÄ xÅ yÆ ¾ pap_pap<br />

À<br />

ÀË z, w: Conectores z ¾ con ¿ w ¾ con<br />

¹<br />

À x ¾ z . in_pap ¿ y ¾ w . out_pap ¿ w . id_con É z . id_con<br />

¹¥½<br />

¹<br />

x, y: Componentes ¾ x ¿ comp ¾ y ¿ Ä xÅ yÆ ¾ comp ¹ ÀË<br />

comp_comp<br />

z, w: SERVICO ¾ z x . ¿ serv_req ¾ w y . ¹ serv_ofer<br />

z = w ¹ ¿ ÄË k: Conectores; l: Porta_rec; m: Porta_exp; n: PapelOUT;<br />

À<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

º<br />

Configuração_CORBA ¸¤¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¢¸¥¸¤¸¢¸¢¸¢¸¥¸¢¸¢¸¢¸£¸¸£¸¦¸¢¸£¸¢¸¢¸¥¸¢¸<br />

¹ ·¢¸<br />

» comp: Comp_da_aplicação<br />

corb: » Comp_CORBA<br />

¹<br />

con: » Conectores<br />

¹<br />

port_pap1: Porta_rec à PapelOUT<br />

¹<br />

¹<br />

port_pap2: Ã Porta_exp ¹ PapelIN<br />

port_pap3: Ã Porta_div PapelIN<br />

pap_pap: PapelIN Ã PapelOUT<br />

¹<br />

¹<br />

corb_comp: Ã Comp_CORBA ¹ Comp_da_aplicação<br />

comp_corb: Ã Comp_da_aplicação Comp_CORBA<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸ ¼<br />

c1, c2: Comp_da_aplicação c1 ¾ comp ¿ c2 ¾ comp<br />

¹<br />

¹¥½<br />

c1 . id_comp = c2 . id_comp Á c1 = c2<br />

¹¥½ À<br />

c1, c2: Comp_CORBA ¾ c1 ¿ corb ¾ c2 ¹ corb<br />

c1 . id_comp = c2 . id_comp Á c1 = c2<br />

¹¥½<br />

c1, c2: Conectores c1 ¾ con ¿ c2 ¾ con<br />

À<br />

À c1 . id_con = c2 . id_con Á c1 = c2<br />

¹<br />

x: Comp_da_aplicação x ¾ comp<br />

¹<br />

¹¥½<br />

z: Comp_CORBA z ¾ corb À Ä zÅ xÆ ¾ corb_comp È Ä xÅ zÆ ¾ comp_corb<br />

ÀË<br />

133


¹ À x ¾ z . in_pap ¿ y ¾ w . out_pap ¿ w . id_con É z . id_con<br />

¹ ¿ ÄË k, j: Conectores; l, r: Porta_rec; m: Porta_exp; n, s: PapelOUT;<br />

¹ ¿ q ¾ y . div_port<br />

¹<br />

o: PapelIN UÄ lÅ nÆ ¾ k . port_pap1 ¿ Ä mÅ oÆ ¾ k . port_pap2<br />

¹ ¿ ÄË k, j: Conectores; l, r: Porta_rec; m: Porta_exp; n, s: PapelOUT;<br />

¿ q ¾ y . div_port<br />

¹<br />

¿ r ¾ x . in_portÆÆ<br />

¹<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

º<br />

ÀË cp: Comp_da_aplicação; cn: Conectores cp ¾ comp ¿ cn ¾ con<br />

¹<br />

À Ä xÅ yÆ ¾ cn . port_pap1 ¿ x ¾ cp . in_port<br />

¹<br />

x: Porta_exp; y: PapelIN UÄ xÅ yÆ ¾ port_pap2<br />

¹<br />

¹¥½<br />

cp: Comp_da_aplicação; cn: Conectores cp ¾ comp ¿ cn ¾ con<br />

ÀË<br />

¹ À Ä xÅ yÆ ¾ cn . port_pap2 ¿ x ¾ cp . out_port<br />

x: Porta_div; y: PapelIN PÄ xÅ yÆ ¾ port_pap3<br />

¹<br />

¹¥½<br />

cp: Comp_da_aplicação; cn: Conectores cp ¾ comp ¿ cn ¾ con<br />

¹ ÀË<br />

Ä xÅ yÆ ¾ cn . port_pap3 ¿ x ¾ cp . div_port<br />

¹¥½<br />

x: PapelIN; y: PapelOUT PÄ<br />

À<br />

yÆ ¾ pap_pap<br />

xÅ<br />

¹ ÀË z, w: Conectores z ¾ con ¿ w ¾ con<br />

¹¥½<br />

x: Comp_CORBA; y: Comp_da_aplicação<br />

¹ x ¾ corb ¿ y ¾ comp ¿ Ä xÅ yÆ ¾ corb_comp<br />

ÀË z, w: SERVICO z ¾ x . serv_req ¿ w ¾ y . serv_ofer<br />

¹<br />

¹<br />

z = w À<br />

¹<br />

o, p: PapelIN; q: Porta_div<br />

PÄ lÅ nÆ ¾ k . port_pap1<br />

¹<br />

¹<br />

Ä mÅ oÆ ¾ k . port_pap2<br />

¹ ¿<br />

Ä qÅ pÆ ¾ j . port_pap3<br />

¹ ¿ Ä<br />

¿<br />

sÆ ¾ j . port_pap1<br />

¹ rÅ<br />

Ä l ¾ y . in_port ¹ ¿<br />

À<br />

¾ m x . out_port<br />

¿ r ¾ x . in_portÆÆ<br />

¹<br />

x ¾ comp ¿ y ¾ corb ¿ Ä xÅ yÆ ¾ comp_corb<br />

¹<br />

¹¥½<br />

x: Comp_da_aplicação; y: Comp_CORBA<br />

ÀË z, w: SERVICO z ¾ x . serv_req ¿ w ¾ y . serv_ofer<br />

¹<br />

À z = w<br />

¹<br />

¹ ¿ ÄË k: Conectores; l: Porta_rec; m: Porta_exp; n: PapelOUT;<br />

À Ä l ¾ y . in_port ¿ m ¾ x . out_portÆÆ<br />

¹¥½<br />

¹<br />

x, y: Comp_CORBA ¾ x ¿ corb ¾ y ¿ Ä xÅ yÆ ¾ corb corb_corb<br />

ÀË z, w: SERVICO z ¾ x . serv_req ¿ w ¾ y . serv_ofer<br />

¹<br />

¹<br />

z = w À<br />

¹<br />

o, p: PapelIN; q: Porta_div<br />

PÄ lÅ nÆ ¾ k . port_pap1<br />

¹<br />

¿ Ä mÅ oÆ ¾ k . port_pap2<br />

¹<br />

¿ Ä qÅ pÆ ¾ j . port_pap3<br />

¹<br />

¹<br />

Ä rÅ sÆ ¾ j . port_pap1<br />

¹ ¿<br />

Ä l ¾ y . in_port ¹ ¿ m ¾ x . out_port<br />

À<br />

134


dir: DIR ¹<br />

¹<br />

mo<strong>de</strong>: ¹ MODE<br />

type: TYPE<br />

¹<br />

Synchronize: SYNCHRONIZATION<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

º<br />

Porta_rec¸£¸¢¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸£¸¦¸¢¸£¸¸£¸¦¸¢¸¥¸¢¸¢¸£¸¸£¸¢¸¦¸£¸¢¸¢¸¢¸<br />

·¢¸<br />

id_port_rec: PORTA ¹<br />

¹<br />

serv_ofer: ¹ SERVICO<br />

propr: Proprieda<strong>de</strong><br />

serv_req: SERVICO ¹<br />

¹<br />

propr: Proprieda<strong>de</strong><br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

º<br />

Porta_div¸¢¸¢¸¢¸¢¸£¸¢¸¦¸£¸¢¸¤¸¢¸¦¸£¸¢¸¢¸¢¸¥¸¤¸¢¸¢¸¢¸¥¸¢¸¢¸¢¸£¸¢¸¤¸¦¸¢¸£¸¢¸¢¸<br />

·¢¸<br />

Porta_exp ¹<br />

¹<br />

interface: INTERFACE<br />

º ¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

ANEXO F - ESPECIFICAÇÃO FORMAL EM Z DO META-<br />

MODELO PARA MODELAR UMA FAMÍLIA DE APLICAÇÕES<br />

DISTRIBUÍDAS COM MIDDLEWARE CORBA.<br />

[PORTA, PAPEL, SERVICO, COMPONENTE, CONECTOR, INTERFACE, CONFIGURAÇÃO,<br />

PAPELIN, PAPELOUT]<br />

COMUNICAÇÃO ::µ top1 top2 topbot1 topbot2 bot1 bot2<br />

DIR ::µ entry exit<br />

TYPE ::µ real integer string<br />

MODE ::µ reply rereply<br />

SYNCHRONIZATION ::µ Synchrono Assynchrono Defered_Synchrono<br />

·¢¸ Proprieda<strong>de</strong>¸¢¸¥¸¢¸¤¸¢¸¢¸¥¸¢¸¢¸¢¸£¸¦¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¦¸¤¸¢¸£¸¢¸¢¸¢¸¥¸¢¸¢¸¤¸¢¸<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

º<br />

Porta_exp¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸£¸¦¸¢¸£¸¸£¸¦¸¢¸£¸¢¸¢¸¥¸¸£¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¸<br />

¹ ·¢¸<br />

id_port_exp: PORTA<br />

135


¹<br />

conf: » CONFIGURAÇÃO<br />

¹<br />

# conf  2<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

º<br />

PapelIN_C¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¤¸¦¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¦¸<br />

·¢¸<br />

¹<br />

id_inpap: PAPEL<br />

¹<br />

outpap: » PAPELOUT<br />

¹<br />

inpap: » PapelIN_C<br />

x: PapelIN_C x ¾ inpap À x . propr = propr<br />

¹¥½<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

º<br />

Componentes_C¸¢¸¢¸¢¸£¸¸£¸¢¸¦¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¢¸¥¸¦¸£¸¢¸¤¸¢¸¢¸¢¸¥¸¢¸¢¸¢¸£¸¢¸<br />

¹ ·¢¸<br />

id_comp: ¹ COMPONENTE<br />

» in_port: Porta_rec<br />

out_port: » Porta_exp<br />

¹<br />

div_port: » Porta_div<br />

¹<br />

¹<br />

serv_req, serv_ofer: » SERVICO<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸ ¼<br />

c1, c2: Porta_rec c1 ¾ in_port ¿ c2 ¾ in_port<br />

¹<br />

¹¥½<br />

c1 . id_port_rec = c2 . id_port_rec Á c1 = c2<br />

¹¥½ À<br />

c1, c2: Porta_exp ¾ c1 ¿ out_port ¾ c2 ¹ À<br />

out_port<br />

c1 . id_port_exp = c2 . Á id_port_exp c1 = ¹¥½ c2<br />

c1, c2: Porta_div ¾ c1 ¿ div_port ¾ c2 ¹ div_port<br />

c1 . id_port_exp = c2 . id_port_exp Á c1 = c2<br />

¹¥½<br />

x: SERVICO; y: Porta_rec y ¾ in_port À x = y . serv_ofer Á x ¾ serv_ofer<br />

À<br />

¹¥½<br />

x: SERVICO; y: Porta_exp y ¾ out_port À x = y . serv_req Á x ¾ serv_req<br />

¹<br />

propr: Proprieda<strong>de</strong><br />

port_exp: » Porta_exp<br />

¹<br />

port_div: » Porta_div<br />

¹<br />

¸¤¸¢¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸ ¼<br />

x: Porta_exp x ¾ port_exp À x . propr = propr<br />

¹¥½<br />

¹¥½<br />

x: Porta_div ¾ x À port_div x . propr = propr<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

º<br />

PapelOUT ¸¢¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¦¸¢¸¤¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸<br />

¹ ·¢¸<br />

id_outpap: PAPEL<br />

¹<br />

propr: Proprieda<strong>de</strong><br />

¹<br />

port_rec: » Porta_rec<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸ ¼<br />

x: Porta_rec x ¾ port_rec À x . propr = propr<br />

¹¥½<br />

136


¹<br />

conf: » CONFIGURAÇÃO<br />

¹ À x Ç in_pap ¿ y ¾ out_pap È x ¾ in_pap ¿ y Ç out_pap<br />

¹<br />

# conf  2<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

º<br />

Configuração_CORBA_Camadas ¸¢¸¢¸£¸¸£¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸¤¸¢¸£¸¢¸¦¸£¸¢¸¢¸¢¸¢¸£¸¢¸<br />

·¢¸<br />

comp_comp: Componentes_C Ã Componentes_C<br />

¹<br />

¹<br />

nível: Ì Í<br />

Componentes_C<br />

¹<br />

tipo_interação: COMUNICAÇÃO<br />

¹¥½<br />

x: PapelIN_C; y: PapelOUT PÄ xÅ yÆ ¾ pap_pap<br />

Conectores_C ¸¤¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¸¥¸¢¸¢¸£¸¢¸¦¸£¸¢¸¤¸¦¸¢¸£¸¢¸¢¸¢¸¢¸¥¸¤¸¢¸¢¸¢¸<br />

¹ ·¢¸<br />

id_con: ¹ CONECTOR<br />

» in_pap: PapelIN_C<br />

out_pap: » PapelOUT<br />

¹<br />

port_pap1: Porta_rec à PapelOUT<br />

¹<br />

port_pap2: Porta_exp à PapelIN_C<br />

¹<br />

¹<br />

port_pap3: Ã Porta_div PapelIN_C<br />

¹<br />

pap_pap: PapelIN_C Ã PapelOUT<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸ ¼<br />

c1, c2: PapelIN_C c1 ¾ in_pap ¿ c2 ¾ in_pap<br />

¹¥½<br />

À c1 . id_inpap = c2 . id_inpap Á c1 = c2<br />

¹¥½<br />

¹<br />

c1, c2: PapelOUT ¾ c1 ¿ out_pap ¾ c2 ¹ out_pap<br />

c1 . id_outpap = c2 . id_outpap Á c1 = c2<br />

¹¥½<br />

x: PapelIN_C; y: PapelOUT PÄ xÅ yÆ ¾ pap_pap<br />

À<br />

in_pap É Ê ¹<br />

¹<br />

É Ê ¹¥½out_pap x: Porta_rec; y: UÄ xÅ yÆ ¾ PapelOUT À port_pap1 ¾ y ¹¥½ out_pap<br />

x: Porta_exp; y: UÄ xÅ yÆ ¾ PapelIN_C À port_pap2 ¾ y ¹¥½ in_pap<br />

x: PapelIN_C; y: PÄ xÅ yÆ ¾ PapelOUT pap_pap<br />

¹ À x Ç in_pap ¿ y ¾ out_pap È x ¾ in_pap ¿ y Ç out_pap<br />

comp: » Componentes_C ¹<br />

¹<br />

» con: ¹ Conectores_C<br />

port_pap1: Ã Porta_rec ¹ PapelOUT<br />

port_pap2: Ã Porta_exp ¹ PapelIN_C<br />

port_pap3: Ã Porta_div PapelIN_C<br />

¹<br />

pap_pap: PapelIN_C Ã PapelOUT<br />

¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸ ¹¥½<br />

¼<br />

c1, c2: Componentes_C ¾ c1 ¿ comp ¾ c2 ¹ comp<br />

c1 . id_comp = c2 . id_comp Á c1 = c2<br />

¹¥½<br />

c1, c2: Conectores_C c1 ¾ con ¿ c2 ¾ con<br />

À<br />

À c1 . id_con = c2 . id_con Á c1 = c2<br />

¹<br />

x: Componentes_C x ¾ comp<br />

¹<br />

¹¥½<br />

z: Componentes_C z ¾ comp À Ä zÅ xÆ ¾ comp_comp È Ä xÅ zÆ ¾ comp_comp<br />

¹¥½<br />

x: Porta_rec; y: PapelOUT UÄ xÅ yÆ ¾ port_pap1<br />

ÀË<br />

ÀË cp: Componentes_C; cn: Conectores_C cp ¾ comp ¿ cn ¾ con<br />

¹<br />

¹<br />

Ä xÅ yÆ ¾ cn . port_pap1 ¿ x ¾ cp . in_port<br />

¹¥½ À<br />

x: Porta_exp; y: UÄ xÅ yÆ ¾ PapelIN_C ¹ port_pap2<br />

cp: Componentes_C; cn: Conectores_C cp ¾ comp ¿ cn ¾ con<br />

¹ À Ä xÅ yÆ ¾ cn . port_pap2 ¿ x ¾ cp . out_port<br />

ÀË<br />

x: Porta_div; y: PapelIN_C UÄ xÅ yÆ ¾ port_pap3<br />

¹¥½<br />

ÀË cp: Componentes_C; cn: Conectores_C cp ¾ comp ¿ cn ¾ con<br />

¹<br />

¹<br />

Ä xÅ yÆ ¾ cn . port_pap3 ¿ x ¾ cp . div_port<br />

À<br />

137


¹ ¿ ÄË k: Conectores_C; l: Porta_rec; m: Porta_exp; n: PapelOUT; o,<br />

¹ ¿ Ä jÅ pÆ ¾ k . port_pap3<br />

¹ ΠĽ<br />

x, y: Componentes_C x ¾ comp ¿ y ¾ comp ¿ Ä xÅ yÆ ¾ comp_comp<br />

¹ ΠĽ<br />

x, y: Componentes_C x ¾ comp ¿ y ¾ comp ¿ Ä xÅ yÆ ¾ comp_comp<br />

¹ ΠĽ<br />

x, y: Componentes_C x ¾ comp ¿ y ¾ comp ¿ Ä xÅ yÆ ¾ comp_comp<br />

¹ ΠĽ<br />

x, y: Componentes_C x ¾ comp ¿ y ¾ comp ¿ Ä xÅ yÆ ¾ comp_comp<br />

ΠĽ<br />

x, y: Componentes_C x ¾ comp ¿ y ¾ comp ¿ Ä xÅ yÆ ¾ comp_comp<br />

¹<br />

¹<br />

nível x Ï nível yÆ>Æ º ¸¢¸¤¸¢¸¢¸£¸¦¸¢¸£¸¢¸¢¸¢¸¢¸£¸¢¸¢¸¥¸¢¸¢¸¢¸¤¸¥¸¢¸¢¸¢¸¢¸¥¸¢¸¢¸£¸¢¸¢¸¢¸¢¸£¸¦¸¢¸¤¸¢¸<br />

À<br />

ÀË z, w: Conectores_C z ¾ con ¿ w ¾ con<br />

¹<br />

À x ¾ z . in_pap ¿ y ¾ w . out_pap ¿ w . id_con É z . id_con<br />

¹<br />

x, y: Componentes_C x ¾ comp ¿ y ¾ comp ¿ Ä xÅ yÆ ¾ comp_comp<br />

¹¥½<br />

¹ ÀË z, w: SERVICO z ¾ x . serv_req ¿ w ¾ y . serv_ofer<br />

¹ À z = w<br />

¹<br />

p: PapelIN_C; j: Porta_div<br />

¹ PÄ lÅ nÆ ¾ k . port_pap1<br />

¹ ¿ Ä mÅ oÆ ¾ k . port_pap2<br />

À Ä l ¾ y . in_port ¿ m ¾ x . out_port ¿ j ¾ y . div_portÆ>Æ<br />

¹¥½<br />

¹<br />

x: Componentes_C; Í UÄ xÅ yÆ ¾ y: À nível ¾ x comp<br />

¹ Ä tipo_interação = bot1<br />

À nível x = nível y - 1ÆÆ ¹<br />

È Ä tipo_interação = topbot1<br />

¹<br />

ΠĽ<br />

x, y: Componentes_C x ¾ comp ¿ y ¾ comp ¿ Ä xÅ yÆ ¾ comp_comp<br />

¹<br />

¹<br />

nível x = nível y + 1 È nível x = nível y - 1ÆÆ ¹<br />

¹<br />

Ä tipo_interação = topbot2 È<br />

À nível x É nível yÆÆ ¹<br />

È Ä tipo_interação = top2<br />

¹<br />

138

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!