• Nenhum resultado encontrado

Uma exposição formal para a composição de frameworks

N/A
N/A
Protected

Academic year: 2021

Share "Uma exposição formal para a composição de frameworks"

Copied!
121
0
0

Texto

(1)

(2) 2.

(3) 3.

(4) 4.

(5) Sum´ ario 1 Introdu¸c˜ ao. 12. 2 Introdu¸c˜ ao a frameworks 2.1 Componentes de um framework . . . . . . . . . . . . . . . . . . 2.2 Tipos de frameworks . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Exemplos de frameworks . . . . . . . . . . . . . . . . . . . . . . 2.3.1 Java Collections Framework . . . . . . . . . . . . . . . . 2.3.2 Simple API for XML (SAX) . . . . . . . . . . . . . . . . 2.3.3 SalesPoint Framework . . . . . . . . . . . . . . . . . . . 2.4 Problemas da composi¸c˜ao de frameworks . . . . . . . . . . . . . 2.4.1 Composi¸c˜ao do fluxo de controle . . . . . . . . . . . . . . 2.4.2 Integra¸c˜ao com sistemas legado e ferramentas existentes . 2.4.3 Framework gap . . . . . . . . . . . . . . . . . . . . . . . 2.4.4 Sobreposi¸c˜ao de entidades dos frameworks . . . . . . . . 2.4.5 Integra¸c˜ao de funcionalidades de diferentes frameworks . 2.5 Considera¸c˜oes finais . . . . . . . . . . . . . . . . . . . . . . . . . 3 Vis˜ ao geral: CSP, Z e CSP-Z 3.1 CSP . . . . . . . . . . . . . . 3.1.1 Processos primitivos . 3.1.2 Prefixo . . . . . . . . . 3.1.3 Recurs˜ao . . . . . . . . 3.1.4 Composi¸c˜ao seq¨ uencial 3.1.5 Escolha . . . . . . . . 3.1.6 Paralelismo . . . . . . 3.1.7 Comunica¸c˜ao . . . . . 3.1.8 Traces . . . . . . . . . 3.1.9 Falhas . . . . . . . . . 3.1.10 Divergˆencias . . . . . . 3.2 Z . . . . . . . . . . . . . . . . 3.2.1 Free types . . . . . . . 3.2.2 Esquemas . . . . . . . 3.3 CSP-Z . . . . . . . . . . . . . 3.3.1 Exemplo ilustrativo . . 3.4 Considera¸c˜oes finais . . . . . .. . . . . . . . . . . . . . . . . . 5. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . .. 16 16 16 17 17 17 18 18 19 20 21 22 23 23. . . . . . . . . . . . . . . . . .. 25 25 25 26 26 26 27 28 28 29 30 31 31 31 32 34 34 36.

(6) ´ SUMARIO. 6. 4 A estrat´ egia de composi¸c˜ ao 4.1 Exemplo de composi¸c˜ao unidirecional . . . . . . . . . . . . . . . . . 4.1.1 Sobre os tipos de hot spots . . . . . . . . . . . . . . . . . . . 4.1.2 Valida¸c˜ao das caracter´ısticas dos frameworks originais . . . . 4.1.3 Identifica¸c˜ao dos pontos de composi¸c˜ao . . . . . . . . . . . . 4.1.4 Identifica¸c˜ao das seq¨ uˆencias de eventos . . . . . . . . . . . . 4.1.5 Passagens de parˆametros e mapeamentos de tipos . . . . . . 4.1.6 Composi¸c˜ao dos hot spots . . . . . . . . . . . . . . . . . . . 4.1.7 Especifica¸c˜ao do componente de sincroniza¸c˜ao e comunica¸c˜ao 4.1.8 A composi¸c˜ao dos frameworks . . . . . . . . . . . . . . . . . 4.1.9 Sobre a composi¸c˜ao das caracter´ısticas . . . . . . . . . . . . 4.2 Exemplo de composi¸c˜ao bidirecional . . . . . . . . . . . . . . . . . . 4.2.1 O framework CLIENTE . . . . . . . . . . . . . . . . . . . . 4.2.2 O framework GARCOM . . . . . . . . . . . . . . . . . . . . 4.2.3 Valida¸c˜ao das caracter´ısticas dos frameworks originais . . . . 4.2.4 Identifica¸c˜ao dos pontos de composi¸c˜ao . . . . . . . . . . . . 4.2.5 Casamento de eventos . . . . . . . . . . . . . . . . . . . . . 4.2.6 Passagens de parˆametros e mapeamentos de tipos . . . . . . 4.2.7 Especifica¸c˜ao do componente de sincroniza¸c˜ao e comunica¸c˜ao 4.2.8 A composi¸c˜ao dos frameworks . . . . . . . . . . . . . . . . . 4.3 Considera¸c˜oes finais . . . . . . . . . . . . . . . . . . . . . . . . . . .. 38 40 43 44 44 45 47 48 49 56 57 57 59 62 65 65 67 68 69 71 72. 5 Estudo de caso 5.1 Introdu¸c˜ao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Descri¸c˜ao do exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.1 O framework de persistˆencia de dados . . . . . . . . . . . . . 5.2.2 O framework de envio de mensagens . . . . . . . . . . . . . 5.2.3 Sobre as threads de execu¸c˜ao . . . . . . . . . . . . . . . . . 5.3 O passo-a-passo da composi¸c˜ao . . . . . . . . . . . . . . . . . . . . 5.3.1 Valida¸c˜ao das caracter´ısticas cl´assicas dos frameworks originais 5.3.2 Identifica¸c˜ao dos pontos de composi¸c˜ao . . . . . . . . . . . . 5.3.3 Identifica¸c˜ao das seq¨ uˆencias de eventos . . . . . . . . . . . . 5.3.4 Passagens de parˆametros e mapeamentos de tipos . . . . . . 5.3.5 Composi¸c˜ao de hot spots . . . . . . . . . . . . . . . . . . . . 5.3.6 Especifica¸c˜ao do componente de sincroniza¸c˜ao e comunica¸c˜ao 5.3.7 A composi¸c˜ao dos frameworks . . . . . . . . . . . . . . . . . 5.3.8 O refinamento dos frameworks envolvidos . . . . . . . . . . . 5.3.9 A composi¸c˜ao dos refinamentos . . . . . . . . . . . . . . . . 5.4 Considera¸c˜oes finais . . . . . . . . . . . . . . . . . . . . . . . . . . .. 73 73 73 74 79 81 81 81 82 84 84 85 86 88 88 91 91. 6 Conclus˜ ao 92 6.1 Trabalhos relacionados . . . . . . . . . . . . . . . . . . . . . . . . . 94 6.1.1 A Pi-Calculus based Framework for the Composition and Replacement of Components . . . . . . . . . . . . . . . . . . 94.

(7) ´ SUMARIO 6.1.2. 6.2. A channel-based coordination model for component composition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.3 OOD Frameworks in Component-based Software Development in Computational Logic . . . . . . . . . . . . . . . . 6.1.4 Composi¸c˜ao de Fluxo de Controle de Frameworks Java . . Trabalhos futuros . . . . . . . . . . . . . . . . . . . . . . . . . . .. 7. . 94 . 95 . 95 . 95. A Os frameworks do exemplo completo 97 A.1 O framework de persistˆencia de dados . . . . . . . . . . . . . . . . . 97 A.2 O framework de envio de mensagens . . . . . . . . . . . . . . . . . 112.

(8) Lista de Tabelas 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11. Caracter´ısticas originais de CLIENTE e SERVIDOR . . . . . . . Casamento de eventos do processamento CLIENTE - SERVIDOR Casamento de eventos da valida¸c˜ao CLIENTE - SERVIDOR . . . Eventos envolvidos em escolhas internas CLIENTE - SERVIDOR Caracter´ısticas originais do CLIENTE e do SERVIDOR . . . . . Tipos de dados do exemplo bidirecional . . . . . . . . . . . . . . . Caracter´ısticas originais do CLIENTE e do GARCOM . . . . . . Vers˜ao inicial do casamento CLIENTE - GARCOM . . . . . . . . Casamento GARCOM - CLIENTE . . . . . . . . . . . . . . . . . Casamento CLIENTE - GARCOM . . . . . . . . . . . . . . . . . Caracter´ısticas da composi¸c˜ao CLIENTE e do GARCOM . . . .. . . . . . . . . . . .. 44 47 47 49 57 59 65 67 68 68 72. 5.1 5.2 5.3 5.4 5.5 5.6. Casamentos do endere¸camento das mensagens . . . . . . . . Casamentos do armazenamento dos registros de envio . . . . Descri¸c˜ao dos mapeamentos do estudo de caso . . . . . . . . Eventos envolvidos em escolhas internas - estudo de caso . . Caracter´ısticas da composi¸c˜ao do estudo de caso . . . . . . . Caracter´ısticas da composi¸c˜ao dos refinamentos do estudo de. . . . . . .. 84 84 84 86 88 91. 8. . . . . . . . . . . . . . . . caso.

(9) Lista de Figuras 1.1. Vis˜ao geral da estrat´egia . . . . . . . . . . . . . . . . . . . . . . . . 13. 2.1. Adaptando a interface da classe Adaptee . . . . . . . . . . . . . . . 21. 4.1 4.2 4.3 4.4 4.5. Vis˜ao geral da estrat´egia . . . . . . . . . . . . . . . . . . . . . . . Vis˜ao geral da composi¸c˜ao . . . . . . . . . . . . . . . . . . . . . . Diagrama de seq¨ uˆencia - CLIENTE processando informa¸c˜oes. . . Diagrama de seq¨ uˆencia - SERVIDOR validando informa¸c˜oes e realizando processamento. . . . . . . . . . . . . . . . . . . . . . . . . Diagrama de seq¨ uˆencia - Intera¸c˜ao entre CLIENTE e GARCOM.. 5.1 5.2. A arquitetura de framework de persistˆencia de dados . . . . . . . . 74 A arquitetura do framework de envio de mensagens . . . . . . . . . 79. 9. . 38 . 39 . 41 . 42 . 58.

