29.01.2015 Views

Artigo - Magic: Um Framework para Jogos de Cartas

Artigo - Magic: Um Framework para Jogos de Cartas

Artigo - Magic: Um Framework para Jogos de Cartas

SHOW MORE
SHOW LESS

Create successful ePaper yourself

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

<strong>Framework</strong> <strong>para</strong> jogos <strong>de</strong> cartas<br />

por André Luís Knabben e Thiago Robert<br />

Professor Doutor Ricardo Pereira e Silva<br />

Orientador<br />

Resumo<br />

Projetar artefatos <strong>de</strong> software visando a reusabilida<strong>de</strong> é uma tarefa complexa.<br />

<strong>Framework</strong>s e padrões <strong>de</strong> projeto são artefatos <strong>de</strong> software reusáveis que buscam facilitar o<br />

<strong>de</strong>senvolvimento <strong>de</strong> aplicações. O presente documento consiste na <strong>de</strong>scrição do<br />

<strong>de</strong>senvolvimento <strong>de</strong> um framework OO generalizando o domínio dos jogos <strong>de</strong> cartas,<br />

utilizando padrões <strong>de</strong> projeto.<br />

Abstract<br />

Designing reusable software artifacts is a complex task. <strong>Framework</strong>s and <strong>de</strong>sign<br />

patterns are reusable software artifacts that can be used to speed application <strong>de</strong>velopment.<br />

The present paper consists in the <strong>de</strong>scription of the <strong>de</strong>velopment of a card games OO<br />

framework, using <strong>de</strong>sign patterns.<br />

Introdução<br />

Há décadas, a reusabilida<strong>de</strong> vem sendo uma das principais metas dos engenheiros <strong>de</strong><br />

software. Entretanto, reusar software não é nada simples e a maior parte dos esforços nesse<br />

sentido acabou gerando apenas pequenos componentes caixa-preta. Com a popularização<br />

do <strong>para</strong>digma OO, tornou-se possível <strong>de</strong>senvolver componentes reusáveis <strong>de</strong> maior


granularida<strong>de</strong>, entre eles os frameworks OO. Atualmente existem frameworks <strong>para</strong> uma<br />

gran<strong>de</strong> varieda<strong>de</strong> <strong>de</strong> domínios, entre eles po<strong>de</strong>mos citar o MVC do Smalltalk e o AWT do<br />

Java.<br />

<strong>Framework</strong>s são artefatos reusáveis <strong>de</strong> alta granularida<strong>de</strong>. A utilização <strong>de</strong> um<br />

framework tem como objetivo a redução no tempo e no custo <strong>de</strong> criação e manutenção <strong>de</strong><br />

novas aplicações que pertençam ao domínio tratado por esse framework. Além disso, a<br />

utilização <strong>de</strong>sses artefatos <strong>de</strong> software resulta em aplicações mais confiáveis, pois, estando<br />

o framework <strong>de</strong>purado, o <strong>de</strong>senvolvimento <strong>de</strong>ixa pouca margem à inserção <strong>de</strong> erros.<br />

<strong>Framework</strong>s Orientados a Objetos<br />

<strong>Um</strong> framework é um conjunto <strong>de</strong> classes integradas que <strong>de</strong>fine uma estrutura reusável<br />

<strong>para</strong> um domínio específico <strong>de</strong> aplicações. O framework provê uma arquitetura<br />

particionada em classes abstratas e <strong>de</strong>fine as responsabilida<strong>de</strong>s e um mo<strong>de</strong>lo <strong>de</strong> colaboração<br />

<strong>para</strong> essas classes. O <strong>de</strong>senvolvedor adapta o framework <strong>para</strong> uma aplicação particular<br />

especializando e agregando instâncias <strong>de</strong> suas classes. A figura abaixo ilustra uma<br />

aplicação <strong>de</strong>senvolvida a partir <strong>de</strong> um framework. A estrutura em azul correspon<strong>de</strong> ao<br />

framework e o restante é o que foi produzido pelo usuário do framework no<br />

<strong>de</strong>senvolvimento <strong>de</strong>ssa aplicação específica.<br />

Figura 1.<br />

<strong>Um</strong>a aplicação <strong>de</strong>senvolvida sob um framework OO.<br />

