(→Parte 1) |
|||
Line 5: | Line 5: | ||
'''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''. | '''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''. | ||
− | + | <div style="padding: 8px; border-style: dashed; border-width: 1px; border-color: #2f6fab; background: #f9f9f9; "> | |
− | + | 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). | |
− | + | </div> | |
'''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.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. | ||
− | + | <div style="padding: 8px; border-style: dashed; border-width: 1px; border-color: #2f6fab; background: #f9f9f9; "> | |
− | + | * Herança: permite a abstracção de características comuns | |
− | + | * Herança: permite escrita de código em função de conceitos gerais (este código pode vir a ser reutilizado em especializações do conceito) | |
+ | * Polimorfismo (especialmente de inclusão): permite que o código escrito para tratar objectos de um tipo venha a ser utilizado para processar objectos de tipos derivados | ||
+ | * Java: classes e interfaces, herança de classes (extends), implementação de interfaces (implements) | ||
+ | * Java (conceitos relacionados): redefinição de métodos (''overriding'') | ||
+ | </div> | ||
'''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. | '''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. | ||
+ | |||
+ | <div style="padding: 8px; border-style: dashed; border-width: 1px; border-color: #2f6fab; background: #f9f9f9; "> | ||
+ | Aspectos importantes: | ||
+ | * Descrição comparativa das estruturas correspondentes | ||
+ | * Descrição comparativa do funcionamento | ||
+ | * Implicações, em termos de impacto para o cliente e acções por parte do cliente | ||
+ | </div> | ||
'''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. | '''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. | ||
+ | |||
+ | <div style="padding: 8px; border-style: dashed; border-width: 1px; border-color: #2f6fab; background: #f9f9f9; "> | ||
+ | Aspectos importantes: | ||
+ | *Descrição da estrutura e funcionamento do Visitor | ||
+ | *Princípio de funcionamento (double dispatching): os objectos da estrutura de dados implementam um método (accept) que recebe qualquer visitante (polimorfismo); nesse método, é invocado sobre visitante o método que tem como argumento o objecto visitado (e que todos os visitantes têm de implementar). | ||
+ | *Vantagens: é possível associar funcionalidade adicional a objectos sem necessidade de alterar as suas classes (a funcionalidade é específica para cada objecto visitado) | ||
+ | *Desvantagens: devido ao número de métodos a implementar, pode não ser conveniente utilizar esta arquitectura, especialmente se não houver necessidade de ampliar a funcionalidade a associar aos objectos (o número total de métodos a manter é o produto do número de visitados pelo número de visitantes); a adição de um novo tipo de objecto ao conjunto dos visitados obriga à escrita de um novo método em todos os visitantes. | ||
+ | *Exemplos: geração de código num compilador a partir de uma árvore sintáctica; desenho de uma cena a partir de uma descrição abstracta; cálculo de impostos sobre uma estrutura composta. Em geral, situações em que uma operação a realizar sobre uma estrutura de objectos e suas folhas possa ser generalizada. | ||
+ | </div> | ||
'''1.5.''' Considere o seguinte programa em Java: <java5> | '''1.5.''' Considere o seguinte programa em Java: <java5> | ||
Line 72: | Line 92: | ||
'''1.5.1.''' (1.0 val.) Que resultado se obtém quando se executa o seguinte programa? (represente mudanças de linha com '''\n''') | '''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? | '''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.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'''). | ||
+ | |||
+ | <div style="padding: 8px; border-style: dashed; border-width: 1px; border-color: #2f6fab; background: #f9f9f9; "> | ||
+ | Note-se que alguns objectos (anotados) não definem as variáveis associadas no momento indicado. | ||
+ | |||
+ | [[Image:PO-20120107-seq.png]] | ||
+ | </div> | ||
'''1.6.''' Considere o seguinte domínio: | '''1.6.''' Considere o seguinte domínio: | ||
Line 85: | Line 115: | ||
'''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.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. | ||
− | + | <div style="padding: 8px; border-style: dashed; border-width: 1px; border-color: #2f6fab; background: #f9f9f9; "> | |
− | |||
− | = | ||
− | |||
− | |||
− | |||
− | : | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Esboço do diagrama de classes para o problema apresentado. | Esboço do diagrama de classes para o problema apresentado. | ||
[[Image:PO-20120107-class.png|884x551px|PO-20120107-class.png]] | [[Image:PO-20120107-class.png|884x551px|PO-20120107-class.png]] | ||
+ | </div> | ||
− | + | '''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> | ||
Line 227: | Line 127: | ||
</java5> | </java5> | ||
− | == | + | == Parte 2 (resposta múltipla) == |
− | |||
[[Image:UML-teste-po-20120107.png|frame|right|UML-teste-po-20120107.png]] '''2.1.''' Considere o diagrama UML da figura 1 (à direita). Qual das seguintes afirmações está correcta? | [[Image:UML-teste-po-20120107.png|frame|right|UML-teste-po-20120107.png]] '''2.1.''' Considere o diagrama UML da figura 1 (à direita). Qual das seguintes afirmações está correcta? | ||
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...