Artigo - Magic: Um Framework para Jogos de Cartas
Artigo - Magic: Um Framework para Jogos de Cartas
Artigo - Magic: Um Framework para Jogos de Cartas
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.