(10) Resumo O desenvolvimento de aplica¸c˜oes baseado em frameworks tem sido apontado como o pr´oximo passo em dire¸c˜ao a um maior reuso de software. O reuso atrav´es da composi¸c˜ao de dois frameworks, e n˜ao apenas atrav´es de extens˜oes de classes de um u ´nico framework, tornou-se uma necessidade gerada pelo aumento da complexidade de desenvolvimento de sistemas computacionais. Neste sentido, tornam-se necess´arias novas t´ecnicas de documenta¸c˜ao ou especifica¸c˜ao de frameworks que eliminem imprecis˜oes e ambig¨ uidades nas descri¸c˜oes dos seus comportamentos. Este trabalho apresenta uma estrat´egia de composi¸c˜ao de frameworks que utiliza linguagens de especifica¸c˜ao formal para descrever seus comportamentos e estruturas de dados. As linguagens utilizadas s˜ao CSP, Z e CSP-Z. Por tratar da composi¸c˜ao no n´ıvel das especifica¸c˜oes formais, a estrat´egia consegue abstrair detalhes de implementa¸c˜ao e eliminar restri¸c˜oes ligadas a estes detalhes. Al´em disso, a abordagem formal permite a verifica¸c˜ao, atrav´es do verificador de modelos de CSP, FDR, da manuten¸c˜ao das propriedades dos frameworks originais. O objetivo principal da estrat´egia ´e a composi¸c˜ao de fluxos de controle, que ´e um dos problemas mais comuns da composi¸c˜ao de frameworks. N´os apresentamos as causas e poss´ıveis solu¸c˜oes deste e dos demais problemas da composi¸c˜ao de frameworks. Por fim, mostramos que a estrat´egia aborda todos os problemas listados em menor ou maior grau. A estrat´egia pretende realizar a comunica¸c˜ao entre os frameworks atrav´es de um casamento entre os eventos e tipos de dados correspondentes dos dois frameworks. A composi¸c˜ao ´e realizada atrav´es de um terceiro componente, o componente de sincroniza¸c˜ao e comunica¸c˜ao (CSC ). A ado¸c˜ao deste componente possibilita maior flexibilidade `a composi¸c˜ao e, entre outros benef´ıcios, permite que os frameworks se comuniquem de forma anˆonima e elimina efeitos colaterais nos seus comportamentos. A estrat´egia tem todos os seus pontos especificados num n´ıvel de detalhe que facilitar´a uma futura mecaniza¸c˜ao. Neste sentido, s˜ao apresentados modelos para a especifica¸c˜ao do CSC e uma abordagem construtiva para a sua gera¸c˜ao. Palavras chave: Composi¸c˜ao de frameworks, estrat´egia, m´etodos formais, reuso de componentes.. 10.

(11) Summary Framework based development has been presented as the next step towards better software reuse. The increasing complexity of computer systems requires the level of reuse that framework composition can achieve. In this scenario, new framework documentation and specification techniques that can eliminate behavior ambiguities and imprecision are overdue. The strategy presented in this work uses formal languages to characterize the framework composition problem, abstracting from implementation details or technology. The languages involved are CSP, Z and CSP-Z. Furthermore, the approach allows the use of the CSP model checking tool (FDR) to verify the preservation of properties after the composition. The main goal of the strategy is to address control flow composition, which is one of the most common framework composition problems. Other composition problems are also discussed, as well as their common causes and possible solutions. Finally, we will demonstrate that the strategy addresses every kind of problem at some level. The strategy intends to communicate the frameworks by matching corresponding events and data types. The composition is performed through a third component, the communication and synchronization component (CSC ). This component provides the composition with great flexibility and abstraction, allowing the frameworks to communicate anonymously and eliminating collateral effects on their behavior. The strategy has been thoroughly detailed in order to allow future automation. For that, CSC specification templates and a constructive approach to its generation are presented. Key words: Framework composition, strategy, formal methods, component reuse.. 11.

(12) Cap´ıtulo 1 Introdu¸c˜ ao Reuso ´e um dos objetivos centrais da engenharia de software. O paradigma de orienta¸c˜ao-a-objetos representa um grande avan¸co neste sentido, permitindo a constru¸c˜ao de classes que encapsulam informa¸c˜oes e comportamentos, e que podem ser estendidas e usadas em diversas aplica¸c˜oes. Neste cen´ario, destacam-se dois tipos principais de reuso: reuso de projeto (design) e de implementa¸c˜ao. Inicialmente, buscava-se o reuso atrav´es da contru¸c˜ao de bibliotecas de rotinas de procedimentos. Posteriormente, o paradigma de orienta¸c˜ao-a-objetos tornou poss´ıvel a constru¸c˜ao de classes que podem ser reusadas em diversas aplica¸c˜oes. No entanto, estes esfor¸cos permitem basicamente o reuso de componentes individuais que seriam usados como pequenos blocos de novas aplica¸c˜oes. O problema real de reuso de componentes em larga escala, e que representam uma por¸c˜ao maior de um sistema, n˜ao ´e tratado pelo paradigma de orienta¸c˜ao a objetos por si s´o. Neste contexto, surgiram os Frameworks orientados-a-objetos, que s˜ao blocos de constru¸c˜ao muito maiores que objetos e classes [7]. Um framework pode ser definido como um conjunto de classes que incorporam um projeto abstrato para solucionar problemas de um determinado dom´ınio [17, 20, 21]. Eles fornecem a infra-estrutura b´asica para aplica¸c˜oes de um dom´ınio e permitem que os desenvolvedores se concentrem nas caracter´ısticas espec´ıficas da aplica¸c˜ao. Um framework ´e composto por um n´ ucleo, que define a sua estrutura e o seu comportamento (os tipos dos objetos, suas regras de intera¸c˜ao ...) e por pontos de extens˜ao (ou hot spots) que permitem que o framework se torne uma aplica¸c˜ao completa. Al´em da maior possibilidade de reuso em termos da por¸c˜ao das aplica¸c˜oes representadas por eles, os frameworks possibilitam reuso tanto de design quanto de implementa¸c˜ao. Esta ´e uma outra vantagen dos frameworks sobre outras formas de reuso como bibliotecas de classes, design patterns e componentes. A sinergia entre frameworks e as outras formas de reuso pode ser vista como outro fator importante e motivador do uso de frameworks. Com o aumento da complexidade de desenvolvimento de sistemas de computa¸c˜ao, solu¸c˜oes de um determinado dom´ınio de aplica¸c˜ao requerem o uso de mais de um framework [8]. Este trabalho foca no reuso de frameworks atrav´es da sua composi¸c˜ao. Um dos requisitos necess´arios para o reuso de frameworks 12.

(13) ˜ CAP´ITULO 1. INTRODUC ¸ AO. 13. ´e o total conhecimento de seus comportamentos. Os m´etodos de documenta¸c˜ao usualmente adotados (por exemplo, UML) envolvem grande quantidade de texto, imagens e diagramas mas s˜ao normalmente imprecisos e amb´ıguos. A ado¸c˜ao de linguagens de especifica¸c˜ao formal para descrever o comportamento dos frameworks elimina estas imprecis˜oes e ambig¨ uidades, al´em de possibilitar uma an´alise semˆantica, abstraindo detalhes de implementa¸c˜ao. Em geral, a descri¸c˜ao de um framework envolve aspectos de controle (comportamentais) que capturam funcionalidades. Complementarmente, s˜ao utilizadas estruturas de dados para representar as entidades manipuladas pelo framework. Portanto, ´e importante que a linguagem de especifica¸c˜ao utilizada para formalizar a composi¸c˜ao de frameworks ofere¸ca facilidades de controle e de dados. Uma tendˆencia na literatura recente, na ´area de m´etodos formais, ´e precisa´ mente a integra¸c˜ao de formalismos. Algebras de processos (que oferecem um repert´orio rico para exepressar comportamento), como CSP [16], tˆem sido combinadas com linguagens que focam mais em tipos abstratos de dados, como Z [33, 31]. Um exemplo de integra¸c˜ao ´e a linguagem CSP-Z [22] que integra o comportamento especificado por processos CSP com estruturas de dados especificadas atrav´es de esquemas Z, usada neste trabalho. Outros exemplos s˜ao LOTOS [32], Temporal Logic e CSP [34] e CSP-OZ [13, 15]. N´os usaremos a parte CSP das especifica¸c˜oes CSP-Z para especificar o fluxo de controle dos frameworks e a parte Z para representar as estruturas de dados. A grosso modo, a id´eia de composi¸c˜ao de frameworks ´e apresentada na Figura 1.1. Partindo das especifica¸c˜oes em CSP-Z [12] de cada um dos frameworks (SPEC F1 e SPEC F2 ), verificamos, inicialmente, as suas caracter´ısticas cl´assicas usando a ferramenta FDR [9]. O objetivo central ´e, ent˜ao, compor (representado na figura por •) as suas especifica¸c˜oes preservando as caracter´ısticas e sem gerar qualquer efeito colateral nos seus comportamentos. Adicionalmente, se verificarmos que as instˆancias dos frameworks (INST F1 e INST F2 ) s˜ao realmente v´alidas, atrav´es da verifica¸c˜ao do refinamento entre as instˆancias e os frameworks originais, podemos efetuar tamb´em a composi¸c˜ao das instˆancias assegurando que esta preserva todas as propriedades da composi¸c˜ao dos frameworks. A no¸c˜ao de refinamento adotada ´e a de Failures Divergences de CSP [16], que captura tanto traces, como as falhas (deadlock ) e divergˆencias (livelock ).. Figura 1.1: Vis˜ao geral da estrat´egia Uma das maiores dificuldades enfrentadas na composi¸c˜ao de frameworks ´e o fato de os frameworks serem desenvolvidos para a instancia¸c˜ao por extens˜ao e n˜ao por composi¸c˜ao. A instancia¸c˜ao por extens˜ao se baseia na extens˜ao das classes do framework que representam os seus hot spots. A instancia¸c˜ao por composi¸c˜ao se.

(14) ˜ CAP´ITULO 1. INTRODUC ¸ AO. 14. baseia na integra¸c˜ao ao framework de componentes (ou frameworks) que respeitem as suas regras. O comportamento coeso de frameworks desenvolvidos para instancia¸c˜ao por extens˜ao torna dif´ıcil a integra¸c˜ao destes novos componentes. Como observado em [8, 7], a composi¸c˜ao de frameworks pode gerar efeitos colaterais indesej´aveis, como os problemas de composi¸c˜ao do fluxo de controle, integra¸c˜ao com sistemas legado, framework GAP, sobreposi¸c˜ao de entidades e integra¸c˜ao de funcionalidades de diferentes frameworks. O foco deste trabalho ´e a composi¸c˜ao de fluxos de controle. A estrat´egia realiza a composi¸c˜ao atrav´es de um terceiro componente respons´avel pela comunica¸c˜ao entre os dois frameworks compostos e entre cada um deles e o ambiente. A ado¸c˜ao deste componente possibilita maior flexibilidade `a composi¸c˜ao, permite que os frameworks se comuniquem de forma anˆonima e evita efeitos colaterais nos comportamentos dos frameworks ap´os a composi¸c˜ao. A forma de comunica¸c˜ao adota ´e a sincroniza¸c˜ao de eventos de CSP. Apesar do foco em composi¸c˜ao de frameworks, a estrat´egia pode ser utilizada em desenvolvimento baseado em componentes, conforme ser´a descrito em mais detalhes posteriormente. Existem duas caracter´ısticas dos frameworks que precisam ser levadas em considera¸c˜ao quando desejamos realizar a composi¸c˜ao: os fluxos de controle e os tipos de dados utilizados. Os dados manipulados por um dos frameworks devem ser entendidos pelo outro e as seq¨ uˆencias de eventos (ou chamadas de m´etodos) dos dois frameworks n˜ao devem ser conflitantes. A nossa estrat´egia prop˜oe solu¸c˜oes para ambos os problemas, possibilitando um mapeamento de eventos e dados dos frameworks a serem compostos. Outros trabalhos tratam de reuso atrav´es de composi¸c˜ao de frameworks. Os trabalhos reportados em [7, 21, 20], por exemplo, analisam os problemas de composi¸c˜ao de frameworks, suas causas e poss´ıveis solu¸c˜oes. Uma lista destes problemas, causas e solu¸c˜oes s˜ao apresentadas no Cap´ıtulo 2. O trabalho reportado em [8, 24] analisa o problema da composi¸c˜ao de fluxos de controle de frameworks constru´ıdos em Java e que se comunicam atrav´es de troca de mensagens. Al´em disso, o trabalho apresenta uma ferramenta que verifica, a partir do c´odigo dos frameworks e da forma de composi¸c˜ao desejada, os tipos de problemas que podem ocorrer, onde eles podem ocorrer e sugere uma poss´ıvel solu¸c˜ao para cada problema. O trabalho reportado em [19] salienta a importˆancia dos seguintes requisitos do processo de integra¸c˜ao de componentes: a independˆencia do processo em rela¸c˜ao aos componentes sendo compostos e a flexibilidade da reconfigura¸c˜ao da composi¸c˜ao. Por flexibilidade de reconfigura¸cao, entenda-se a inser¸c˜ao de novos componentes sem afetar os componentes j´a existentes. A nossa estrat´egia pretende atender a estes requisitos atrav´es da ado¸c˜ao do componente respons´avel pela composi¸c˜ao. Foram analisados tamb´em trabalhos que prop˜oem a aplica¸c˜ao de m´etodos formais para solucionar problemas de composi¸c˜ao de componentes. O trabalho reportado em [25] formalisa a composi¸c˜ao de componentes atrav´es da defini¸c˜ao de um protocolo para compatibiliza¸c˜ao de conectores, estabelecimento de conex˜oes,.

