• Nenhum resultado encontrado

Fase 7: Integra¸c˜ao dos Componentes do Sistema

componente, no caso de sistemas confi´aveis, onde os tratamentos costumam ser mais complexos; ou (ii) como uma classe, no caso de sistemas sem requisitos cr´ıticos de confia- bilidade, que normalmente possuem tratadores simples.

Em rela¸c˜ao aos componentes colaboradores, eles s˜ao implementados como wrappers que envolvem os participantes e intermediam o acesso a eles. Numa implementa¸c˜ao con- corrente, cada participante deve ser executado em uma thread distinta dos demais. A execu¸c˜ao dessas threads ´e coordenada e sincronizada pelo pr´oprio coordenador. A Fi- gura 3.25, que mostra a estrutura¸c˜ao de um wrapper pode ser utilizada para exemplificar uma colabora¸c˜ao, onde os componentes reutilizados assumem o papel de participantes e o wrapper assume o papel de coordenador.

3.8

Fase 7:

Integra¸c˜ao dos Componentes do Sistema

Apesar de nesse ponto do desenvolvimento os componentes da release atual j´a estarem dispon´ıveis para serem utilizados, esses componentes isoladamente n˜ao s˜ao capazes de oferecer os seus servi¸cos especificados. Para que isso seja poss´ıvel, ´e necess´ario indicar para cada um dos componentes, quem supre as suas dependˆencias. Essa liga¸c˜ao entre as interfaces requeridas de um componente e as respectivas interfaces providas de outro ´e feita atrav´es dos conectores, que conseq¨uentemente s˜ao dependentes dos componentes envolvidos.

O m´etodo MDCE+ divide a fase de integra¸c˜ao dos componentes em duas etapas conceitualmente distintas: (i) montar os componentes arquiteturais, onde ´e realizada a liga¸c˜ao entre os componentes normais e excepcionais; e (ii) materializar a configura¸c˜ao do sistema, onde ´e realizada a liga¸c˜ao entre os componentes arquiteturais do sistema e a implementa¸c˜ao do programa principal. As se¸c˜oes seguintes detalham cada uma dessas etapas.

3.8.1

Montar os Componentes Arquiteturais (ativ. 7.1)

Como discutido anteriormente, a fase de montagem dos componentes arquiteturais do sistema consiste basicamente na estrutura¸c˜ao dos componentes tolerantes a falhas ideais (Se¸c˜ao 2.3.7). Para isso, para cada componente do sistema que possui alguma dependˆencia excepcional (interface requerida excepcional), o m´etodo MDCE+ prevˆe a cria¸c˜ao de conec- tores especiais que realizem essa liga¸c˜ao. Devido ao car´ater interno desses conectores em rela¸c˜ao ao componente arquitetural do sistema, eles s˜ao denominados conectores internos. Do ponto de vista da abordagem de tratamento de exce¸c˜oes intra componente apre- sentada na Se¸c˜ao 2.4.2, os conectores internos materializam os trˆes n´ıveis de tratamento: de fronteira (ProvidedBLE e RequiredBLE) e de aplica¸c˜ao (ALE), uma vez que para o

componente, s˜ao eles que oferecem os seus tratadores. Deve ser criado um conector in- terno para cada n´ıvel de tratamento presente no componente: um conector ProvidedBLE, um RequiredBLE e um conector ALE, onde cada um implementa a sua interface corres- pondente, que foi definida durante a materializa¸c˜ao do componente (Se¸c˜ao 3.7). No caso dos componentes reutilizados, apenas as interfaces BLEs podem estar presentes. J´a no caso dos componentes novos, pode existir uma interface ProvidedBLE, uma ALE, uma RequiredBLE ou todas, conforme a natureza de detec¸c˜ao da exce¸c˜ao (Se¸c˜ao 2.4.2).

Do ponto de vista pr´atico, cada conector interno ´e implementado como uma classe simples. Essas classes, por sua vez, devem materializar26 a sua respectiva interface ex-