<strong>Framework</strong>s portam a infra-estrutura <strong>de</strong> projeto, característica que reduz a quantida<strong>de</strong><br />

<strong>de</strong> código a ser <strong>de</strong>senvolvida na criação <strong>de</strong> aplicações. O mo<strong>de</strong>lo <strong>de</strong> colaboração entre as


classes <strong>de</strong> um framework <strong>de</strong>fine a arquitetura da aplicação livrando o <strong>de</strong>senvolvedor <strong>de</strong>ssa<br />

responsabilida<strong>de</strong>.<br />

A arquitetura dinâmica <strong>de</strong> um framework é caracterizada por uma inversão <strong>de</strong><br />

controle. A inversão <strong>de</strong> controle permite que o framework (e não a aplicação) <strong>de</strong>termine<br />

que métodos invocar em resposta a eventos.<br />

Desenvolvimento <strong>de</strong> <strong>Framework</strong>s<br />

O <strong>de</strong>senvolvimento <strong>de</strong> um framework é ligeiramente diferente do <strong>de</strong>senvolvimento <strong>de</strong><br />

uma aplicação comum. A gran<strong>de</strong> diferença é que um framework tem que cobrir os<br />

conceitos relevantes a um domínio enquanto uma aplicação cobre apenas os conceitos<br />

mencionados nos seus requisitos. O <strong>de</strong>senvolvimento <strong>de</strong> um framework po<strong>de</strong> ser dividido<br />

da seguinte maneira:<br />

Análise do Domínio<br />

A análise <strong>de</strong> domínio é o processo <strong>de</strong> i<strong>de</strong>ntificação e organização <strong>de</strong> conhecimentos a<br />

respeito <strong>de</strong> uma classe <strong>de</strong> problemas – um domínio <strong>de</strong> aplicações – <strong>para</strong> suportar a<br />

<strong>de</strong>scrição e solução <strong>de</strong>sses problemas. É um passo fundamental na criação <strong>de</strong> artefatos <strong>de</strong><br />

software reusáveis, pois elementos gerados através <strong>de</strong> uma análise <strong>de</strong> domínio capturam a<br />

funcionalida<strong>de</strong> essencial requerida por um domínio.<br />

<strong>Um</strong>a análise <strong>de</strong> domínio é um passo importante no <strong>de</strong>senvolvimento <strong>de</strong> frameworks,<br />

pois faz com que o <strong>de</strong>senvolvedor do framework obtenha uma maior compreensão dos<br />

conceitos do domínio, funcionalida<strong>de</strong>s e hot spots que um framework <strong>de</strong>ve possuir.<br />

Mo<strong>de</strong>lagem<br />

A mo<strong>de</strong>lagem <strong>de</strong> um framework consiste na especificação da estrutura <strong>de</strong> classes


<strong>de</strong>sse framework. Essa estrutura <strong>de</strong> classes <strong>de</strong>ve possuir algumas características<br />

importantes:<br />

• Generalida<strong>de</strong> – reflete a capacida<strong>de</strong> do framework <strong>de</strong> alterar suas<br />

funcionalida<strong>de</strong>s, tendo em vista as necessida<strong>de</strong>s <strong>de</strong> uma aplicação específica.<br />

• Extensibilida<strong>de</strong> – refere-se à manutenibilida<strong>de</strong> do framework. O<br />

<strong>de</strong>senvolvimento <strong>de</strong> frameworks é um processo iterativo, isto é, à medida que<br />

o framework é utilizado novos recursos po<strong>de</strong>m ser agregados a sua estrutura.<br />

Assim, durante o projeto <strong>de</strong> um framework, <strong>de</strong>ve-se tentar prever futuras<br />

utilizações <strong>para</strong> este framework e futuras extensões no domínio tratado.<br />

Implementação<br />

A implementação <strong>de</strong> frameworks segue as linhas gerais da implementação <strong>de</strong> uma<br />

aplicação comum. Todas as técnicas e padrões <strong>para</strong> o <strong>de</strong>senvolvimento <strong>de</strong> código po<strong>de</strong>m<br />

ser usados na implementação <strong>de</strong> um framework.<br />

