A primeira parte do teste tem a cotação máxima de 7.5 valores e contém 15 perguntas de resposta múltipla
1.1. Considere o diagrama UML da figura 1 (à direita). Qual das seguintes afirmações está correcta?
1.2. Em Java, qual das seguintes afirmações é verdadeira?
1.3. Em Java, e acerca de classes abstractas e interfaces, qual é a afirmação verdadeira?
1.4. Considerando a linguagem de programação Java, qual das seguintes frases está correcta?
1.5. Qual das seguintes afirmações é verdadeira em Java?
1.6. Em Java, qual das seguintes frases é verdadeira, relativamente ao uso da palavra reservada “final”:
1.7. Qual das seguintes opções completa de forma correcta a seguinte frase: Em Java, os construtores...
1.8. Qual das seguintes afirmações é verdadeira em Java?
1.9. Qual das seguintes opções completa de forma correcta a seguinte frase: Em Java, a palavra reservada “import”...
1.10. Em Java, e considerando o método genérico fromArrayToCollection, e o seguinte fragmento de código, qual ou quais das linhas contêm instruções ilegais:
static <T> void fromArrayToCollection(T[] a, Collection<T> c) { for (T o : a) { c.add(o); } } 1. Object[] oa = new Object[100]; 2. Collection<Object> co = new ArrayList<Object>(); 3. fromArrayToCollection(oa, co); 4. 5. String[] sa = new String[100]; 6. Collection<String> cs = new ArrayList<String>(); 7. fromArrayToCollection(sa, cs); 8. fromArrayToCollection(sa, co); 9. 10.Integer[] ia = new Integer[100]; 11.Collection<Integer> ci = new ArrayList<Integer>(); 12.fromArrayToCollection(ia, ci); 13.fromArrayToCollection(ia, cs);
1.11. Sobre os padrões Adapter e Decorator, qual é a afirmação verdadeira?
1.12. Em Java, qual ou quais das linhas do seguinte programa contêm instruções ilegais:
Ficheiro A.java: 1. package Uma; 2. public class A { 3. void x() { System.out.println("x"); } 4. protected void y() { System.out.println("y"); } 5. public void z() { System.out.println("z"); } 6. } Ficheiro B.java: 7. package Outra; 8. import Uma.*; 9. class B extends A { 10. void metodo(A a, B b) { 11. a.x(); 12. a.z(); 13. b.x(); 14. b.y(); 15. b.z(); 16. } 17.}
1.13. Indique a frase verdadeira acerca do padrão Decorator:
1.14. Qual das seguintes frases se aplica ao padrão de desenho Command?
1.15. Qual dos seguintes inconvenientes é um dos inconvenientes do padrão de desenho Factory Method?
2.1. (1.5 val.) Descreva o padrão de desenho Observer, indicando as suas vantagens e inconvenientes.
2.2. (1.5 val.) Considere a modelação, em Java, do seguinte problema: um construtor de aviões constrói aparelhos que podem ser equipados com motores de vários fabricantes, desde que obedeçam às especificações do produtor da aeronave, que toma a decisão com base nas características do avião e nas preferências das companhias aéreas suas clientes. É crítico que, para além das especificações do produtor, não haja dependência na construção da aeronave face aos pormenores de construção dos motores, nem vice-versa: o produtor da aeronave deve pode mudar facilmente de um fabricante de motores para outro e assim melhorar o serviço ao cliente. Que padrão(ões) de desenho poderia aplicar? Descreva sucintamente o modelo resultante.
2.3. Considere o seguinte programa em Java: <java5> abstract class A {
public char getChar() { return 'X'; } protected abstract void computeChar(); protected abstract void destroyChar(); public final void doIt() { computeChar(); System.out.print(getChar()); destroyChar(); }
}
class B extends A {
protected void computeChar() { System.out.print(“ computeChar B “); } protected void destroyChar() { System.out.print(“ destroyChar B “); }
}
class C extends A {
public char getChar() { return 'Y'; } protected void computeChar() { System.out.print(“ computeChar C “); } protected void destroyChar() { System.out.println(“ destroyChar C “); }
}
public class Misterio {
public static void main(String[] args) { A[] array = {new B(), new C()}; for (A a: array) a.doIt(); System.out.println(“”); }
} </java5>
2.3.1. (0.75 val.) Qual o resultado que se obtém quando se executa o programa? (represente mudanças de linha com \n)
2.3.2. (0.75 val.) Que padrão de desenho é usado no programa?
2.4. (2.5 val.) Desenhe o diagrama de classes UML correspondente ao seguinte problema:
Uma empresa de caminhos de ferros é constituída por um conjunto de comboios e por vários empregados. Cada empregado é identificado por um dado número dentro da empresa e tem um dado salário. Existem dois tipos de empregados, os revisores e os condutores. Os primeiros são responsáveis por validar os bilhetes dos passageiros enquanto que os segundos conduzem comboios.
Um comboio é constituído por uma locomotiva e por uma ou mais carruagens. As locomotivas, por seu turno, podem ser eléctricas ou a diesel; e as carruagens podem ser de passageiros (são caracterizadas pelo número de lugares sentados) ou de mercadorias (são caracterizadas pela capacidade de carga). As carruagens de passageiros podem ainda dividir-se em classe executiva ou de turística. Nas carruagens de classe executiva apenas há lugares sentados, enquanto que nas de classe turística há lugares sentados e em pé. Todos os tipos de carruagem são ainda caracterizados pelo peso em vazio. As locomotivas são caracterizadas pela potência de tracção e pelo peso. Cada comboio tem um dado percurso a realizar que é representado pelas estações nas quais o comboio tem que parar.
Cada passageiro tem um nome e uma morada e possui pelo menos um bilhete para uma viagem de comboio. Cada bilhete indica, além da classe (executiva ou turística) e do preço correspondente, a estação de partida e a estação de chegada.
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.5. (1.5 val.) Desenhe o “diagrama de sequência” UML correspondente à execução do seguinte programa Java (este programa corresponde à pergunta 3 da segunda parte) . O diagrama de sequência deve conter os nomes das mensagens trocadas, mas não é necessário representar os argumentos dessas mensagens nem as correspondentes ao retorno. Não se esqueça de representar a criação de novos objectos.
<java5> abstract class A {
public char getChar() { return 'X'; } protected abstract void computeChar(); protected abstract void destroyChar(); public final void doIt() { computeChar(); System.out.print(getChar()); destroyChar(); }
}
class B extends A {
protected void computeChar() { System.out.print(“ computeChar B “); } protected void destroyChar() { System.out.print(“ destroyChar B “); }
}
class C extends A {
public char getChar() { return 'Y'; } protected void computeChar() { System.out.print(“ computeChar C “); } protected void destroyChar() { System.out.println(“ destroyChar C “); }
}
public class Misterio {
public static void main(String[] args) { A[] array = {new B(), new C()}; for (A a: array) a.doIt(); System.out.println(“”); }
}
</java5>
2.6. (4.0 val.) No jogo da tesoura, papel e pedra existem dois jogadores em que cada um pode jogar uma das seguintes três peças: tesoura, papel e pedra. A tesoura ganha ao papel, o papel ganha à pedra e a pedra ganha à tesoura. Jogadas com pedras iguais dão resultado a um empate. Primeiro defina, em Java, a classe ou as classes necessárias para representar os três tipos de peças deste jogo. Segundo, defina uma classe em Java que permite guardar as jogadas realizadas por cada um dos dois jogadores. Não é obrigatório introduzir as jogadas dos jogadores de forma alternada, pode-se indicar duas do primeiro jogador, três do segundo e outrs do primeiro, por exemplo. Adicionalmente, esta classe tem a funcionalidade que em qualquer momento pode-se saber quantas jogos foram ganhos pelo primeiro jogador e pelo segundo jogador e quantos terminaram empatados. Se no momento da execução desta funcionalidade o número de jogadas do primeiro jogador não for igual ao número de jogadas do segundo então deve ser gerado uma excepção do tipo NumeroJogadasInvalido (classe a concretizar também). Pretende-se ter uma solução em que seja possível adicionar novos tipos de peças sem que seja necessário alterar nenhum dos métodos já realizados.
2.6.1. Complete o seguinte código no que diz respeito à classe Jogo e especifique também a classe NumeroJogadasInvalido. Deve completar os métodos que não estão preenchidos e deve definir os atributos que ache necessário para guardar a informação relativa a um jogo. Assuma que a determinação do resultado de uma jogada é da responsabilidade da classe ou classes que representam as peças do jogo (representada(s) pelo tipo Peca no código a completar).
<java5> import java.util.*; public class Jogo {
public Jogo() { } /** * Adiciona uma jogada para o jogador 1. * @param peca a peça jogada pelo jogador 1 **/ public void adicionaJogada1(Peca peca) { } /** * Adiciona uma jogada para o jogador 2. * @param peca a peça jogada pelo jogador 2 **/ public void adicionaJogada2(Peca peca) { } /** * Escreve o resultado no stdout (VIT, EMP, DER relativamente ao jogador 1) para cada * jogada realizada pelos dois jogadores. * * @throws NumeroJogadasInvalido caso os dois jogadores tenham jogado um número distinto * de jogadas. **/ public void escreveResultado() { }
} </java5>
2.6.2. Defina a classe ou classes que concretizam o comportamento das várias peças do Jogo. A solução deve suportar a inserção de novos tipos de peças com um mínimo de alterações ao código já realizado.
1.1. Considere o diagrama UML da figura 1 (à direita). Qual das seguintes afirmações está correcta?
1.2. Em Java, qual das seguintes afirmações é verdadeira?
1.3. Em Java, e acerca de classes abstractas e interfaces, qual é a afirmação verdadeira?
1.4. Considerando a linguagem de programação Java, qual das seguintes frases está correcta?
1.5. Qual das seguintes afirmações é verdadeira em Java?
1.6. Em Java, qual das seguintes frases é verdadeira, relativamente ao uso da palavra reservada “final”:
1.7. Qual das seguintes opções completa de forma correcta a seguinte frase: Em Java, os construtores...
1.8. Qual das seguintes afirmações é verdadeira em Java?
1.9. Qual das seguintes opções completa de forma correcta a seguinte frase: Em Java, a palavra reservada “import”...
1.10. Em Java, e considerando o método genérico fromArrayToCollection, e o seguinte fragmento de código, qual ou quais das linhas contêm instruções ilegais:
<java5>
static <T> void fromArrayToCollection(T[] a, Collection<T> c) { for (T o : a) { c.add(o); } } /*1.*/ Object[] oa = new Object[100]; /*2.*/ Collection<Object> co = new ArrayList<Object>(); /*3.*/ fromArrayToCollection(oa, co); /*4.*/ /*5.*/ String[] sa = new String[100]; /*6.*/ Collection<String> cs = new ArrayList<String>(); /*7.*/ fromArrayToCollection(sa, cs); /*8.*/ fromArrayToCollection(sa, co); /*9.*/ /*10.*/ Integer[] ia = new Integer[100]; /*11.*/ Collection<Integer> ci = new ArrayList<Integer>(); /*12.*/ fromArrayToCollection(ia, ci); /*13.*/ fromArrayToCollection(ia, cs);
</java5>
1.11. Sobre os padrões Adapter e Decorator, qual é a afirmação verdadeira?
1.12. Em Java, qual ou quais das linhas do seguinte programa contêm instruções ilegais:
<java5>
// Ficheiro A.java: /*1.*/ package Uma; /*2.*/ public class A { /*3.*/ void x() { System.out.println("x"); } /*4.*/ protected void y() { System.out.println("y"); } /*5.*/ public void z() { System.out.println("z"); } /*6.*/ }
</java5>
<java5>
// Ficheiro B.java: /*7.*/ package Outra; /*8.*/ import Uma.*; /*9.*/ class B extends A { /*10.*/ void metodo(A a, B b) { /*11.*/ a.x(); /*12.*/ a.z(); /*13.*/ b.x(); /*14.*/ b.y(); /*15.*/ b.z(); /*16.*/ } /*17.*/ }
</java5>
1.13. Indique a frase verdadeira acerca do padrão Decorator:
1.14. Qual das seguintes frases se aplica ao padrão de desenho Command?
1.15. Qual dos seguintes inconvenientes é um dos inconvenientes do padrão de desenho Factory Method?
Esboço do diagrama de classes para o problema apresentado.
File:PO-December2005-class.png
Note-se que alguns objectos não indicam variáveis associadas (os resultados da criação desses objectos são imediatamente passados como argumentos).