cepcional requerida, de acordo com o n´ıvel de tratamento de exce¸c˜oes que o conector se refere. A Figura 3.27 mostra a estrutura de um componente arquitetural que possui os trˆes n´ıveis de tratamento excepcional. Em seguida, a Figura 3.28 mostra o c´odigo rela- tivo a parte da implementa¸c˜ao em Java do conector interno ALE. Nesse c´odigo, o trecho sublinhado destaca a implementa¸c˜ao da interface provida. Os atributos das classes, por sua vez, representam as interfaces providas dos componentes excepcionais dos quais o conector depende. << component >> Normal << component >> ExcepcionalA << component >> ExcepcionalB ProvidedBLEConnector ALEConnector IReq IProv ProvBLEReq ALEReq IEAProv IEBProv . <<architectural_component>> RequiredBLEConnector ProvBLEReq

Figura 3.27: Estrutura do Componente Ideal Projetado

1 public c l a s s ALEConnector implements ALEReq {

2 IEAProv t r a t a d o r A ;

3 IEBProv t r a t a d o r B ;

4 . . .

5 }

Figura 3.28: Implementa¸c˜ao do Conector Interno ALE

Ap´os a implementa¸c˜ao dos conectores internos, deve-se proceder a cria¸c˜ao dos compo- nentes tolerantes a falhas ideais. Para isso, ´e necess´ario implementar o m´etodo do sistema

26

3.8. Fase 7: Integra¸c˜ao dos Componentes do Sistema 103

que ser´a respons´avel pela montagem dos componentes arquiteturais. Em resumo, esse m´etodo deve instanciar o componente normal, os excepcionais e os conectores internos. Em seguida, deve realizar a liga¸c˜ao desses componentes atrav´es dos conectores. Por se tratar de apenas uma classe, a liga¸c˜ao entre os componentes excepcionais e os conectores internos ´e feita atrav´es da passagem das referˆencias ao construtor da pr´opria classe. Em rela¸c˜ao aos componentes do sistema, as dependˆencias s˜ao supridas atrav´es da execu¸c˜ao da opera¸c˜ao setRequiredInterface(String nome, Object facade), da interface IMana- ger do COSMOS. A Figura 3.29 mostra um exemplo desse procedimento de liga¸c˜ao entre o componente normal CN e o componente excepcional CE, atrav´es do conector interno ConInt.

1 . . .

2 CN. s p e c . prov . IManager cn = CN. impl . ComponentFactory . c r e a t e I n s t a n c e ( ) ; 3 CE. s p e c . prov . IManager c e = CE . impl . ComponentFactory . c r e a t e I n s t a n c e ( ) ; 4 ConInt c o n I n t = new ConInt ( c e . g e t P r o v i d e d I n t e r f a c e ( ‘ ‘ IPCE ’ ’ ) ) ;

5 cn . s e t R e q u i r e d I n t e r f a c e ( c o n I n t ) ;

Figura 3.29: Exemplo em Java da Liga¸c˜ao entre dois Componentes

Por apresentar uma vis˜ao integrada dos componentes normal e excepcional, a partir desse momento ´e poss´ıvel realizar testes de unidade relativos aos componentes arquitetu- rais do sistema, isto ´e, testar os componentes tolerantes a falhas ideais como unidades de implementa¸c˜ao.

3.8.2

Materializar a Configura¸c˜ao do Sistema (ativ. 7.2)

Apesar das dependˆencias excepcionais terem sido supridas na atividade anterior de monta- gem dos componentes arquiteturais (Se¸c˜ao 3.8.1), ainda nos falta materializar as conex˜oes entre esses componentes do sistema. Essas conex˜oes s˜ao realizadas atrav´es de liga¸c˜oes en- tre as interfaces requeridas normais de um componente e as respectivas interfaces providas de outros. Dessa forma, a materializa¸c˜ao das configura¸c˜oes do sistema consiste de trˆes atividades: (i) finalizar a especifica¸c˜ao dos conectores arquiteturais; (ii) implementar esses conectores; e (iii) implementar o programa principal.