É importante ressaltar que o sucesso da implementação <strong>de</strong> um framework <strong>de</strong>pen<strong>de</strong> da<br />

qualida<strong>de</strong> do projeto <strong>de</strong>sse framework. Todas as características <strong>de</strong>finidas durante a fase <strong>de</strong><br />

projeto <strong>de</strong>vem ser mantidas na fase <strong>de</strong> implementação <strong>para</strong> que o framework não perca sua<br />

capacida<strong>de</strong> <strong>de</strong> generalizar um domínio <strong>de</strong> aplicações.<br />

Testes<br />

<strong>Um</strong> framework é validado através da criação <strong>de</strong> aplicações teste, usadas <strong>para</strong><br />

<strong>de</strong>terminar se o framework provê as funcionalida<strong>de</strong>s <strong>de</strong>sejadas e <strong>para</strong> avaliar sua<br />

usabilida<strong>de</strong>.<br />

Se, no processo <strong>de</strong> criação <strong>de</strong> aplicações, forem encontradas características do<br />

domínio tratado que não estão presentes no framework <strong>de</strong>ve-se reavaliar o projeto e<br />

atualizar a implementação do framework <strong>para</strong> que essas características sejam adicionadas.


Essa retro-alimentação faz parte do ciclo <strong>de</strong> vida dos frameworks.<br />

Documentação<br />

O <strong>de</strong>senvolvimento e a utilização <strong>de</strong> frameworks são tarefas complexas e, por isso,<br />

uma boa documentação é essencial. A documentação <strong>de</strong>ve prover informações sobre o<br />

domínio tratado pelo framework, sua estrutura e funcionamento.<br />

<strong>Framework</strong>s po<strong>de</strong>m ser <strong>de</strong>scritos a partir <strong>de</strong> notações <strong>de</strong> metodologia OOAD como,<br />

por exemplo, a UML. Essa <strong>de</strong>scrição po<strong>de</strong> ser uma ótima fonte <strong>de</strong> informação sobre o<br />

framework e, portanto, uma documentação valiosa.<br />

<strong>Um</strong>a outra forma <strong>de</strong> documentação é a que ensina a usar o framework <strong>para</strong> gerar<br />

aplicações. Esse tipo <strong>de</strong> documentação dá pouca ênfase a aspectos <strong>de</strong> projeto concentrandose<br />

na <strong>de</strong>scrição do processo <strong>de</strong> criação <strong>de</strong> aplicações sob o framework. <strong>Um</strong> exemplo <strong>de</strong>sse<br />

tipo <strong>de</strong> documentação é o cookbook.<br />

Cookbooks são conjuntos <strong>de</strong> receitas textuais <strong>para</strong> a utilização <strong>de</strong> um framework. Sua<br />

principal vantagem é a capacida<strong>de</strong> <strong>de</strong> respon<strong>de</strong>r a questões chave minimizando o tempo<br />

gasto <strong>para</strong> produzir aplicações. O principal problema <strong>de</strong>ssa abordagem é que ela cobre uma<br />

faixa limitada <strong>de</strong> tipos <strong>de</strong> aplicação. O auxilio proveniente do uso <strong>de</strong> um cookbook po<strong>de</strong> ser<br />

ínfimo no caso das necessida<strong>de</strong>s do usuário não se ajustarem ao conjunto <strong>de</strong> problemas<br />

tratados pelo cookbook. [SIL 00]<br />

Outro modo <strong>de</strong> documentar um framework, talvez o mais elementar, é a<br />

disponibilização <strong>de</strong> código fonte aos usuários. O código fonte <strong>de</strong> um framework ou <strong>de</strong><br />

aplicações <strong>de</strong>senvolvidas sob esse framework é uma rica fonte <strong>de</strong> documentação.<br />

Entretanto, é muito difícil enten<strong>de</strong>r o funcionamento <strong>de</strong> um framework apenas pelo seu<br />

código fonte e, por isso, é recomendável que o código não seja a única fonte <strong>de</strong> referência<br />

disponibilizada pelo autor do framework.


Padrões <strong>de</strong> Projeto<br />

<strong>Um</strong> padrão <strong>de</strong> projeto nomeia e explica sistematicamente uma solução geral <strong>para</strong> um<br />

