Frameworks e Componentes
Projeto
O projeto da disciplina consiste em desenvolver 3 aplicações
relacionadas usando frameworks e componentes. Num primeiro momento, 3 aplicações
relacionadas, isto é, do mesmo domínio de problema, são desenvolvidas usando pelo menos
3 design patterns diferentes (na soma dos programas, não necessariamente em cada um).
Nestes programas, testes de unidade devem ser realizados com o framework de testes JUNIT.
Em seguida, um framework usando componentes deve ser projetado para o domínio de problema
sob consideração e as aplicações reescritas usando o framework.
Você pode escolher o domínio do problema, mas lembre que as aplicações
devem ser pequenas, já que 3 aplicações serão escritas, cada uma em duas
versões. Sugerimos que você utilize "jogos de cartas" como domínio de
problema. Especificamente, o domínio de problema "jogos de poquer" ou
"jogos de paciência" poderiam ser escolhidos como domínios de problema, já
que vários tipos similares de tais jogos existem. Uma sugestão segue abaixo. Observe que
as aplicações não precisam ter capricho visual e não precisam sequer utilizar
interface gráfica (mas seria legal, né?).
Você pode formar equipes de 2 pessoas. Os programas devem ser
desenvolvidos em uma das seguintes linguagens: Java (de preferência), C++, Object Pascal.
O paradigma deve obviamente ser Orientado a Objeto. Observe entretanto que o framework
JUNIT utilizado no projeto não está disponível para qualquer linguagem.
Antes de iniciar o projeto, vale a pena ler o artigo: Evolving Frameworks.
A lista de milestones e detalhes do que entregar ao professor para cada
milestone seguem.
- Entrega dos requisitos funcionais e de interface
dos programas a desenvolver. Entregue uma descrição dos requisitos funcionais e
uma idéia de como será a interface dos três programas. O motivo de eu pedir detalhes da
interface é de ter certeza de que não haverá capricho demais (para que você
não perca tempo).
- Entrega do primeiro programa. Entregue o
código fonte documentado. Se usar Java, entregue também a saída do javadoc. Nos
comentários, identifique claramente os design patterns utilizados. Adicionalemente,
entregue o código fonte de todos os testes de unidade realizados. Use o framework de
testes JUNIT disponível na home page. Se o framework não existir para sua linguagem,
você terá que implementá-lo (como isso é trabalhoso, talvez seja melhor mudar de
linguagem). Não esqueça de entregar um arquivo de lote (.bat) ou script
(se for feito no unix) para executar seu programa e outro para executar os testes.
- Entrega do segundo programa. Idem.
- Entrega do terceiro programa. Idem.
- Entrega do design do framework. Entregue
o modelo de projeto (diagramas de classe) documentado. Se usar Java, entregue também a
saída do javadoc indicando que o design detalhado está feito. Lembre que o framework
deve ser baseado em componentes; portanto, identifique bem quais são componentes, suas
propriedades e como eles se interligam. Deixe bastante claro num documento à parte
como o framework é usado para contruir uma nova aplicação (devo instanciar o quê?
conectar o quê?, ...).
- Entrega do framework com 3 aplicações.Entregue
o código fonte documentado do framework e dos testes de unidade. Se usar Java, entregue
também a saída do javadoc. Entregue também um documento consistindo de 2 partes. A
primeira é um manual do usuário do seu framework. A segunda é uma comparação
criteriosa entre as implementações das aplicações com e sem framework. Inclua uma
indicação de do percentual de código que cada aplicação deve adicionar ao framework.
Não esqueça de entregar um arquivo de lote (.bat) ou script (se for feito no unix) para
executar as aplicações e outro para executar os testes.
Uma sugestão para os três programas
Se você não achar um domínio de problema adequado, considere os três
jogos abaixo, todos variantes de um jogo de paciência. Os três jogos podem ser vistos em
ação no pacote Pretty Good Solitaire.
Jogo 1: Aces Up
Partes do Jogo
- Um baralho de 52 cartas;
- 1 pilhas de cartas, chamada Fundação, na qual as cartas são descartadas;
- Um Tableau com 4 pilhas de cartas;
- Uma pilha, chamada Estoque, de onde são retiradas as cartas.
Início
Quando o jogo é iniciado, o Estoque contém todas as cartas do
baralho. Logo em seguida, 4 cartas são retiradas do Estoque e dispostas no Tableau, uma
em cada pilha.
Objetivo do Jogo
Mover todas as cartas do Estoque para a Fundação.
Regras
São tiradas 4 cartas de cada vez que se usa o estoque. Cada uma delas vai para uma das
pilhas do Tableau. Não há como retornar cartas ao estoque.
Uma carta só pode ser descartada quando há mais de uma carta do mesmo naipe no topo de
alguma das outras pilhas e não for a maior dentre todas.
Podemos ir descartando as cartas até que todas sejam de diferentes naipes, quando será
necessário pegar uma outra mão de cartas do estoque;
O ás é maior do que o rei;
Para ganhar, é necessário descartar todas as cartas exceto os ases, ou seja, cada
pilha do tableau conterá apenas um ás;
As pilhas vazias podem ser preenchidas com qualquer uma das cartas do topo das outras
pilhas.
Dicas
- Só devemos descartar um ás depois de todas as cartas do mesmo naipe ter sido
descartada. Caso contrário não será possível ganhar;
- Ao conseguir esvaziar uma pilha do Tableau, é preferível colocar uma das cartas no
topo das outras pilhas.
Jogo 2: Baker's Dozen
Partes do Jogo
- Um baralho de 52 cartas;
- 4 pilhas de cartas do mesmo naipe, chamadas de Fundações;
- 13 pilhas de cartas, inicialmente com 4 cartas, dispostas em um Tableau.
Início
Quando o jogo é iniciado, as 13 pilhas do Tableau são preenchidas com
4 cartas cada, de maneira que os reis permaneçam no final de uma pilha. As 4 Fundações
iniciam vazias.
Objetivo do Jogo
Mover todas as cartas para as Fundações em ordem crescente a partir
do ás. O jogo termina quando todas as cartas foram movidas para as Fundações,
completando todos os naipes (situação em que o jogador vence o jogo) ou quando não é
mais possível movimentar as cartas do Tableau.
Regras
- Pode-se mover uma carta de uma pilha para outra desde que a mesma tenha um valor
imediatamente inferior ao valor da carta no topo da pilha destino, não importando a que
naipe pertence.
- A carta no topo de uma pilha está disponível para ir para uma outra pilha do Tableau
ou para a Fundação correspondente ao seu naipe.
- Somente uma carta por vez pode ser movimentada.
- Quando uma pilha do Tableau é esvaziada, a mesma não pode ser utilizada novamente.
Jogo 3: Captive Queens
Partes do Jogo
- Um baralho de 52 cartas;
- 4 pilhas de cartas, uma para cada naipe, chamadas de Fundações, que iniciam com a
carta de número 5;
- 4 pilhas de cartas, uma para cada naipe, chamadas de Fundações, que iniciam com a
carta de número 6;
- 4 lugares para as rainhas dos naipes;
- Uma pilha, chamada Estoque, de onde são retiradas as cartas;
- Uma pilha para descartar as cartas do Estoque.
Início
Quando o jogo é iniciado, o Estoque contém todas as cartas do
baralho. Todas as outras pilhas iniciam vazias.
Objetivo do Jogo
Completar todas as pilhas e os lugares das rainhas com as cartas do
Estoque.
Regras
- Uma carta do Estoque é retirada por vez. Se a mesma não puder ser colocada em alguma
pilha ou no lugar das rainhas, ela permanece na pilha de descarte;
- As pilhas que iniciam com o valor 5 podem ser completadas com cartas que tenham um valor
imediatamente inferior ao valor da carta no topo da pilha;
- As pilhas que iniciam com o valor 6 podem ser completadas com cartas que tenham um valor
imediatamente superior ao valor da carta no topo da pilha;
- Os lugares das rainhas só podem ser usados para as rainhas correspondentes;
- Somente a carta no topo da pilha de descarte pode ser usada;
- Quando o estoque termina, é possível mover todas as cartas da pilha de descarte para o
estoque e voltar a jogar. A seqüência permanece inalterada. Essa operação só pode ser
utilizada 3 vezes.
Glossário de termos
Pilha de cartas onde o objetivo é construir sobre uma cartas base, normalmente numa
sequência. Na maioria dos jogos, as fundações são contruídas "para cima por
naipe", embora esta regra varie. Também, uma vez que cartas são movidas para
fundações, elas normalmente não podem ser movidas novamente. Ganha-se a maioria dos
jogos de paciência quando todas as cartas foram movidas para as fundações.
Pilhas de cartas onde a construção (ou empacotamento) é normalmente permitido.
Cartas podem ser empacotadas nas cartas expostas de cada pilha, de acordo com regras que
variam de jogo para jogo. Normalmente, o jogo inicia com um certo número de cartas em
cada pilha.Quando todas as cartas de uma pilha tableau foram jogadas em outro lugar, há
normalmente uma regra indicando se, e que tipo de cartas podem ser movidas para o lugar
vazio.
Uma pilha contendo o restante das cartas quando as demais foram arrumadas para o jogo.
Cartas são normalmente retiradas do estoque e jogadas de alguma forma, por exemplo, para
uma pilha de descarte ou para as pilhas tableau.
Uma pilha onde cartas não jogáveis são colocadas. Normalmente, a carta no topo da
pilha de descarte pode ser jogada em outras pilhas. Em alguns jogos, a pilha de descarte
pode ser invertida para assumir a posição de pilha de estoque. Isso se chama
"redeal".
Um grupo de pilha(s) nas quais a construção normalmente não é permitida. Em alguns
casos, todas as cartas de uma reserva estão disponíveis para o jogo, enquanto em outros
casos, apenas a carta de cima está disponível.
Jogue uma carta de um valor acima e do mesmo naipe da carta alvo. Por exemplo, jogue um
5 de
num 4 de
.
Jogue uma carta de um valor abaixo e do mesmo naipe da carta alvo. Por exemplo, jogue
um 8 de
num 9
de
.
Jogue uma carta de um valor acima da carta alvo e de qualquer naipe. Por exemplo, jogue
um 9 de
num 8 de
.
Jogue uma carta de um valor abaixo da carta alvo e de qualquer naipe. Por exemplo,
jogue um 9 de
num
10 de
.
Jogue uma carta de um valor acima da carta alvo e trocando a cor da carta. Por exemplo,
jogue um 9 de
num
8 de
.
Jogue uma carta de um valor acima da carta alvo e trocando a cor da carta. Por exemplo,
jogue um 7 de
num
8 de
.
Inverter a pilha de descarte para que ela passe a ser a nova pilha de estoque. Alguns
jogos permitem um único redeal enquanto outros permitem um número ilimitado de redeals.