Por representar o elo de comunica¸c˜ao entre componentes arquiteturais, os conectores s˜ao os ´unicos componentes do sistema que possuem o conhecimento dos fluxos interativos entre os componentes. Dessa forma, como discutido no decorrer desse cap´ıtulo, eles s˜ao considerados os locais ideais para a implementa¸c˜ao dos requisitos de qualidade do sistema, tais como tolerˆancia a falhas e disponibilidade. Boa parte da especifica¸c˜ao dos conectores foi definida durante a an´alise do aspecto interativo entre os componentes (Se¸c˜ao 3.6.1), mas dada a sua importˆancia, ele ainda deve ser refinado.

No contexto espec´ıfico do desenvolvimento de sistemas robustos, a especifica¸c˜ao dos conectores deve ser refinada para oferecer o tratamento inter componentes, proposto por Asterio et al. (Se¸c˜ao 2.4.3). Isso ´e necess´ario, uma vez que no desenvolvimento desses sistemas, deve-se supor a ocorrˆencia de exce¸c˜oes n˜ao previstas na especifica¸c˜ao. Para essas exce¸c˜oes n˜ao antecipadas, o desenvolvedor deve seguir as diretrizes de convers˜oes excepcionais mostradas na Tabela 2.4 para definir exce¸c˜oes que representem esses novos pontos de sa´ıda excepcionais.

Al´em disso, o fato dos data types ficarem dentro do componente e a estrutura de pacotes fazer parte do nome da classe, ainda que dois data types possuam nome e estrutura semelhantes, ´e necess´ario definir as convers˜oes entre eles, atrav´es da instancia¸c˜ao do tipo exato de cada componente. Finalmente, durante o refinamento de suas especifica¸c˜oes, os conectores devem adequar o seu comportamento `a rigorosidade do m´etodo em rela¸c˜ao `as exce¸c˜oes arquiteturais. Essa rigorosidade, que foi definida na Se¸c˜ao 3.6.1 (ativ. 5.1.4), diz respeito tanto `as reconfigura¸c˜oes dos componentes do sistema, quanto `a execu¸c˜ao redundante de componentes.

Dessa forma, nos casos de reconfigura¸c˜ao, se houver mais de uma implementa¸c˜ao dispon´ıvel de algum componente, deve-se escolher a ordem de cada uma na reconfigura¸c˜ao. Al´em disso, a forma como os componentes poder˜ao ser reconfigurados pode variar de acordo com a classifica¸c˜ao da falha da exce¸c˜ao, definida na identifica¸c˜ao de exce¸c˜oes, durante a defini¸c˜ao dos requisitos do sistema (Se¸c˜ao 3.2.4). O m´etodo MDCE+ define dois tipos de reconfigura¸c˜ao: (i) permanente; e (ii) tempor´aria.

Nas reconfigura¸c˜oes permanentes, as r´eplicas assumem o lugar do componente fa- lho de forma definitiva, isto ´e, nas pr´oximas requisi¸c˜oes desse servi¸co, o conector chamar´a diretamente a ´ultima r´eplica que funcionou corretamente. J´a no caso de uma recon- figura¸c˜ao tempor´aria, as r´eplicas s´o desempenham o papel do componente principal durante uma execu¸c˜ao espec´ıfica. Dessa forma, nas pr´oximas requisi¸c˜oes, o conector con- fiar´a a execu¸c˜ao do servi¸co ao componente principal, independentemente dele ter falhado na tentativa anterior. As Figuras 3.30 e 3.31 mostram respectivamente os diagramas de seq¨uˆencia relativos aos dois tipos de reconfigura¸c˜ao.

Vale a pena ressaltar o fato de que mesmo que n˜ao exista mais de uma implementa¸c˜ao do componente dispon´ıvel, no caso de haver falhas com gravidade alta, o conector deve oferecer o tratamento arquitetural do sistema a partir da re-instancia¸c˜ao do componente seguida de uma nova tentativa de execu¸c˜ao27.

Outra observa¸c˜ao importante, do ponto de vista do refinamento da especifica¸c˜ao dos conectores ´e que no caso de sistemas com requisitos cr´ıticos de confiabilidade28, a especi-

fica¸c˜ao dos conectores deve prever a implementa¸c˜ao dos mecanismos de arbitragem, que

27

do inglˆes Re-try

28

3.9. Materializa¸c˜ao da Arquitetura Confi´avel Adotada 105