problema recorrente em sistemas OO.<br />

O padrão <strong>de</strong> projeto <strong>de</strong>screve o problema, a solução, quando aplicar a solução e as<br />

conseqüências <strong>de</strong> sua aplicação. A solução é uma estrutura <strong>de</strong> classes e objetos que resolve<br />

o problema.<br />

Padrões <strong>de</strong> projeto capturam a essência <strong>de</strong> uma idéia que projetistas experientes<br />

usaram diversas vezes <strong>para</strong> resolver um problema comum, abstraindo-se da situação<br />

específica. Por isso, os padrões <strong>de</strong> projeto são in<strong>de</strong>pen<strong>de</strong>ntes da aplicação e tem que ser<br />

mapeados <strong>para</strong> uma situação específica antes <strong>de</strong> serem implementados.<br />

<strong>Framework</strong> <strong>para</strong> <strong>Jogos</strong> <strong>de</strong> <strong>Cartas</strong><br />

O domínio dos jogos <strong>de</strong> cartas po<strong>de</strong> parecer simples à primeira vista, entretanto, é um<br />

domínio vasto e sua análise e generalização exige muita atenção com os <strong>de</strong>talhes sutis que<br />

po<strong>de</strong>riam passar <strong>de</strong>spercebidos. A generalização <strong>de</strong>sse domínio em um framework tem o<br />

objetivo didático <strong>de</strong> fixar os aspectos referentes ao <strong>de</strong>senvolvimento e utilização <strong>de</strong><br />

frameworks.<br />

Análise do Domínio<br />

Analisando várias aplicações no domínio <strong>de</strong> jogos <strong>de</strong> cartas po<strong>de</strong>-se chegar a três<br />

entida<strong>de</strong>s básicas:<br />

• Carta – comum a todos as aplicações <strong>de</strong>sse domínio, essa é a entida<strong>de</strong> básica<br />

<strong>de</strong> qualquer jogo <strong>de</strong> cartas.<br />

• Baralho – todas as cartas <strong>de</strong> um jogo fazem parte <strong>de</strong> um baralho.


• Conjunto <strong>de</strong> cartas – a ação mais comum <strong>de</strong> um jogador num jogo <strong>de</strong> cartas é<br />

mover uma carta <strong>de</strong> um conjunto <strong>de</strong> cartas <strong>para</strong> outro.<br />

A quantida<strong>de</strong> <strong>de</strong> entida<strong>de</strong>s <strong>de</strong>sses tipos, a interação entre essas entida<strong>de</strong>s e a interação<br />

do usuário com essas entida<strong>de</strong>s varia <strong>de</strong>pen<strong>de</strong>ndo do jogo.<br />

Projeto<br />

Procurou-se mo<strong>de</strong>lar o framework tendo em vista a generalida<strong>de</strong>, extensibilida<strong>de</strong> e<br />

interoperabilida<strong>de</strong>. O projeto é genérico e po<strong>de</strong> ser usado como base <strong>para</strong> o<br />

<strong>de</strong>senvolvimento <strong>de</strong> frameworks <strong>para</strong> jogos <strong>de</strong> cartas em qualquer linguagem e <strong>para</strong><br />

qualquer plataforma.<br />

Hierarquia <strong>de</strong> Classes – Card<br />

<strong>Cartas</strong> são o elemento básico <strong>de</strong> todos os jogos <strong>de</strong> cartas. Cada jogo possui diferentes<br />

tipos <strong>de</strong> carta e por isso a classe Card é um hot spot. FourSuitCard é uma implementação<br />

concreta <strong>de</strong> Card e refere-se à carta comum (com um número e um naipe) usada na maioria<br />

dos jogos. SetOfCards é simplesmente um conjunto <strong>de</strong> cartas. PileOfCards representa uma<br />

das diferentes pilhas encontradas nos jogos, como, por exemplo, a mão <strong>de</strong> um jogador ou a<br />

pilha <strong>de</strong> compra.


Mo<strong>de</strong>l<br />

AttributedMo<strong>de</strong>l<br />

Card *<br />

SetOfCard<br />

FourSuitCard<br />

HOT SPOT<br />

