Aula Prática 8 · Programação com Objectos
Resolução do Exercício 5 (EP5).
Utilização de um padrão de desenho determinado para aumentar a funcionalidade de uma aplicação.
Considere um editor gráfico que mantém informação sobre várias formas. O editor coloca à disposição do utilizador um conjunto de operações:
Criação de um quadrado, círculo ou linha: cada forma é identificada por um identificador único (inteiro), determinado no momento da criação pelo construtor da classe base dos objectos gráficos, a classe Form ;
Remoção de uma forma: o utilizador deve indicar o identificador da forma a remover;
Deslocamento de uma forma: o utilizador deve indicar o identificador da forma a mover, assim como o deslocamento, nos eixos x e y, a aplicar à forma seleccionada.
Desenhar todas as formas: consiste em desenhar todas as formas mantidas pelo editor;
Sair da aplicação.
O conjunto de formas existentes no editor são guardados pelo objecto que representa o editor gráfico (uma instância da classe Editor ). Este objecto é também responsável por disponibilizar a interface com o utilizador. A interacção com o utilizador faz-se através das habituais classes Menu , Form, Display e Command .
Cada forma tem estado próprio e funcionalidade que são caracterizados pela classe de que são instâncias. Assim, é possível desenhar e mover cada forma, mas cada classe específica determina a concretização da acção abstracta:
Um quadrado (classe Square ) é cartacterizado por um ponto (canto inferior esquerdo) e pelo tamanho do lado. Desenhar um quadrado corresponde a escrever o valor do canto e o tamanho do lado. Mover um quadrado corresponde a deslocar o canto;
Um círculo (classe Circle ) é caracterizado por um ponto (centro do círculo) e pelo raio. Desenhar um círculo corresponde a escrever os valores do centro e do raio. Mover um círculo corresponde a deslocar o centro;
Uma linha (classe Line ) é caracterizada por dois pontos (as extremidades da linha). Desenhar uma linha corresponde a escrever os pontos. Mover uma linha corresponde a deslocar os dois pontos.
Pretende-se alterar a funcionalidade do editor gráfico (fornecida em anexo) inserindo um mínimo de alterações ao código já existente. A nova versão do editor contém o conceito de grupo, correspondente a um agrupamento de formas.Quando se move um dado grupo, é aplicado o mesmo deslocamento a todos os objectos gráficos que constituiem o grupo. Desenhar um grupo, corresponde a desenhar todos os objectos que pertencem ao grupo. Cada grupo é, tal como as formas, também identificado por um número único.
A nova funcionalidade corresponde às seguintes operações:
Criar um novo grupo de formas: quando se cria um grupo de formas, tem que se indicar a lista de formas que fazem parte do grupo, especificando os seus identificadores;
Desfazer um grupo: corresponde a remover as formas do grupo e a remover o grupo. Os elementos do grupo removido continuam a existir
Para realizar estas operações exige-se a aplicação de um determinado padrão de desenho (outras soluções, embora potencialmente funcionais, serão desconsideradas).
Além do conceito de grupo, a nova versão deve ser capaz de guardar o seu estado, podendo recuperá-lo mais tarde (no início de uma nova execução).