A primeira parte do teste (5 valores) contém 10 (dez) perguntas de resposta múltipla (cinco respostas possíveis), havendo apenas uma resposta correcta para cada pergunta.
1.1. Considere o diagrama UML da figura 1 (à direita). Qual das seguintes afirmações está correcta?
1.2. Como se designa a propriedade das linguagens de programação com objectos que permite um objecto ser referenciado através de vários tipos?
1.3. Em Java, qual das seguintes frases está correcta?
1.4. A utilização de uma referência de um tipo onde é esperada uma de um tipo hierarquicamente superior designa-se por:
1.5. Em Java, a operação de serialização...
1.6. Em Java, o método equals...
1.7. Relativamente à classe java.lang.String, qual das seguintes frases está correcta?
1.8. Ao utilizar o padrão de desenho Proxy passa a ser possível...
1.9. O padrão de desenho Decorator...
1.10. O padrão de desenho Abstract Factory...
2.1. (1.5 val.) Suponha que pretende construir uma aplicação para gestão de uma Universidade em que os alunos estão organizados por cursos, em cada curso por turmas e em cada turma por grupos. A aplicação deve ser o mais simples possível e tem de executar algumas tarefas a todos os alunos, outras tarefas a alunos um único curso, outras aos alunos de uma turma, e por vezes a grupos de alunos. Por outro lado as tarefas a executar têm pequenas alterações dependendo do curso: algumas das sub-tarefas são específicas de cada curso. Que padrão (ou padrões) de desenho utilizaria na solução deste problema? Descreva sucintamente a aplicação do(s) padrão(ões) escolhido(s) neste contexto.
2.2. (1.0 val.) Os padrões Adapter e Bridge são normalmente classificados como estruturais. Quais são os objectivos de cada um destes padrões de desenho. Acha que os padrões de desenho são alternativos (só um deles pode ser usado) ou compatíveis (podem ser simultaneamente usados). Justifique.
2.3. (1.5 val.) Um dos pilares da programação orientada a objectos é o polimorfismo. Indique (por palavras suas) o que entende por polimorfismo e como este é conseguido em Java.
2.4. (1.5 val.) Considere a seguinte hierarquia de objectos que tem como superclasse Pessoa: Empregado e Estudante herdam de Pessoa; Professor herda de Empregado; e AlunoMestrado herda de Estudante. Cada classe tem uma definição do método trabalhar, que encapsula o comportamento dessa pessoa. Pretende-se, por vezes, ter um conhecimento do trabalho realizado por cada uma das pessoas. Assim, pretende-se que seja possível ligar/desligar o registo do início e fim do trabalho de cada um dos objectos da hierarquia durante a execução do programa. Que padrão de desenho pode ser usado? Explique como o usaria.
2.5. Considere o seguinte programa em Java: <java5> abstract class Seasoning {
public abstract String taste(); public String toString() { return "(seasoning)"; }
}
class Salt extends Seasoning {
public String taste() { return "Salty"; } public String toString() { return "Salt"; }
}
class Pepper extends Seasoning {
public String taste() { return "Hot"; } public String toString() { return "Pepper"; }
}
abstract class Edible {
public Seasoning _seasoning = new Salt(); public void setSeasoning(Seasoning s) { _seasoning = s; } public abstract void show();
}
class PopCorn extends Edible {
public void setSeasoning(Seasoning s) { _seasoning = s; } public void show() { System.out.println(_seasoning.taste() + " " + this); } public String toString() { return "pop corn"; }
}
public class App {
public static void main(String args[]) { Edible e = new PopCorn(); e.setSeasoning(new Salt()); e.show(); e.setSeasoning(new Pepper()); e.show(); }
} </java5>
2.5.1. (1.0 val.) Qual o resultado que se obtém quando se executa o programa? (represente mudanças de linha com \n)
2.5.2. (0.5 val.) Que padrão de desenho é usado no programa?
2.6. (2.5 val.) Desenhe o diagrama de classes UML correspondente ao seguinte problema:
Uma fábrica produz televisões entre outros produtos electrónicos. Os funcionários são engenheiros informáticos, engenheiros electrotécnicos, engenheiros mecânicos, operários e empregados de limpeza. Os engenheiros são responsáveis por projectar as televisões e pela coordenação dos operários e empregados de limpeza. A empresa mantém o registo do nome de todos os funcionários e da data de formatura dos seus engenheiros.
As televisões produzidas são de três tipos: cinescópio, LCD e plasma. Todas as televisões têm resistências, condensadores e transístores. As televisões de cinescópio têm como principais componentes o cinescópio, um único altifalante, e um conjunto de botões. Os LCD têm dois altifalantes, um painel de cristais líquidos e não usam botões por terem todos controlos (ligar, desligar, trocar de canal e controlar volume) no telecomando. As televisões de plasma são semelhantes aos LCD, sendo o painel de cristais líquidos substituído por um painel de laser), mas têm um altifalante extra: um subwoofer.
Para controlar a gestão da empresa, existem ainda dois directores e vários contabilistas. Os contabilistas são responsáveis por calcular o lucro da empresa, calculado com base no custo de produção de cada televisão, no número de televisões vendidas e nos ordenados dos seus funcionários.
Represente as classes pelos seus nomes, métodos e atributos. Indique também as relações de herança, associação e agregação.
2.7. (1.5 val.) Desenhe o diagrama de sequência UML correspondente à execução do programa da pergunta 2.5, 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 correspondentes ao retorno).
2.8. (2.0 val.) Considere o seguinte problema. Uma folha de cálculo tem células que podem conter números, cadeias de caracteres, fórmulas e referências para valores de outras células (linha e coluna). As fórmulas têm argumentos que podem ser números, cadeias de caracteres, resultados da avaliação de outras fórmulas e referências para valores de células. A folha de cálculo pode ser guardada num ficheiro e lida novamente. Concretize este problema em Java, definindo as classes que achar necessárias.
2.9. (2.0 val.) Altere o programa por forma a que seja simples adicionar novo conteúdo a uma página. A nova aplicação deve suportar novas organizações, em particular, deve admitir barras laterais com imagens e caixas com textos auxiliares. Altere o menos possível a aplicação abaixo. <java5> import java.util.*;
class Page {
private PageItem _item; public Page(PageItem item) { _item = item; } public void show() { _item.render(); }
}
abstract class PageItem { abstract void render(); }
class Text extends PageItem {
private String _content = ""; public Text(String content) { _content = content; } public String getContent() { return _content; } public void render() { System.out.println(content); }
}
public class App {
public static void main(String args[]) {
Text text = new Text("text"); Page page = new Page(text); page.show();
}
} </java5>
1.1. Considere o diagrama UML da figura 1 (à direita). Qual das seguintes afirmações está correcta?
1.2. Como se designa a propriedade das linguagens de programação com objectos que permite um objecto ser referenciado através de vários tipos?
1.3. Em Java, qual das seguintes frases está correcta?
1.4. A utilização de uma referência de um tipo onde é esperada uma de um tipo hierarquicamente superior designa-se por:
1.5. Em Java, a operação de serialização...
1.6. Em Java, o método equals...
1.7. Relativamente à classe java.lang.String, qual das seguintes frases está correcta?
1.8. Ao utilizar o padrão de desenho Proxy passa a ser possível...
1.9. O padrão de desenho Decorator...
1.10. O padrão de desenho Abstract Factory...
Duas soluções competem por este problema:
É possível que o caso do Visitor, apesar de ser mais flexível, apresentasse alguma repetição de código (passível, possivelmente, de ser factorizado em métodos internos definidos para o efeito: eventualmente, em casos mais complexos, poder-se-ia ter uma aplicação do Template Method na definição do Visitor).
O padrão Adapter permite adaptar uma interface para outros usos. Existem duas formas de adaptação: de classe e de objecto. A primeira (mais estática), adapta um tipo (i.e., todas as instâncias), utilizando o processo de herança ou implementação de interface; a segunda adapta objectos individuais (composição de objectos).
O padrãp Bridge permite implementar uma hierarquia de conceitos (clientes) à custa de uma outra (independente) que os implementam. Ambas as hierarquias evoluem independentemente, mantendo-se ligadas pela ponte.
Os padrões não apresentam características que impeçam a sua utilização conjunta.
A resposta correcta conteria a definição de polimorfismo (em geral), seguida das formas de polimorfismo disponíveis em Java:
Dois padrões permitiriam resolver (independentemente um do outro) este problema:
Em ambos os casos, tudo o que havia a fazer seria encapsular o objecto cujo método é executado pelo decorador ou pelo proxy. Estes iriam realizar as acções de início (antes de invocar o método) e de finalização (depois de invocar), sem haver necessidade de alterar o objecto inicial.
Salty pop corn\nHot pop corn\n
O padrão utilizado é o Strategy (método "taste").
Esboço do diagrama de classes para o problema apresentado.
Note-se que alguns objectos não indicam variáveis associadas. É o caso das instâncias de Salt e Pepper (os resultados da criação desses objectos são imediatamente passados como argumentos do método setSeasoning no método App.main).
Conceitos importantes:
Os conceitos teriam de implementar a interface java.io.Serializable.
Na organização do conteúdo, poder-se-ia utilizar o padrão Composite (i.e., uma fórmula tem argumentos -- uma colecção -- que podem ser de várias formas, incluindo fórmulas).
Este problema resolvia-se por recurso ao padrão Composite, bastando definir os novos conceitos como subclasses de PageItem.
Note-se que a preocupação é com a representação interna da página e não com o processo específico de fazer o "rendering" gráfico final.