PileOfCards<br />

setAddCondition()<br />

setRemoveCondition()<br />

Figura 2.<br />

Hierarquia <strong>de</strong> mo<strong>de</strong>los presente no framework <strong>de</strong> jogos <strong>de</strong> cartas.<br />

PileOfCards<br />

PileOfCards<br />

chainRemoval : boolean<br />

<strong>de</strong>faultCardOrientation : boolean<br />

LAYOUT_TYPE_HORIZONTAL : int = 2<br />

LAYOUT_TYPE_PILE : int = 0<br />

LAYOUT_TYPE_VERTICAL : int = 1<br />

addCardTestingCondition()<br />

enableConditions()<br />

isChainRemovalOn()<br />

isDragEnabled()<br />

removeAndSaveTestingCondition()<br />

removeCardTestingCondition()<br />

restoreSavedCard()<br />

setAddCondition()<br />

setDrag()<br />

setRemoveCondition()<br />

PileOfCards implementa um monte<br />

qualquer <strong>de</strong>ntro <strong>de</strong> um jogo <strong>de</strong> cartas. Esse<br />

monte po<strong>de</strong> ter vários layouts diferentes, como<br />

uma carta sobre a outra, uma ao lado da outra<br />

ou em cascata vertical.<br />

É essa classe que contém as regras do<br />

jogo, dizendo qual carta po<strong>de</strong> ser movida <strong>para</strong><br />

qual lugar através <strong>de</strong> condições <strong>de</strong> entrada e<br />

saída <strong>de</strong> cartas. Essas condições são<br />

implementadas através das classes <strong>de</strong>scritas a<br />

seguir e seus métodos são invocados sempre que o usuário tenta remover uma carta <strong>de</strong>


algum PileOfCards e quando ele tenta adiciona-la em outro. Essa classe <strong>de</strong>fine também se a<br />

remoção <strong>de</strong> uma carta do meio do baralho (utilizado em geral com o layout cascata) <strong>de</strong>ve<br />

efetuar a remoção <strong>de</strong> todas as cartas a partir <strong>de</strong>ssa (<strong>para</strong> mover uma coluna no jogo<br />

Paciência, por exemplo). Além disso, o método removeAndSaveTestingCondition()<br />

permite a remoção <strong>de</strong> uma carta ou <strong>de</strong> um conjunto <strong>de</strong> cartas mantendo uma referência à<br />

lista removida. Dessa forma as visões são atualizadas, excluindo as cartas removidas, mas<br />

um simples método (restoreSavedCard()) faz com que as cartas sejam adicionadas<br />

novamente no monte na posição em que estavam antes da remoção. Isso facilita, por<br />

exemplo, a implementação <strong>de</strong> drag and drop, pois permite anular o drag caso o <strong>de</strong>stino não<br />

aceite as cartas sendo movidas.<br />

As condições <strong>para</strong> entrada e saída <strong>de</strong> cartas implementam o padrão <strong>de</strong> projeto<br />

Strategy, permitindo que um algoritmo seja trocado a qualquer hora, porém sem colocar a<br />

implementação <strong>de</strong> cada tipo <strong>de</strong> algoritmo <strong>de</strong>ntro da classe que usa ele.<br />

As classes AddCardCondition e RemoveCardCondition possuem métodos que <strong>de</strong>vem<br />

retornar verda<strong>de</strong>iro se a alteração (inclusão ou remoção <strong>de</strong> carta) for aceita e falso caso<br />

contrário. Os parâmetros passados <strong>para</strong> essas funções contêm informações que possibilitam<br />

a implementação <strong>de</strong> uma gran<strong>de</strong> quantida<strong>de</strong> <strong>de</strong> algoritmos, sendo que a maioria <strong>de</strong>les<br />

utilizará apenas um subconjunto dos dados fornecidos. Os parâmetros fornecidos diferem<br />

entre AddCardCondition e RemoveCardCondition.<br />

AddCardCondition<br />

testAdd()<br />

testAdd()<br />

*<br />

HOT SPOT<br />

SpecificSuitAddCondition<br />

InOr<strong>de</strong>rAddCondition<br />

CompositeAddCondition


Figura 3.<br />