(15) ˜ CAP´ITULO 1. INTRODUC ¸ AO. 15. invoca¸c˜ao de servi¸cos, respostas e a posterior substitui¸c˜ao de componentes. Este trabalho utiliza os conceitos de pi -Calculus. Outro trabalho, reportado em [18], faz uma tentativa preliminar de obten¸c˜ao de uma semˆantica formal para frameworks orientados a objetos. Esse trabalho aponta o uso de frameworks como o pr´oximo passo (ap´os o foco em classes e objetos) em dire¸c˜ao a um maior reuso de software. A abordagem assumida se baseia num formalismo em trˆes camadas: frameworks de especifica¸c˜oes (os tipos tratados pelo framework), especifica¸c˜oes definidas no contexto do framework de especifica¸c˜oes (o framework propriamente dito) e programas corretos (que refinam a especifica¸c˜ao). O trabalho chega `a conclus˜ao que existem dois n´ıveis de reuso: reuso de frameworks, baseado em m´etodos cl´assicos de heran¸ca envolvendo as restri¸c˜oes das especifica¸c˜oes; e reuso de especifica¸c˜oes e programas, baseado nos meios, a partir de programas corretos, de como compˆo-los para se chegar a novos programas corretos. O trabalho reportado em [4] apresenta um paradigma chamado Pω (“rheoh”) para composi¸c˜ao de componentes de software baseado na no¸c˜ao de canais m´oveis. Os operadores de Pω s˜ao utilizados para compor componentes a partir de componentes menores. No entanto, o modelo apresentado n˜ao se preocupa com detalhes das entidades compostas. Uma compara¸c˜ao mais detalhada da nossa proposta com os trabalhos mencionados ´e apresentada no Cap´ıtulo 6. O restante deste trabalho est´a estruturado da seguinte forma. O Cap´ıtulo 2 apresenta uma vis˜ao geral de frameworks e dos problemas de composi¸c˜ao de frameworks. O Cap´ıtulo 3 apresenta as linguagens formais utilizadas, seus operadores mais relevantes para o nosso trabalho e descreve brevemente como alguns deles s˜ao usados na especifica¸c˜ao de frameworks. O Cap´ıtulo 4 apresenta a estrat´egia atrav´es de dois exemplos simples e descreve em mais detalhes as abordagens adotadas para especificar os hot spots dos frameworks. No Cap´ıtulo 5, n´os apresentamos um estudo de caso e, por fim, apresentamos as conclus˜oes, compara¸c˜oes com outros trabalhos e trabalhos futuros no Capitulo 6..

(16) Cap´ıtulo 2 Introdu¸c˜ ao a frameworks Um framework pode ser definido como um conjunto de classes que incorporam um design abstrato para solucionar problemas de um determinado dom´ınio. Al´em de possibilitar o reuso de design e implementa¸c˜ao, os frameworks fornecem a infra-estrutura b´asica para aplica¸c˜oes em um determinado dom´ınio e permitem que os desenvolvedores se concentrem nas caracter´ısticas espec´ıficas da aplica¸c˜ao. Aplica¸c˜oes desenvolvidas a partir de um framework s˜ao chamadas de instˆancias do framework.. 2.1. Componentes de um framework. Um framework ´e composto de um n´ ucleo e de pontos de extens˜ao (hot spots). O n´ ucleo do framework ´e composto de classes concretas e abstratas. As classes concretas s˜ao projetadas para serem invis´ıveis para o usu´ario do framework. As classes abstratas podem tanto ser invis´ıveis quanto vis´ıveis para que elas possam ser estendidas pelo usu´ario do framework. O u ´ltimo caso de classes abstratas representam os hot spots do framework [7]. O n´ ucleo define a estrutura e o comportamento (ou fluxo de controle) do framework, os tipos dos objetos e as regras de como eles interagem [17]. Aplica¸c˜oes desenvolvidas baseadas em um ou mais frameworks devem respeitar a estrutura e as regras definidas pelo(s) framework(s). Os hot spots s˜ao os pontos de extens˜ao de um framework. Eles permitem que, quando instanciado, o framework se torne uma aplica¸c˜ao completa. Os hot spots constituem o c´odigo espec´ıfico da aplica¸c˜ao.. 2.2. Tipos de frameworks. Os frameworks podem ser divididos em duas categorias, de acordo com o tipo de reutiliza¸c˜ao (ou instancia¸c˜ao) permitido: frameworks caixa-branca e frameworks caixa-preta [7]. Frameworks caixa-branca s˜ao os que permitem instancia¸c˜ao atrav´es da extens˜ao de suas classes. O termo caixa-branca ´e usado para denotar visibilidade. Por causa 16.

(17) ˜ A FRAMEWORKS CAP´ITULO 2. INTRODUC ¸ AO. 17. da heran¸ca, alguns membros das classes do framework ficam vis´ıveis para as classes espec´ıficas da aplica¸c˜ao. N˜ao existe uma linha bem definida que separe frameworks caixa-branca e uma simples hierarquia de classes. Potencialmente, toda hierarquia de classes pode se tornar um framework caixa-branca. Frameworks caixa-preta ou parametrizados s˜ao os que se baseiam em instancia¸c˜ao por composi¸c˜ao. A extens˜ao de frameworks por composi¸c˜ao ´e obtida atrav´es da defini¸c˜ao de classes que seguem as regras do framework (i.e. implementam as interfaces definidas pelo framework) e pela integra¸c˜ao dessas classes ao framework. O comportamento do framework caixa-preta pode ser “customizado” atrav´es do uso de diferentes combina¸c˜oes de classes. A instancia¸c˜ao de frameworks por composi¸c˜ao tende a ser mais flex´ıvel que a instancia¸c˜ao por extens˜ao, pois a composi¸c˜ao pode ser alterada em tempo de execu¸c˜ao enquanto que estruturas hier´arquicas s˜ao fixadas em tempo de compila¸c˜ao, al´em de permitir o reuso de componentes j´a existentes. Este trabalho trata de instancia¸c˜ao por composi¸c˜ao. Outra vantagem da instancia¸c˜ao por composi¸c˜ao ´e a manuten¸c˜ao do encapsulamento das funcionalidades das classes do framework. Como os detalhes internos do framework n˜ao s˜ao expostos, a aplica¸c˜ao fica menos sens´ıvel a altera¸c˜oes internas do framework ([29]). Apesar da classifica¸c˜ao de frameworks em caixa-branca e caixa-preta, normalmente os frameworks s˜ao parametrizados em alguns pontos e “customizados” atrav´es de heran¸ca em outros.. 2.3. Exemplos de frameworks. O objetivo dessa se¸c˜ao ´e demonstrar a usabilidade pr´atica de frameworks atrav´es de alguns exemplos reais.. 2.3.1. Java Collections Framework. O Java Collections Framework ´e um framework que provˆe um conjunto bem definido de classes e interfaces que permitem o armazenamento e a manipula¸c˜ao cole¸c˜oes ([1]). O framework possui representa¸c˜oes para v´arios dos tipos de estruturas de dados como mapas, conjuntos, listas, ´arvores, tabelas e outras cole¸c˜oes. Al´em disso, o desenvolvedor pode implementar as interfaces do framework para criar as suas pr´oprias representa¸c˜oes.. 2.3.2. Simple API for XML (SAX). Normalmente, SAX ([3, 5, 27, 30]) n˜ao ´e apresentado como um framework mas como uma API (Simple API for XML). N´os argumentamos que SAX tem um fluxo de controle bem definido (n´ ucleo) e que este fluxo faz chamadas a classes.

(18) ˜ A FRAMEWORKS CAP´ITULO 2. INTRODUC ¸ AO. 18. desenvolvidas pelo usu´ario que representam as implementa¸c˜oes dos hot spots de SAX. SAX representa um mecanismo, orientado a eventos, de tratamento (parsing) de arquivos XML. Durante o processamento, `a medida que o parser SAX identifica um elemento (por exemplo, o in´ıcio ou o fim de uma tag ou de um dos seus atributos), ele invoca o tratador do evento de elemento. O tratador de eventos, que deve implementar uma das interfaces definidas pelo framework, representa o c´odigo espec´ıfico da aplica¸c˜ao e deve ser criado pelo desenvolvedor.. 2.3.3. SalesPoint Framework. O SalesPoint ´e um framework usado para criar simula¸c˜oes de aplica¸c˜oes de pontode-venda ([2]). Um ponto-de-venta pode ser um simples m´aquina de refrigerantes ou um complexo supermercado com v´arios departamentos. Tipicamente, uma aplica¸c˜ao SalesPoint ´e composta de uma loja (representada pela classe Shop), onde clientes (classe Customer ) s˜ao atendidos em um determinado n´ umero de caixas ou pontos-de-venda (classe Counter ). Os clientes possuem cestas (classe DataBasket) que contˆem os itens selecionados por eles. Estes itens s˜ao pagos ou cancelados no caixa. Os hot spots do framework permitem: • A adapta¸c˜ao das classes de dados (por exemplo, a classe DataBasket); • A implementa¸c˜ao da funcionalidade da aplica¸c˜ao atrav´es do SalesPoint Process Model ; • A cria¸c˜ao de um visual conveniente para os dados e processos adaptados (atrav´es dos v´arios componentes prontos do framework).. 2.4. Problemas da composi¸ c˜ ao de frameworks. Tradicionalmente, o desenvolvimento baseado em frameworks baseia-se no reuso de um u ´nico framework atrav´es da extens˜ao de suas classes. Recentemente, como j´a mencionado do Cap´ıtulo 1, o aumento da complexidade das aplica¸c˜oes tornou necess´ario o uso de mais de um framework na implementa¸c˜ao das solu¸c˜oes de um determinado dom´ınio. O processo de composi¸c˜ao de frameworks pode causar diversos problemas. Estes problemas s˜ao, normalmente, causados por que os framework s˜ao contru´ıdos de acordo com a perspectiva tradicional, assumindo que o framework estar´a no controle do fluxo principal da aplica¸c˜ao, que ele ser´a instanciado por extens˜ao (e n˜ao por composi¸c˜ao) e que outros componentes n˜ao ser˜ao inseridos [21]. A seguir descrevemos brevemente alguns dos problemas mais comuns da composi¸c˜ao de frameworks..

