Contents[hide] |
1.1. (1.5 val.) Os mecanismos de herança entre classes e de composição de objectos são, por vezes, apresentados como alternativos, face à disponibilização de funcionalidade ao código de uma classe. Compare-os, em termos de potencialidade e flexibilidade. Contraste as diferenças e vantagens relativas no contexto da aplicação do padrão de desenho Strategy.
Pontos importantes: herança permite reutilização e "pré-definição" de comportamento, mas é inflexível e alterações no topo da hierarquia propagam-se inexoravelmente para os níveis inferiores. Strategy permite definição de comportamento por composição (não confundir com uso do padrão Composite), que apresenta maior flexibilidade (podendo ser inclusivamente alterado em tempo de execução).
1.2. (1.5 val.) Relacione o mecanismo de herança e o conceito de polimorfismo e diga de que forma potenciam o desenvolvimento incremental e evitam a repetição de código. Na discussão, foque os aspectos positivos e possíveis limitações. Que conceitos estão disponíveis em Java para realizar aqueles mecanismos? Ilustre com um exemplo.
1.3. (1.5 val.) Tanto o padrão de desenho State como o padrão de desenho Strategy se baseiam na delegação de comportamento por parte do cliente nas instâncias de classes previstas pelo padrão (respectivamente, o estado e a estratégia). Discuta as semelhanças e as diferenças entre os dois padrões, tanto em termos da arquitectura prevista, como da intenção e das consequências da utilização de cada padrão. Apresente exemplos ilustrativos.
Aspectos importantes:
1.4. (1.5 val.) O padrão de desenho Visitor permite abstrair a aplicação de uma operação a uma estrutura de objectos. Diga qual é o princípio de funcionamento do padrão e que vantagens apresenta a sua utilização. Quais são os problemas introduzidos pela utilização do padrão? Dê um exemplo de aplicação.
Aspectos importantes:
1.5. Considere o seguinte programa em Java: <java5> public class Chicken {
private Stomach _stomach = new Hungry(this);
public void eat() { _stomach.eat(); } public void sleep() { _stomach.sleep(); } public void setStomach(Stomach stomach) { _stomach = stomach; } }
public abstract class Stomach { protected Chicken _chicken; protected Stomach(Chicken chicken) { _chicken = chicken; } public void eat() { System.out.println("..."); } public void sleep() { System.out.println("..."); } }
public class Hungry extends Stomach { public Hungry(Chicken chicken) { super(chicken); System.out.println("I'm hungry!!"); }
public void eat() { System.out.println("Eating..."); _chicken.setStomach(new Sated(_chicken)); } public void sleep() { System.out.println("I'm too hungry to sleep!!"); } }
public class Sated extends Stomach { public Sated(Chicken chicken) { super(chicken); System.out.println("I'm sleepy!!"); } public void sleep() { System.out.println("ZzZz..."); _chicken.setStomach(new Hungry(_chicken)); }
}
public class Farm {
public static void main(String args[]) { Chicken chicken = new Chicken(); chicken.eat(); chicken.sleep(); chicken.sleep(); }
} </java5>
1.5.1. (1.0 val.) Que resultado se obtém quando se executa o seguinte programa? (represente mudanças de linha com \n)
I'm hungry!!\nEating...\nI'm sleepy!!\nZzZz...\nI'm hungry!!\nI'm too hungry to sleep!!\n
1.5.2. (0.5 val.) Que padrão de desenho é usado no programa?
State
1.5.3. (1.5 val.) Desenhe o diagrama de sequência UML correspondente à execução do programa, incluindo as etapas de criação dos objectos. O diagrama de sequência deve conter os nomes das mensagens trocadas (não é necessário representar os argumentos dessas mensagens nem as de retorno; represente todas as chamadas ao método println).
1.6. Considere o seguinte domínio:
Uma editora gere vários tipos de publicação (livros, revistas e tablóides), cada um composto por várias peças (artigos, fotografias e publicidade). Podem ser criados mais tipos, tanto de publicação, como de peça. Nem todos os tipos de peça se podem incluir todas em todas as publicações: nos livros, apenas são incluídos artigos; nas revistas, podem ser inseridos artigos e fotografias; nos tablóides, todas as peças podem aparecer. Todas as publicações e peças são identificadas por um número inteiro. As publicações e peças têm ainda a indicação de qual é o título e de quem é o autor. A editora mantém sobre os seus autores um registo, no qual inclui (sobre cada um) o nome e o número de telefone.
A forma de disponibilização de publicações, i.e., papel, web, meios móveis, etc., permite oferecer variedade ao consumidor, mas complica a definição de uma arquitectura flexível para a aplicação. Inicialmente, estão definidos dois formatos: textual e estruturado. No formato textual, os atributos das publicações são apresentados sucessivamente e as peças e seus atributos são também simplesmente apresentados de forma textual simples (as fotografias são representadas pelo seu título). No formato estruturado, em XML, cada publicação é iniciada e terminada por uma “tag” que a caracteriza (respectivamente, <book>, <magazine>, etc. e </book>, etc.), o mesmo se passando com as peças. Os atributos são apresentados como atributos XML (e.g., para o autor de um livro: <book author="anónimo">). Os elementos internos são ancorados dentro dos externos, como é habitual em XML. A solução de apresentação deve permitir flexibilidade na definição de novas formas de apresentação sem impacto no código existente.
1.6.1. (2.0 val.) Desenhe o diagrama de classes UML correspondente ao domínio apresentado. Represente todas as classes (seus nomes, métodos e atributos). Indique também as relações de herança, associação e agregação.
1.6.2. (4.0 val.) Implemente em Java todas as classes do domínio apresentado, bem como os seus atributos e métodos (excepto getters e setters). Os atributos identificados devem ser suficientes para suportar a funcionalidade e os métodos devem conter implementações que permitam verificar inequivocamente que a funcionalidade desejada (especialmente a que diz respeito às relações entre objectos) está correcta. Não implemente o código correspondente à apresentação sob a forma textual simples.
<java5> // ... </java5>
2.2. Que padrão de desenho permite especificar numa classe o esqueleto de um algoritmo, deixando para as subclasses a concretização dos seus passos?
2.3. O padrão de desenho Adapter...
2.4. O padrão de desenho Observer...
2.5. Relativamente ao padrão de desenho Decorator...
2.6. Em Java, qual das seguintes frases está correcta?
2.7. Em Java, um método declarado private...
2.8. Em Java, o mecanismo de redefinição de métodos...
2.9. Em Java, a utilização da palavra protected...
2.10. Em Java, a interface java.lang.Comparable...