Hierarquia <strong>de</strong> condições <strong>para</strong> adição <strong>de</strong> cartas em um PileOfCards.<br />

RemoveCardCondition<br />

testRemove()<br />

testRemove()<br />

*<br />

HOT SPOT<br />

OnlyLastCardsRemoveCondition TrueRemoveCondition CompositeRemoveCondition<br />

Figura 4.<br />

Hierarquia <strong>de</strong> condições <strong>para</strong> remoção <strong>de</strong> cartas em um PileOfCards.<br />

Criação <strong>de</strong> um Jogo<br />

A criação do jogo consiste em especializar a classe CardGame implementando os<br />

seguintes métodos abstratos:<br />

• createPiles – inicializar as pilhas do jogos, que <strong>de</strong>vem estar previamente<br />

<strong>de</strong>finidas.<br />

• createPlayers – inicializar os atributos dos jogadores.<br />

• distributeCards – criar o baralho a ser usado no jogo e o distribuidor <strong>de</strong><br />

cartas. Distribuir as cartas.<br />

• createInterface – criar a interface <strong>para</strong> o jogo <strong>de</strong>finido, painéis necessários,<br />

layouts, etc.<br />

Figura 5.<br />

Classe Básica <strong>de</strong> um jogo <strong>de</strong> cartas.


Testes<br />

Aplicações teste foram <strong>de</strong>senvolvidas <strong>para</strong> avaliar a capacida<strong>de</strong> do framework <strong>de</strong><br />

facilitar o <strong>de</strong>senvolvimento <strong>de</strong> aplicações no domínio proposto. Além <strong>de</strong> validar o<br />

framework <strong>para</strong> jogos <strong>de</strong> cartas, as aplicações teste serviram também <strong>para</strong> validar o<br />

framework <strong>para</strong> interface gráfica.<br />

FreeCell<br />

O FreeCell é um jogo <strong>de</strong> cartas simples e muito popular. O objetivo do jogo é or<strong>de</strong>nar<br />

as cartas em quatro pilhas, uma <strong>para</strong> cada naipe. Existem três tipos <strong>de</strong> pilhas <strong>de</strong> carta nesse<br />

jogo:<br />

• Destinos – existem quatro pilhas <strong>de</strong>sse tipo, uma <strong>para</strong> cada naipe. Todas as<br />

cartas <strong>de</strong>vem estar em um <strong>de</strong>stino <strong>para</strong> que o jogo acabe.<br />

o Condição <strong>de</strong> entrada – as cartas <strong>de</strong>vem ser adicionadas em or<strong>de</strong>m<br />

crescente e todas as cartas <strong>de</strong> um <strong>de</strong>stino <strong>de</strong>vem ser do mesmo naipe.<br />

o Condição <strong>de</strong> saída – <strong>de</strong>pois <strong>de</strong> adicionada em um <strong>de</strong>stino, uma carta<br />

não po<strong>de</strong> ser retirada.<br />

• Espaços – essas pilhas são usadas <strong>para</strong> armazenar temporariamente uma carta<br />

durante o jogo. O número <strong>de</strong> espaços é configurável.<br />

o Condição <strong>de</strong> entrada – qualquer carta po<strong>de</strong> ser adicionada em um<br />

espaço, in<strong>de</strong>pen<strong>de</strong>ntemente <strong>de</strong> seu naipe ou número. Entretanto, cada<br />

espaço comporta no máximo uma carta.<br />

o Condição <strong>de</strong> saída – uma carta sempre po<strong>de</strong> ser retirada <strong>de</strong> um espaço.<br />

• Pilhas <strong>de</strong> jogo – essas pilhas são usadas <strong>para</strong> movimentar as cartas durante o<br />

jogo. O número <strong>de</strong> pilhas <strong>de</strong>sse tipo é configurável.<br />

o Condição <strong>de</strong> entrada – as cartas <strong>de</strong>vem ser adicionadas em or<strong>de</strong>m<br />

<strong>de</strong>crescente. A carta adicionada <strong>de</strong>ve ser <strong>de</strong> cor diferente da última<br />

carta na pilha.


o Condição <strong>de</strong> saída – somente a última carta da pilha po<strong>de</strong> ser retirada.<br />