(19) ˜ A FRAMEWORKS CAP´ITULO 2. INTRODUC ¸ AO. 2.4.1. 19. Composi¸ c˜ ao do fluxo de controle. Trabalhos reportados em [24, 20] e [21] apresentam descri¸c˜oes de algumas formas de composi¸c˜ao de frameworks, assim como uma lista de tipos de problemas que podem surgir da composi¸c˜ao. Antes de descrever o problema da composi¸c˜ao de frameworks, vamos introduzir as formas de composi¸c˜ao. • Sem comunica¸c˜ao ´ a forma mais simples de composi¸c˜ao. Ocorre quando os dois frameworks E funcionam de forma concorrente e sem compartilhamento de recursos. • Seq¨ uencial Nesta forma de composi¸c˜ao, temos a execu¸c˜ao completa de um dos frameworks seguida da execu¸c˜ao completa do outro. A inicializa¸c˜ao do segundo framework ´e feita pelo primeiro ao t´ermino da sua execu¸c˜ao. • Unidirecional Nesta forma de composi¸c˜ao, apenas um framework chama o outro, sendo que essas chamadas podem ou n˜ao ter retorno e/ou parˆametros. • Bidirecional ´ a forma mais complexa de composi¸c˜ao, nela ambos os frameworks fazem E chamadas ao outro. Vale a pena voltar a afirmar que as chamadas podem ser com ou sem parˆametros e/ou retorno. Descri¸ c˜ ao do problema Uma das principais caracter´ısticas dos frameworks ´e o uso extensivo de vincula¸c˜ao dinˆamica de tipos (dynamic-binding). Isso n˜ao deveria ser nenhuma surpresa neste ponto, j´a que sabemos que um framework ´e composto de classes abstratas e concretas e que ele define a intera¸c˜ao entre instˆancias de suas classes concretas e/ou de especializa¸c˜oes das suas classes. A defini¸c˜ao do tipo do objeto pode ser feita em tempo de execu¸c˜ao. Normalmente, o framework possui uma thread de controle u ´nica que faz chamadas ao c´odigo espec´ıfico da aplica¸c˜ao sempre que for necess´ario. Este comportamento ´e freq¨ uentemente chamado de “O Princ´ıpio de Hollywood” (“don´t call us, we´ll call you”). Quando mais de um framework chama o c´odigo da aplica¸c˜ao simultaneamente, cada um esperando estar no controle do fluxo principal da aplica¸c˜ao (no nosso caso, da composi¸c˜ao), ocorre um problema chamado de “invers˜ao do fluxo de controle”. Poss´ıveis solu¸c˜ oes A solu¸ca˜o do problema da composi¸c˜ao do fluxo de controle (ou invers˜ao do fluxo de controle) ir´a, indubitavelmente, requerer a adapta¸c˜ao dos fluxos dos frameworks envolvidos. Existem trˆes t´ecnicas para a adapta¸c˜ao dos frameworks envolvidos:.

(20) ˜ A FRAMEWORKS CAP´ITULO 2. INTRODUC ¸ AO. 20. • Concorrˆencia Cada um dos frameworks envolvidos pode ter um fluxo de controle independente, concorrente com os outros. Essa abordagem s´o pode ser usada nos casos onde n˜ao h´a a necessidade de comunica¸c˜ao (notifica¸c˜ao) entre os frameworks. Uma desvantagem da abordagem ´e que todas os objetos espec´ıficos da aplica¸c˜ao que podem ser acessados por ambos os frameworks devem ser extendidos com c´odigo de sincroniza¸c˜ao. A vantagem da abordagem ´e a n˜ao necessidade de acesso ao c´odigo fonte dos frameworks. • Encapsulamento Essa t´ecnica consiste em criar wrappers dos componentes (classes que encaplusam os componentes) dos frameworks envolvidos. Os wrappers interceptariam todas as mensagens enviadas de e para os frameworks e delegariam as a¸c˜oes para os frameworks ([29]). A vantagem da t´ecnica ´e que ela permite que os componentes originais dos frameworks permane¸cam inalterados. A desvantagem ´e a impossibilidade do tratamento dos eventos internos dos frameworks, apenas eventos externos aos frameworks podem ser tratados ou interceptados. • Reescrita de c´odigo Se a integra¸c˜ao de todos os eventos (internos e externos) dos frameworks for necess´aria, a solu¸c˜ao ser´a remover as partes relevantes dos fluxos de controle dos frameworks e substitu´ı-las com c´odigo espec´ıfico da aplica¸c˜ao. A distribui¸c˜ao do fluxo de controle entre os componentes do framework (comportamento coesivo) e a falta de acesso ao c´odigo fonte s˜ao fatores que podem dificultar ou inviabilizar a solu¸c˜ao.. 2.4.2. Integra¸ c˜ ao com sistemas legado e ferramentas existentes. Descri¸ c˜ ao do problema Idealmente, frameworks cont´em apenas funcionalidades gen´ericas para o seu dom´ınio ´ comum surgir a necessidade de reuso de componentes prontos esde aplica¸c˜ao. E pec´ıficos da aplica¸c˜ao a ser desenvolvida. A integra¸c˜ao desses componentes ao framework nem sempre ´e uma tarefa trivial, pois o comportamento coesivo do framework pode dificultar a substitui¸c˜ao de suas classes. Outro fator complicante ´e o fato dos frameworks se basearem em mecanismos de instancia¸c˜ao por heran¸ca e n˜ao por composi¸c˜ao..

(21) ˜ A FRAMEWORKS CAP´ITULO 2. INTRODUC ¸ AO. 21. Poss´ıveis solu¸c˜ oes • Adapter design pattern O Adapter Design Pattern ´e um dos quatro patterns estruturais listados em [10]. Ele ´e muito usado em casos onde desejamos reusar uma classe mas a interface da aplica¸c˜ao n˜ao ´e compat´ıvel com a classe. O adapter ou wrapper ´e usado para converter a interface da aplica¸c˜ao para a interface esperada pela classe. O problema de integra¸c˜ao com sistemas legado ´e um exemplo t´ıpico de uso desse design pattern. A figura abaixo ilustra o funcionamento do pattern. No cen´ario, o Client deseja invocar o m´etodo request() da interface Target. Como a classe Adaptee n˜ao possui o m´etodo request(), ´e fun¸c˜ao do Adapter converter a chamada para uma chamada a um m´etodo equivalente do Adaptee ([6]).. Figura 2.1: Adaptando a interface da classe Adaptee A desvantagem da solu¸c˜ao ´e o overhead de implementa¸c˜ao, pois cada m´etodo do componente legado ir´a requerer c´odigo de adapta¸c˜ao. • Altera¸c˜ao do framework Essa solu¸c˜ao consiste da substitui¸c˜ao do c´odigo referente `a classe do framework por c´odigo que use o componente legado. Obviamente, a solu¸c˜ao ´e impossibilitada quando h´a falta de acesso ao c´odigo fonte.. 2.4.3. Framework gap. Descri¸ c˜ ao do problema Esse problema ocorre quando a composi¸c˜ao de dois ou mais frameworks n˜ao satisfaz todos os requisitos da aplica¸c˜ao..

(22) ˜ A FRAMEWORKS CAP´ITULO 2. INTRODUC ¸ AO. 22. Poss´ıveis solu¸c˜ oes • Encapsulamento Caso o framework composto (resultado da composi¸c˜ao) n˜ao assuma o controle do fluxo principal da aplica¸c˜ao, o problema pode ser resolvido atrav´es do seu encapsulamento e da complementa¸c˜ao das funcionalidades necess´arias da aplica¸c˜ao. A vantagem da solu¸c˜ao ´e a n˜ao necessidade de altera¸c˜ao do c´odigo do framework composto. • Software mediador Caso o framework composto assuma o controle do fluxo principal da aplica¸c˜ao, o problema s´o pode ser solucionado atrav´es da implementa¸c˜ao de c´odigo para notificar um framework dos eventos ocorridos no outro. Uma desvantagem clara da solu¸c˜ao ´e a dificuldade de implementa¸c˜ao, pois o c´odigo ter´a que gerenciar a intera¸c˜ao entre os framework al´em de prover a funcionalidade necess´aria para “fechar o gap”. Outra desvantagem ´e a vulnerabilidade do c´odigo mediador (e da aplica¸c˜ao) a evolu¸c˜oes dos frameworks. • Altera¸c˜ao do framework Quando existe a inten¸c˜ao de reusar o framework em outras aplica¸c˜oes, a solu¸c˜ao mais interessante ´e a altera¸c˜ao do c´odigo fonte para que o framework obtenha uma maior cobertura do dom´ınio da aplica¸c˜ao.. 2.4.4. Sobreposi¸ c˜ ao de entidades dos frameworks. Descri¸ c˜ ao do problema Esse problema ocorre quando dois ou mais frameworks possuem representa¸c˜oes para entidades do mundo real sob diferentes perspectivas. Isso pode ocorrer quando ambos os frameworks englobam as mesmas partes do dom´ınio de aplica¸c˜ao. Poss´ıveis solu¸c˜ oes • Heran¸ca m´ ultipla Essa solu¸c˜ao s´o pode ser aplicada quando as representa¸c˜oes s˜ao mutuamente exclusivas. O ponto chave da solu¸c˜ao ´e suportar atualiza¸c˜oes e convers˜oes necess´arias entre os diferentes frameworks. • Agrega¸c˜ao A solu¸c˜ao consiste da cria¸c˜ao de uma classe que contenha ambas as representa¸c˜oes como suas partes. Essa nova classe seria a representa¸c˜ao agregada da entidade na aplica¸c˜ao..

(23) ˜ A FRAMEWORKS CAP´ITULO 2. INTRODUC ¸ AO. 23. Al´em do acesso ao c´odigo fonte de ambos os frameworks, a solu¸c˜ao requer a substitui¸c˜ao de todas as referˆencias `a representa¸c˜ao original pela representa¸c˜ao agregada. As maiores desvantagens dessa solu¸c˜ao s˜ao a necessidade de acesso e altera¸c˜ao do c´odigo fonte de ambos os frameworks. Vale notar que a terminologia utilizada nesta se¸c˜ao faz referˆencia a classes, e n˜ao a frameworks especificamente, pois as classes dos frameworks s˜ao utilizadas para representar as entidades do mundo real.. 2.4.5. Integra¸ c˜ ao de funcionalidades de diferentes frameworks. Descri¸ c˜ ao do problema Esse problema ocorre quando um componente tem que ser modelado a partir de funcionalidades de diferentes frameworks. Um exemplo t´ıpico ´e a integra¸c˜ao entre os frameworks das camadas de interface gr´afica (GUI), regra de neg´ocio e persistˆencia de um software estruturado em camadas. A integra¸c˜ao das respectivas classes dos diferentes frameworks atrav´es de heran¸ca m´ ultipla ou agrega¸c˜ao n˜ao ´e suficiente para a resolu¸c˜ao do problema pois, por exemplo, mudan¸cas feitas em uma entidade na camada de regra de neg´ocio podem refletir atualiza¸c˜oes na representa¸c˜ao da entidade na interface gr´afica e na camada de persistˆencia. Poss´ıveis solu¸c˜ oes • Agrega¸c˜ao ou heran¸ca m´ ultipla ´ a solu¸c˜ao mais simples para o problema. Seu u E ´nico problema ´e que as altera¸c˜oes do estado de uma entidade em um dos frameworks n˜ao ir˜ao influenciar as partes de sua representa¸c˜ao nos outros frameworks. Torna-se necess´ario ent˜ao a extens˜ao da funcionalidade dos frameworks para que altera¸c˜oes feitas neles causem notifica¸c˜oes nos outros. • Observer design pattern A complementa¸c˜ao da solu¸c˜ao acima pode ser obtida atrav´es da extens˜ao do comportamento dos frameworks com comportamento de notifica¸c˜ao, atrav´es do design pattern Observer.. 2.5. Considera¸c˜ oes finais. A composi¸c˜ao de frameworks, no projeto e implementa¸c˜ao de aplica¸c˜oes, oferece grande potencial para reuso e extensibilidade em larga escala. Entretanto, estudos na literatura mostram que compor frameworks pode resultar em efeitos colaterais.

(24) ˜ A FRAMEWORKS CAP´ITULO 2. INTRODUC ¸ AO. 24. inesperados. A seguir apresentamos uma compara¸c˜ao entre frameworks e outras formas de reuso. • Frameworks X Bibliotecas de classe O escopo de reutiliza¸c˜ao e o gerenciamento do fluxo de controle s˜ao os principais pontos de distin¸c˜ao entre frameworks e bibliotecas de classes. Enquanto frameworks definem aplica¸c˜oes incompletas para um determinado dom´ınio, bibliotecas de classes apresentam solu¸c˜oes de uso mais geral, menos espec´ıficas de dom´ınio e de maior escopo de reutiliza¸c˜ao. Frameworks podem gerenciar o fluxo de controle dentro da aplica¸c˜ao enquanto que bibliotecas de classes s˜ao tipicamente passivas, ou seja, n˜ao influenciam diretamente no fluxo de controle da aplica¸c˜ao. • Frameworks X Design Patterns Enquanto frameworks focam a reutiliza¸c˜ao de designs concretos, algoritmos e implementa¸c˜oes em uma linguagem de programa¸c˜ao particular, os design patterns focam a reutiliza¸c˜ao de designs abstratos e micro-arquiteturas de software. A combina¸c˜ao de frameworks e design patterns tende a ser muito sin´ergica, mais de um design pattern pode ser utilizado em um framework. • Frameworks X Componentes Componentes s˜ao entidades caixa-preta que definem opera¸c˜oes coesivas e que, para serem reutilizados, basta que se tenha conhecimento da sintaxe e da semˆantica de sua interface. O fato de os componentes serem bastante coesos constitui um fator de distin¸c˜ao entre eles e frameworks, uma vez que a coes˜ao entre as classes de um framework deve ser mantida em n´ıveis gerenci´aveis se o framework for implementado para permitir reuso por composi¸c˜ao. Assim como acontece com os design patterns, a combina¸c˜ao de frameworks e componentes tende a ser altamente sin´ergica e v´arios componentes podem ser utilizados em um framework. Neste cap´ıtulo, n´os apresentamos brevemente o que s˜ao frameworks e quais os problemas que podem ocorrer durante a sua composi¸c˜ao. Nos pr´oximos cap´ıtulos n´os abordaremos o problema da composi¸c˜ao de fluxos de controle de especifica¸c˜oes CSP-Z de frameworks..