Inicialmente, as cartas do baralho são distribuídas <strong>de</strong> forma aleatória entra as pilhas<br />

<strong>de</strong> jogo.<br />

Espaços<br />

Destinos<br />

Pilhas <strong>de</strong> jogo<br />

Figura 6.<br />

Screenshot do jogo FreeCell.<br />

Conclusões<br />

A estrutura <strong>de</strong> classes <strong>de</strong> um framework, bem como o mo<strong>de</strong>lo <strong>de</strong> colaboração entre<br />

essas classes, é bastante complexa. Projetar e implementar essa estrutura exige um alto<br />

nível <strong>de</strong> conhecimento das técnicas e ferramentas <strong>para</strong> projeto e <strong>de</strong>senvolvimento OO. Por<br />

essa razão, <strong>de</strong>senvolver um framework abrangente e extensível é um ótimo exercício <strong>de</strong>ssas<br />

técnicas.<br />

Além disso, o <strong>de</strong>senvolvimento <strong>de</strong> aplicações sob um framework explicita a


importância do reuso. <strong>Um</strong> framework bem abrangente facilita muito o <strong>de</strong>senvolvimento <strong>de</strong><br />

aplicações no domínio tratado.<br />

Entretanto, o <strong>de</strong>senvolvimento <strong>de</strong> um framework exige um esforço bem maior do que<br />

o <strong>de</strong>sprendido <strong>para</strong> criar uma aplicação isolada. <strong>Um</strong>a análise <strong>de</strong>talhada do domínio alvo e<br />

da relação custo beneficio do <strong>de</strong>senvolvimento <strong>de</strong> um framework <strong>de</strong>ve fazer parte da<br />

análise <strong>de</strong> requisitos <strong>de</strong> um projeto qualquer que tencione criar um framework <strong>para</strong> um<br />

domínio específico.<br />

Os padrões <strong>de</strong> projeto, utilizados durante a mo<strong>de</strong>lagem e implementação dos<br />

frameworks <strong>de</strong>scritos nesse documento, são referências importantíssimas no<br />

<strong>de</strong>senvolvimento <strong>de</strong> aplicações OO. Além <strong>de</strong> facilitar o projeto e implementação, os<br />

padrões são uma boa fonte <strong>de</strong> documentação <strong>para</strong> a interação entre classes <strong>de</strong> um<br />

subsistema <strong>de</strong> uma aplicação OO qualquer.<br />

Referências Bibliográficas<br />

[DOU 99] DOUGLASS, B. P. Doing Hard Time: Developing Real-Time Systems with<br />

UML, Objects, <strong>Framework</strong>s, and Patterns. [s.l.]: Addison Weasley, 1999.<br />

[FAY 99] FAYAD, M. et al. Building Application <strong>Framework</strong>s. New York: Wiley, 1999.<br />

[GAM 99] GAMMA, E. Design patterns: elements of reusable object-oriented software.<br />

Reading: Addison Wesley, 1994.<br />

[LEW 95] LEWIS, T. et al. Object-oriented application frameworks. Greenwich:<br />

Manning, 1995.<br />

[MEY 97] MEYER, B. Object-oriented software construction. 2 ed. [s.l.]: Prentice Hall<br />

PTR, 1997.<br />

[SIL 98] SILVA, R. P.; PRICE, R. T. A busca <strong>de</strong> generalida<strong>de</strong>, flexibilida<strong>de</strong> e<br />

extensibilida<strong>de</strong> no processo <strong>de</strong> <strong>de</strong>senvolvimento <strong>de</strong> frameworks<br />

orientados a objetos. In: WORKSHOP IBEROAMERICANO DE<br />

ENGENHARIA DE REQUISITOS E AMBIENTES DE SOFTWARE,


(IDEAS), 1998, Torres. Anais... Porto Alegre: Instituto <strong>de</strong> Informática /<br />

UFRGS, 1998. v.2, p298-309.<br />

[SIL 00] SILVA, R. P. Suporte ao <strong>de</strong>senvolvimento e uso <strong>de</strong> frameworks e<br />

componentes. Porto Alegre: Instituto <strong>de</strong> Informática / UFRGS, 2000.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!