(25) Cap´ıtulo 3 Vis˜ ao geral: CSP, Z e CSP-Z Uma das formas de melhorar a qualidade dos sistemas ´e melhorar a forma na qual eles s˜ao documentados desde os requisitos at´e a implanta¸c˜ao. Componentes interagem de formas n˜ao esperadas e ocorrem interferˆencias nos seus comportamentos, possivelmente gerando propriedades indesej´aveis. Os m´etodos de documenta¸c˜ao usualmente adotados envolvem grande quantidade de texto, imagens e diagramas, mas s˜ao normalmente imprecisos e ambiguos. Detalhes importantes podem ser ocultados por informa¸c˜oes irrelevantes, fazendo com que falhas de projeto sejam descobertas tarde demais. Linguagens de especifica¸c˜ao formal baseadas em matem´atica elementar, por outro lado, podem ser usadas para produzir uma documenta¸c˜ao precisa na qual a informa¸c˜ao ´e apresentada de forma estruturada e em um n´ıvel apropriado de abstra¸c˜ao. O objetivo deste cap´ıtulo ´e introduzir as linguagens usadas no nosso trabalho e apresentar os seus operadores e caracter´ısticas mais relevantes.. 3.1. CSP. CSP [16] usa eventos para definir os padr˜oes de comportamento de objetos do mundo real (processos). Primeiramente, devemos definir quais eventos s˜ao relevantes no comportamento do processo, e cada evento deve ser identificado com um nome u ´nico. Cada evento escolhido e nomeado representa um tipo de evento e pode haver v´arias ocorrˆencias do mesmo tipo de evento no comportamento de um determinado processo. O conjunto dos tipos de eventos relevantes de um processo ´e chamado de alfabeto. A ocorrˆencia de um evento no comportamento de um processo ´e considerada instantˆanea ou atˆomica. A¸c˜oes extensas ou que consomem tempo devem ser representadas por um par de eventos, o primeiro representando o seu in´ıcio e o segundo, o seu fim.. 3.1.1. Processos primitivos. CSP possui trˆes processos primitivos que descrevemos a seguir. 25.

(26) ˜ GERAL: CSP, Z E CSP-Z CAP´ITULO 3. VISAO. 26. • Stop - representa um processo em estado de deadlock (paraliza¸c˜ao), que n˜ao aceita evento algum; • Skip - representa um processo que finalizou sua execu¸c˜ao com sucesso; • DIV - representa um processo em estado de livelock.. 3.1.2. Prefixo. Seja x um evento e P um processo, ent˜ao (x → P ) descreve o processo que inicialmente aceita o evento x e depois passa a se comportar como o processo P.. 3.1.3. Recurs˜ ao. O operador prefixo pode ser usado para descrever o comportamento de qualquer processo finito, embora isto possa se tornar praticamente invi´avel para processos que apresentam ciclos repetitivos. Surge, ent˜ao, a necessidade de descrevermos processos repetitivos com uma nota¸c˜ao mais pr´atica ou compacta. Consideremos o processo infinito que representa um rel´ogio cujo u ´nico evento de interesse seja o tick. (tick → CLOCK ) O comportamente de CLOCK ´e a repeti¸c˜ao indefinida de tick, o que pode ser represemtado pela equa¸c˜ao: CLOCK = (tick → CLOCK ) Uma alternativa para definir recurs˜ao ´e atrav´es do operador µ. O processo CLOCK pode ser equivalentemente definido como CLOCK = µ X • tick → X. 3.1.4. Composi¸ c˜ ao seq¨ uencial. O operador de composi¸c˜ao seq¨ uencial permite que um processo seja inicializado ap´os o t´ermino da execu¸c˜ao de um outro processo. Diferente do operador de prefixo, que permite a passagem de parˆametros entre eventos consecutivos, o operador de composi¸c˜ao seq¨ uencial n˜ao permite a extens˜ao o escopo das vari´aveis do primeiro processo at´e o segundo. Um processo P que inicialmente se comporta como um processo A e depois passa a se comportar como um processo B pode ser especificado da seguinte forma: P = A; B.

(27) ˜ GERAL: CSP, Z E CSP-Z CAP´ITULO 3. VISAO. 27. O operador de composi¸c˜ao seq¨ uencial tamb´em pode ser usado para especificar processos recursivos. A seguir apresentamos o processo recursivo R que executa uma s´erie de eventos e depois volta ao seu estado inicial. R = (e1 → e2 → Skip); R Este processo equivale a R = (e1 → e2 → R). 3.1.5. Escolha. Atrav´es do uso de prefixos e recurs˜oes ´e poss´ıvel descrever o comportamento de processos com uma sequˆencia u ´nica de eventos. Por´em, usualmente ´e necess´ario representar processos que tˆem seus comportamentos (ou suas seq¨ uˆencias de eventos) influenciados por fatores externos. O processo abaixo, por exemplo, aceita inicialmente um dos eventos a ou b e depois passa a se comportar como A, quando o evento ocorrido for a, ou B , quando o evento ocorrido for b. (a → A) | (b → B ) O operador | ´e o operador de escolha. A escolha entre os poss´ıveis comportamentos do processo acima depende do ambiente; dizemos que tal escolha ´e determin´ıstica. Existem processos com mais de uma possibilidade de comportamento e cuja sele¸c˜ao entre os comportamentos (ou seq¨ uˆencias de eventos) n˜ao sofre qualquer influˆencia do ambiente e talvez at´e nem seja observ´avel pelo ambiente. Estes processos s˜ao chamados de n˜ao-determin´ısticos. Sejam P e Q dois processos, ent˜ao P uQ denota o processo que pode se comportar como P ou Q, arbitrariamente. O operador u (escolha interna) nos permite manter um alto n´ıvel de abstra¸c˜ao na descri¸c˜ao do comportamento dos processos. Apesar de n˜ao ser muito u ´til na implementa¸c˜ao, este operador ´e muito usado na especifica¸c˜ao de processos. Especifica¸c˜oes n˜ao determin´ısticas podem ser usadas para representar hot spots dos frameworks. Um hot spot especificado como o processo acima pode ser instanciado tanto atrav´es do processo P quanto atrav´es do processo Q. Existe um terceiro operador que permite que o ambiente controle a escolha entre as op¸c˜oes de comportamento, o operador de escolha externa 2. A escolha ´e feita na ocorrˆencia do primeiro evento de cada uma das op¸c˜oes de comportamento. No processo (P 2 Q) caso o primeiro evento n˜ao seja um poss´ıvel evento inicial de P , o processo ir´a se comportar como Q e vice-versa. Por´em, se o primeiro evento for um evento inicial.

(28) ˜ GERAL: CSP, Z E CSP-Z CAP´ITULO 3. VISAO. 28. de ambos os processos, a escolha entre eles ser´a n˜ao-determin´ıstica. Quando os conjuntos de eventos iniciais de P e Q forem disjuntos, o operador ´e equivalente ao primeiro operador apresentado |. Por exemplo, (a → P ) 2 (b → Q) = (a → P ) | (b → Q). 3.1.6. Paralelismo. Quando dois processos s˜ao postos em execu¸c˜ao concorrentemente, normalmente se deseja que eles interajam. As intera¸c˜oes podem ser vistas como eventos que ´ imrequerem a participa¸c˜ao (ou aceita¸c˜ao) simultˆanea de ambos os processos. E portante destacar que o ambiente tamb´em pode ser tratado como um processo, o que nos permite simular o comportamento de um processo em conjunto com o seu ambiente. Sejam P e Q processos com alfabetos iguais, ent˜ao P || Q ´e o processo que representa os processos P e Q com todos os seus eventos sincronizados. Se um dos eventos for aceito por apenas um dos processos, ele n˜ao poder´a ocorrer. Quando os alfabetos de P e Q n˜ao s˜ao iguais, cada um deles pode aceitar os eventos fora da interse¸c˜ao dos dois alfabetos independentemente. Uma outra vers˜ao do operador de paralelismo explicita os eventos nos quais os processos ir˜ao sincronizar. O processo P [| X |]Q sincroniza P e Q nos eventos X . Tanto P quanto Q podem interagir independentemente com o ambiente atrav´es de eventos que n˜ao perten¸cam a X . Uma outra varia¸c˜ao do operador de paralelismo, chamada de interleaving, permite unir processos concorrentes sem intera¸c˜ao ou sincroniza¸c˜ao entre eles. O comportamento do interleaving de dois processos ´e idˆentico ao paralelismo alfabetisado de dois processos, onde o conjunto de sincroniza¸c˜ao X ´e vazio. Cada evento oferecido ao interleaving de dois processos, ocorre apenas em um deles. Caso ambos estejam dispostos a aceitar o evento, a escolha entre os processos ´e n˜ao-determin´ıstica. Esse tipo de combina¸c˜ao ´e especificado da seguinte forma: P ||| Q N´os usaremos o operador ||| para especificar as poss´ıveis threads de um determinado processo, como por exemplo todas as threads de execu¸c˜ao de um servidor multi-thread, onde cada thread ter´a um identificador u ´nico.. 3.1.7. Comunica¸ c˜ ao. At´e agora n´os falamos de eventos apenas como um meio de caracterizar o comportamento e a sincroniza¸c˜ao dos processos. Entretanto, a sincroniza¸c˜ao n˜ao ´e o.

(29) ˜ GERAL: CSP, Z E CSP-Z CAP´ITULO 3. VISAO. 29. u ´nico tipo de intera¸c˜ao poss´ıvel. Pode surgir a necessidade de um processo passar para ou receber informa¸c˜oes de outros processos ou do ambiente. Em CSP, uma comunica¸c˜ao ´e descrita como um par c.v , onde c ´e o nome do canal e v ´e o valor da mensagem (ou o parˆametro) enviada pelo canal. Uma comunica¸c˜ao ´e um tipo de evento e pode ser tratrada como tal em todos os operadores e conceitos de CSP. Uma comunica¸c˜ao pode envolver um ou mais parˆametros. Existem parˆametros de entrada e de sa´ıda, comunicados ou recebidos pelo processo, respectivamente. Um processo que inicialmente comunica v pelo canal c e depois passa a se comportar como P ´e definido como c!v → P = c.v → P Um processo que inicialmente recebe o valor v pelo canal c ´e definido como c?v → P ´ uma conven¸c˜ao usar canais apenas para um tipo ou dire¸c˜ao de comunica¸c˜ao. E Nos exemplos vistos posteriormente, as comunica¸c˜oes que envolvam parˆametros de ida e de volta ser˜ao especificados com mais de um canal. Usaremos um processo apresentado em um dos exemplos do Cap´ıtulo 4 como exemplo mais completo de um processo CSP. O processo recursivo CLIENTE apresenta canais que recebem parˆametros do ambiente (precedidos por “?”) e canais que recebem parˆametros de eventos anteriores (precedidos por “.”). Ele tamb´em apresenta o operador de escolha interna, o que o torna n˜ao determin´ıstico. A seguir descrevemos o seu comportamento. O processamento do CLIENTE ´e iniciado pelo evento recebeDadosDoUsuario (DadosCliente). Depois disto, ele passa a aceitar o evento validaDados(DadosCliente) que pode ser seguido por qualquer um dos eventos dadosValidos() ou dadosInvalidos(ErroCliente). Dependendo de qual destes u ´ltimos eventos venha a ocorrer, o CLIENTE passa a aceitar o evento processarDados(DadosCliente), que ser´a seguido pelos eventos obterResposta (RespostaCliente) e mostraResposta(RespostaCliente), ou o evento mostraMsgErro(ErroCliente). Ap´os a execu¸c˜ao de qualquer um desses fluxos, o CLIENTE volta ao seu estado inicial. CLIENTE = (recebeDadosDoUsuario?dados → validaDados.dados → ( dadosInvalidos?descErro → mostraMsgErro.descErro → Skip u dadosValidos → processarDados.dados → obterResposta?resp → mostraResposta.resp → Skip )); CLIENTE. 3.1.8. Traces. Um processo pode ser estudado pelo seu comportamento observ´avel. Um trace de um processo ´e um registro de uma sequˆencia finita de eventos que o processo j´a aceitou at´e o momento. Por exemplo:.

(30) ˜ GERAL: CSP, Z E CSP-Z CAP´ITULO 3. VISAO. 30. • < x , y > - ´e um trace de um processo que aceita o evento x seguido do evento y; • < tick > - ´e o trace do processo CLOCK ap´os a ocorrˆencia do primeiro tick ; • <> - ´e o trace de um processo que ainda n˜ao aceitou evento algum. Uma an´alise dos traces dos processos ser´a usada na nossa estrat´egia para identificar alguns eventos que podem ocorrer tanto na comunica¸c˜ao dos frameworks compostos quanto em cada um deles independentemente da composi¸c˜ao. Antes do in´ıcio do processo n˜ao podemos saber quais dos poss´ıveis traces ser˜ao de fato registrados. No entanto, o conjunto de todos os poss´ıveis traces finitos de um processo P pode ser determinado e ´e representado pela fun¸c˜ao traces(P ). Embora os membros do conjunto resultado da fun¸c˜ao traces(P ) sejam finitos, o conjunto representado por traces(P ) pode ser infinito. A defini¸c˜ao de traces() ´e indutiva na estrutura de P e pode ser encontrada, por exemplo, em [26].. 3.1.9. Falhas. O modelo de traces nos informa o que um processo pode fazer, mas n˜ao o que ele deve fazer. A distin¸c˜ao entre os processos (P u Q) e (P 2 Q) n˜ao pode ser feita pela compara¸c˜ao de seus traces, pois todos os traces de um deles s˜ao possiveis traces do outro. No entanto, os seus comportamentos podem ser completamente diferentes. O primeiro processo pode se comportar tanto como P quanto como Q. Supondo que a escolha (interna) seja pelo comportamento de P, o processo pode entrar em deadlock se o ambiente s´o disponibilizar o evento inicial de Q. E isto n˜ao aconteceria com o segundo processo. Para podermos distinguir o comportamento dos processos acima, precisamos observar o que eles podem se recusar a fazer, al´em do que eles podem fazer. Quando uma escolha interna entre dois processos ´e feita por um deles, dizemos que o outro foi recusado. As recusas de eventos iniciais de processos ou de partes de uma especifica¸c˜ao ser˜ao usadas na nossa estrat´egia para identificar e eliminar possiveis deadlocks nos pontos de comunica¸c˜ao entre os frameworks. O conjunto de eventos que um processo n˜ao pode aceitar indefinidamente ´e chamado de recusa. O conjunto de recusas iniciais de um processo P ´e representado pela fun¸c˜ao refusals(P ). Uma falha ´e caracterizada por uma sequˆencia s de eventos, que representa os eventos j´a ocorridos at´e o momento, e pelo conjunto de eventos R que n˜ao ser˜ao aceitos ap´os a ocorrˆencia dos eventos da seq¨ uˆencia. As falhas de um processo P s˜ao calculadas pela fun¸c˜ao failures(P ). failures(P ) = {(s, R) | s ∈ traces(P ) ∧ R ∈ refusals(P /s)} Na defini¸c˜ao acima, P /s representa o processo P ap´os o trace s. Um processo ´e dito determin´ıstico se ele nunca recusa um evento que ele esteja disposto a aceitar..

(31) ˜ GERAL: CSP, Z E CSP-Z CAP´ITULO 3. VISAO. 3.1.10. 31. Divergˆ encias. Uma divergˆencia de um processo ´e definida como um trace depois do qual o processo se comporta de forma imprevis´ıvel ou ca´otica. Um exemplo deste tipo comportamento ´e o de um processo que executa uma seq¨ uˆencia infinita de eventos ocultos (ou n˜ao observ´aveis), como o processo D abaixo. D = (a → b → D)\{a, b} Os eventos a e b ocorrer˜ao infinitamente e sem influˆencia nem observa¸c˜ao do ambiente, n˜ao permitindo que o processo D se comunique com o ambiente. O operador de hiding (\{X }) torna todos os eventos do conjunto X ocultos para o ambiente.. 3.2. Z. A linguagem Z [33, 31] ´e uma linguagem formal de f´acil aprendizado e aplica¸c˜ao, baseada na teoria de conjuntos e em l´ogica de primeira ordem. Enquanto CSP oferece operadores que permitem capturar aspectos de controle de um sistema, Z ´e mais adequada `a modelagem de dados e tipos abstratos. Objetos do mundo real s˜ao representados por esquemas Z. Os esquemas podem ser usados tanto para representar o estado de um sistema e as formas nas quais ele pode ser alterado quanto para descrever as suas opera¸c˜oes e possibilitar a an´alise dos seus poss´ıveis refinamentos. Esquemas s˜ao um poderoso mecanismo de estrutura¸c˜ao que, em combina¸c˜ao com linguagem natural, podem ser usados para especifica¸c˜oes formais [33]. Veremos mais detalhes sobre os esquemas Z na pr´oxima se¸c˜ao. Uma das caracter´ısticas importantes de Z ´e o uso de tipos. Todos os objetos matem´aticos possuem um tipo u ´nico, que ´e representado por um conjunto de valores poss´ıveis.. 3.2.1. Free types. Antes de falarmos sobre esquemas, vamos introduzir uma forma mais simples de defini¸c˜ao de tipos em Z , os Free types. O caso mais simples de utiliza¸c˜ao de Free types ´e quando queremos definir um conjunto restrito de valores. Vamos tomar por exemplo o conjunto dos meses do ano. Numa linguagem de programa¸c˜ao qualquer, este conjunto poderia ser definido da seguinte forma: MesesDoAno = {Jan, Fev , Mar , Abr , Mai, Jun, Jul , Ago, Set, Out, Nov , Dez } Em Z , este mesmo conjunto poderia ser definido como a seguir, MesesDoAno == {Jan, Fev , Mar , Abr , Mai, Jun, Jul , Ago, Set, Out, Nov , Dez }.

(32) ˜ GERAL: CSP, Z E CSP-Z CAP´ITULO 3. VISAO. 32. Por´em, as formas acima n˜ao fazem nenhuma inferˆencia sobre os elementos do conjunto. Nada garante que, por exemplo, Janeiro e Fevereiro s˜ao valores distintos. A seguinte defini¸c˜ao do Free type MesesDoAno introduz um conjunto de doze constantes distintas. MesesDoAno == Jan | Fev | Mar | Abr | Mai | Jun | Jul | Ago | Set | Out | Nov | Dez Apesar do exemplo apresentado acima ser bastante simples, os Free types s˜ao um poderoso mecanismo de Z e podem ser usados na defini¸c˜ao de cole¸c˜oes, objetos compostos e estruturas recursivas.. 3.2.2. Esquemas. A nota¸c˜ao de Z envolve duas linguagens: a linguagem matem´atica e a linguagem de esquemas. A linguagem matem´atica ´e usada para descrever v´arios aspectos de um objeto ou sistema. A linguagem de esquemas ´e usada para estruturar e compor essas descri¸c˜oes: agrupando, encapsulando e nomeando informa¸c˜oes para permitir o seu reuso. Esquemas podem ser usados na defini¸c˜ao de tipos e de suas opera¸c˜oes. Um esquema consiste de duas partes: a declara¸c˜ao de suas vari´aveis e os seus predicados (ou propriedades) que imp˜oem condi¸c˜oes sobre os valores das vari´aveis. Os predicados representam as pr´e e p´os-condi¸c˜oes de um esquema. Existem duas formas de escrevermos o conte´ udo de um esquema: • Horizontal b [declaracao | predicado] NomeDoEsquema =. • Vertical NomeDoEsquema declaracao predicado Esquemas podem ser usados na defini¸c˜ao de tipos compostos (registros). Por exemplo, o esquema abaixo pode representar os dados do processo CLIENTE (apresentado na se¸c˜ao anterior). O atributo c representa a lista de poss´ıveis pedidos (o menu) e o atributo vontade representa as preferˆencias do cliente. O predicado restringe as preferˆencias do cliente `as op¸c˜oes de menu. CLIENTE c : Pedidos vontade : OpcaoMenu vontade ∈ c ´ poss´ıvel referenciar os elementos de um esquema atrav´es de um operador de E sele¸c˜ao. Por exemplo, se cli ´e do tipo CLIENTE , ent˜ao cli .vontade representa a sua preferˆencia..

(33) ˜ GERAL: CSP, Z E CSP-Z CAP´ITULO 3. VISAO. 33. Alterando o estado de um esquema Quando desejamos usar um esquema para descrever opera¸c˜oes sobre o estado, usamos duas c´opias do esquema: uma para representar o seu estado antes e outra depois da opera¸c˜ao. A distin¸c˜ao entre as c´opias ´e feita atrav´es da decora¸c˜ao do esquema que representa o estado ap´os a opera¸c˜ao: CLIENTE 0 c 0 : Pedidos vontade 0 : OpcaoMenu vontade 0 ∈ c 0 A seguir descrevemos uma opera¸c˜ao que atribui um valor ao componente c do cliente. O predicado do esquema caracteriza o comportamento (pr´e e p´oscondi¸c˜oes) da opera¸c˜ao. com recebeCardapio CLIENTE CLIENTE 0 c? : Pedidos c 0 = c? vontade 0 = vontade A inclus˜ao das duas c´opias de CLIENTE indica que c, vontade, c 0 e vontade 0 constituem um estado v´alido do sistema. As opera¸c˜oes podem envolver trocas de informa¸c˜oes com o ambiente (parˆametros de entrada e/ou de sa´ıda). Os parˆametros s˜ao representados pelas vari´aveis declaradas no esquema da opera¸c˜ao. Convenciona-se que parˆametros de entrada (recebidos do ambiente) devem ter seus nomes terminados por “?” e parˆametros de sa´ıda (enviados para o ambiente) devem ter seus nomes terminados por “!”. Convenciona-se tamb´em que, se CLIENTE ´e um esquema, ent˜ao ∆CLIENTE ´e um esquema que inclui CLIENTE e CLIENTE 0 . Logo, a opera¸c˜ao acima pode ser escrita da seguinte forma: com recebeCardapio ∆CLIENTE c? : Pedidos c 0 = c? vontade 0 = vontade Podem haver opera¸c˜oes nas quais o estado n˜ao ´e alterado, os valores antes e depois da sua execu¸c˜ao s˜ao idˆenticos. Convenciona-se que ΞCLIENTE denota que o esquema inclui CLIENTE e CLIENTE 0 , onde os valores de CLIENTE s˜ao idˆenticos aos valores de CLIENTE 0 ..

(34) ˜ GERAL: CSP, Z E CSP-Z CAP´ITULO 3. VISAO. 34. com chamaGarcom ΞState m? : Mesa O esquema acima descreve uma opera¸c˜ao que recebe um parˆametro do ambiente mas que n˜ao altera o estado do CLIENTE .. 3.3. CSP-Z. A linguagem CSP-Z ´e uma integra¸c˜ao entre CSP e Z, onde CSP trata os aspectos de concorrˆencia de um sistema enquanto que Z trata as estruturas de dados [22]. A combina¸c˜ao ´e tal que o refinamento de qualquer das partes (CSP ou Z) resulta no refinamento da especifica¸c˜ao completa, desde que obedecidas certas condi¸c˜oes [12]. Nos exemplos, ora n´os refinamos a parte Z, ora refinamos a parte CSP das especifica¸c˜oes para representar as instˆancias dos frameworks. De acordo com [12], uma especifica¸c˜ao CSP-Z SPEC 2 ´e um refinamento de uma outra especifica¸c˜ao CSP-Z SCPEC 1 se: • A parte Z de SPEC 2 for um refinamento da parte Z de SPEC 1. Isto ocorre quando as opera¸c˜oes de SPEC 2 tiverem pr´e-condi¸c˜oes mais fracas e p´oscondi¸c˜oes mais fortes que as de SPEC 1 e quando todos os poss´ıveis estados iniciais de SPEC 2 corresponderem a algum estado inicial de SPEC 1; • As partes CSP das especifica¸c˜oes n˜ao tiverem “acesso interno” `as vari´aveis dos esquemas Z. Ou seja, o processo CSP n˜ao deve referenciar qualquer vari´avel do esquema Z; • A parte CSP de SPEC 2 for um refinamento v´alido da parte CSP de SPEC 1. Semanticamente, as partes de uma especifica¸c˜ao CSP-Z s˜ao combinadas em paralelo, com a parte Z interpretada como um processo CSP. A forma de tal processo ´e a escolha externa entre as transi¸c˜oes de estado (as combina¸c˜oes entre a parte CSP e Z de cada opera¸c˜ao e o seu efeito no estado do processo). O paralelismo ´e feito atrav´es dos nomes dos canais, onde a ocorrˆencia de cada evento ev da parte CSP corresponde `a ativa¸c˜ao do esquema com ev da parte Z. Um evento da parte CSP s´o pode ocorrer quando o predicado (as pr´e-condi¸c˜oes) do esquema Z correspondente ´e satisfeito; o mesmo acontece quando as vari´aveis de sa´ıda do esquema Z n˜ao podem ser comunicadas pelo evento CSP [23].. 3.3.1. Exemplo ilustrativo. Uma especifica¸c˜ao CSP-Z consiste de uma interface e das partes CSP e Z, entre as palavras-chave spec e end spec. A interface ´e representada pela lista de declara¸c˜oes de canais. A parte CSP ´e representada pelo um processo CSP main.

(35) ˜ GERAL: CSP, Z E CSP-Z CAP´ITULO 3. VISAO. 35. cujo alfabeto contenha apenas canais declarados na interface. A parte Z ´e composta de diversos esquemas, um deles representando o estado do processo, outro representando a inicializa¸c˜ao do processo e tantos outros quantos forem os canais declarados na interface. Estes u ´ltimos s˜ao os respons´aveis pela comunica¸c˜ao direta entre entre as partes CSP e Z da especifica¸c˜ao. Apresentamos, como exemplo ilustrativo, um processo CSP-Z que representa uma urna de vota¸c˜ao que permite que o usu´ario, ap´os a inicializa¸c˜ao, escolha entre dois candidatos ou vote nulo ou em branco. A parte CSP ´e respons´avel pela seq¨ uˆencia de eventos enquanto que parte Z da especifica¸c˜ao ´e respons´avel pela totaliza¸c˜ao dos votos. A seguir apresentamos a especifica¸c˜ao CSP-Z completa. spec URNA channel inicializa channel candidato1 channel candidato2 channel brancoNulo A interface da urna consiste dos canais iniciaVotacao, candidato1, candidato2 e brancoNulo representando as opera¸c˜oes de inicio da vota¸c˜ao, voto no candiadato 1, voto no candidato2 e voto branco ou nulo, respectivamente. main = iniciaVotacao → (candidato1 → main) 2 (candidato2 → main) 2 (brancoNulo → main) O processo main acima representa as poss´ıveis seq¨ uˆencias de opera¸c˜oes da urna. As altera¸c˜oes do estado da urna, causadas por cada uma das opera¸c˜oes s˜ao realizadas pelas opera¸c˜oes apresentadas abaixo. URNA votosCand 1 : N votosCand 2 : N brancosNulos : N O estado da urna armazena as quantidades de votos nos candidatos e a quantidade de votos nulos e brancos. Init URNA0 votosCand 10 = 0 votosCand 20 = 0 brancosNulos 0 = 0.

Referências

Documentos relacionados

3 O presente artigo tem como objetivo expor as melhorias nas praticas e ferramentas de recrutamento e seleção, visando explorar o capital intelectual para

Gráfico 26 - Análise dos resultados da questão 4 da turma de Tecnologia em Redes de Computadores De acordo com os resultados obtidos na análise gráfica da questão 4,

valores de tensão tangencial aplicadas a um fluido em escoamento esta não é suficiente para romper a “fricção” das partículas suspensas do fluido e pô-lo em movimento. Esta

A amplitude representa a dispers˜ ao entre o menor e o maior valor de um conjunto de dados, entretanto, na presen¸ ca de um outlier, este valor acaba

Ora, j´ a vimos que as ´ unicas solu¸c˜ oes da equa¸c˜ ao de Legendre usual que permanecem limitadas nos extremos ±1 (assim como suas derivadas) s˜ao os polinˆ omios de Legendre P

Segund Segundo o o o come comentári ntário, qu o, quais s ais são ão as tr as três p ês priorid rioridades ades abso absolutas lutas da i da

Com isso, alguns objetivo foram tra¸ cados tais como: o estudo te´ orico e a implementa¸ c˜ ao num´ erica de m´ etodos aplicados ` a resolu¸ c˜ ao de Sistemas de Equa¸ c˜ oes n˜

Com base nas preocupações acima apresentadas, este trabalho se propos a estimar as perdas de nitrogênio agrícola através do estudo da dinâmica da solução no