Programação com Objectos/Teste de Dezembro de 2005

From Wiki**3

< Programação com Objectos

Parte 1 (resposta múltipla)

A primeira parte do teste tem a cotação máxima de 7.5 valores e contém 15 perguntas de resposta múltipla

Figura 1

1.1. Considere o diagrama UML da figura 1 (à direita). Qual das seguintes afirmações está correcta?

  1. C é uma implementação de B
  2. A é uma implementação de B
  3. C é uma classe derivada de B
  4. B possui (pelo menos 1) instâncias de C
  5. C é uma agregação de B

1.2. Em Java, qual das seguintes afirmações é verdadeira?

  1. existem classes sem construtores
  2. todas as classes têm, pelo menos, um construtor
  3. todas as classes têm, pelo menos, o construtor sem argumentos definido
  4. cada classe tem de ter, pelo menos, um construtor público
  5. todas as anteriores

1.3. Em Java, e acerca de classes abstractas e interfaces, qual é a afirmação verdadeira?

  1. não há diferenças
  2. as classes abstractas não podem ter atributos “final”
  3. as interfaces não podem ter atributos “final”
  4. pode-se herdar de várias classes abstractas, mas só se pode concretizar uma interface
  5. todas são falsas

1.4. Considerando a linguagem de programação Java, qual das seguintes frases está correcta?

  1. uma classe abstracta não pode ter atributos
  2. uma classe abstracta não pode ter construtores “public”
  3. uma classe abstracta não pode ter construtores “protected”
  4. uma classe abstracta não pode ter métodos “final”
  5. uma classe abstracta não pode ser “final”

1.5. Qual das seguintes afirmações é verdadeira em Java?

  1. é possível modificar o tamanho de um vector
  2. vectores de tipos primitivos não são reciclados automaticamente
  3. pode-se alterar a dimensão de um vector de objectos
  4. não é possível aceder a um vector fora dos seus limites
  5. atributos de objectos que sejam vectores de objectos não podem ser “public”

1.6. Em Java, qual das seguintes frases é verdadeira, relativamente ao uso da palavra reservada “final”:

  1. indica que um método não pode ser sobrecarregado (overloaded)
  2. indica que um método não pode ser substituído (overriden)
  3. indica que um método não pode ser “protected” nem friendly
  4. só podem existir dois métodos “final” por classe
  5. esta palavra reservada só se pode aplicar a atributos e a métodos

1.7. Qual das seguintes opções completa de forma correcta a seguinte frase: Em Java, os construtores...

  1. não podem lançar excepções
  2. não podem alterar os valores dos atributos do objecto a criar
  3. podem chamar outros construtores da mesma classe
  4. não têm acesso aos atributos da classe base
  5. nunca podem ser privados

1.8. Qual das seguintes afirmações é verdadeira em Java?

  1. as classes não são representáveis como objectos
  2. dado um objecto de uma classe não especificada, não é possível saber que métodos são invocáveis sobre ele
  3. existe uma instância da classe Class por cada classe carregada na aplicação
  4. todas as classes são carregadas no início da execução
  5. os métodos não podem ser representados como objectos

1.9. Qual das seguintes opções completa de forma correcta a seguinte frase: Em Java, a palavra reservada “import”...

  1. pode ser utilizada para herdar código de uma superclasse
  2. tem a função inversa à da palavra reservada “export”
  3. tem de ser a primeira instrução do ficheiro
  4. pode ser utilizada para importar campos não “static” das classes
  5. permite declarar uma ou mais classes

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:

  1. linha 8
  2. linhas 3, 7, 8, 12, e 13
  3. linhas 12 e 13
  4. linha 12
  5. linha 13
 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. são equivalentes
  2. o padrão Adapter, ao contrário do padrão Decorator, permite acrescentar novas funcionalidades ao objecto adaptado sem alterar a sua interface
  3. o padrão Decorator permite redefinir completamente a interface do objecto decorado
  4. o objecto decorador não pode ter estado
  5. o padrão Adapter permite redefinir completamente a interface do objecto adaptado

1.12. Em Java, qual ou quais das linhas do seguinte programa contêm instruções ilegais:

  1. linhas 11 e 12
  2. linhas 11 e 13
  3. linha 14
  4. linhas 12 e 15
  5. linhas 13 e 14
 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. dificulta a transição para a tecnologia OO
  2. diminui o número de objectos da aplicação
  3. permite alterar a interface dos objectos decorados
  4. permite adicionar novas funcionalidades aos objectos decorados
  5. nenhum dos anteriores

1.14. Qual das seguintes frases se aplica ao padrão de desenho Command?

  1. permite encapsular um algoritmo
  2. permite especificar os passos de um algoritmo
  3. delega a criação de objectos nas classes derivadas
  4. permite acrescentar comportamento a um objecto sem alterar a sua interface
  5. permite encapsular um pedido como sendo um objecto

1.15. Qual dos seguintes inconvenientes é um dos inconvenientes do padrão de desenho Factory Method?

  1. aumenta o número de objectos da aplicação
  2. nalguns casos diminui a flexibilidade da solução aplicada
  3. pode aumentar o número de classes da aplicação
  4. aumenta sempre o número de classes da aplicação
  5. leva a uma estrutura de controlo invertida do tipo “Princípio de Hollywood”

Parte 2

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.

Chave da Parte 1

Figura 1

1.1. Considere o diagrama UML da figura 1 (à direita). Qual das seguintes afirmações está correcta?

  1. C é uma implementação de B
  2. A é uma implementação de B
  3. C é uma classe derivada de B
  4. B possui (pelo menos 1) instâncias de C
  5. C é uma agregação de B

1.2. Em Java, qual das seguintes afirmações é verdadeira?

  1. existem classes sem construtores
  2. todas as classes têm, pelo menos, um construtor
  3. todas as classes têm, pelo menos, o construtor sem argumentos definido
  4. cada classe tem de ter, pelo menos, um construtor público
  5. todas as anteriores

1.3. Em Java, e acerca de classes abstractas e interfaces, qual é a afirmação verdadeira?

  1. não há diferenças
  2. as classes abstractas não podem ter atributos “final”
  3. as interfaces não podem ter atributos “final”
  4. pode-se herdar de várias classes abstractas, mas só se pode concretizar uma interface
  5. todas são falsas

1.4. Considerando a linguagem de programação Java, qual das seguintes frases está correcta?

  1. uma classe abstracta não pode ter atributos
  2. uma classe abstracta não pode ter construtores “public”
  3. uma classe abstracta não pode ter construtores “protected”
  4. uma classe abstracta não pode ter métodos “final”
  5. uma classe abstracta não pode ser “final”

1.5. Qual das seguintes afirmações é verdadeira em Java?

  1. é possível modificar o tamanho de um vector
  2. vectores de tipos primitivos não são reciclados automaticamente
  3. pode-se alterar a dimensão de um vector de objectos
  4. não é possível aceder a um vector fora dos seus limites
  5. atributos de objectos que sejam vectores de objectos não podem ser “public”

1.6. Em Java, qual das seguintes frases é verdadeira, relativamente ao uso da palavra reservada “final”:

  1. indica que um método não pode ser sobrecarregado (overloaded)
  2. indica que um método não pode ser substituído (overriden)
  3. indica que um método não pode ser “protected” nem friendly
  4. só podem existir dois métodos “final” por classe
  5. esta palavra reservada só se pode aplicar a atributos e a métodos

1.7. Qual das seguintes opções completa de forma correcta a seguinte frase: Em Java, os construtores...

  1. não podem lançar excepções
  2. não podem alterar os valores dos atributos do objecto a criar
  3. podem chamar outros construtores da mesma classe
  4. não têm acesso aos atributos da classe base
  5. nunca podem ser privados

1.8. Qual das seguintes afirmações é verdadeira em Java?

  1. as classes não são representáveis como objectos
  2. dado um objecto de uma classe não especificada, não é possível saber que métodos são invocáveis sobre ele
  3. existe uma instância da classe Class por cada classe carregada na aplicação
  4. todas as classes são carregadas no início da execução
  5. os métodos não podem ser representados como objectos

1.9. Qual das seguintes opções completa de forma correcta a seguinte frase: Em Java, a palavra reservada “import”...

  1. pode ser utilizada para herdar código de uma superclasse
  2. tem a função inversa à da palavra reservada “export”
  3. tem de ser a primeira instrução do ficheiro
  4. pode ser utilizada para importar campos não “static” das classes
  5. permite declarar uma ou mais classes

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:

  1. linha 8
  2. linhas 3, 7, 8, 12, e 13
  3. linhas 12 e 13
  4. linha 12
  5. linha 13

<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. são equivalentes
  2. o padrão Adapter, ao contrário do padrão Decorator, permite acrescentar novas funcionalidades ao objecto adaptado sem alterar a sua interface
  3. o padrão Decorator permite redefinir completamente a interface do objecto decorado
  4. o objecto decorador não pode ter estado
  5. o padrão Adapter permite redefinir completamente a interface do objecto adaptado

1.12. Em Java, qual ou quais das linhas do seguinte programa contêm instruções ilegais:

  1. linhas 11 e 12
  2. linhas 11 e 13
  3. linha 14
  4. linhas 12 e 15
  5. linhas 13 e 14

<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. dificulta a transição para a tecnologia OO
  2. diminui o número de objectos da aplicação
  3. permite alterar a interface dos objectos decorados
  4. permite adicionar novas funcionalidades aos objectos decorados
  5. nenhum dos anteriores

1.14. Qual das seguintes frases se aplica ao padrão de desenho Command?

  1. permite encapsular um algoritmo
  2. permite especificar os passos de um algoritmo
  3. delega a criação de objectos nas classes derivadas
  4. permite acrescentar comportamento a um objecto sem alterar a sua interface
  5. permite encapsular um pedido como sendo um objecto

1.15. Qual dos seguintes inconvenientes é um dos inconvenientes do padrão de desenho Factory Method?

  1. aumenta o número de objectos da aplicação
  2. nalguns casos diminui a flexibilidade da solução aplicada
  3. pode aumentar o número de classes da aplicação
  4. aumenta sempre o número de classes da aplicação
  5. leva a uma estrutura de controlo invertida do tipo “Princípio de Hollywood”

Resolução da Parte 2

2.1. Observer

2.2. Aviões

2.3.1. Saída do programa

2.3.2. Identificação do padrão de desenho utilizado

2.4. Diagrama de classes (UML)

Esboço do diagrama de classes para o problema apresentado.

File:PO-December2005-class.png

2.5. Diagrama de sequência (UML)

Note-se que alguns objectos não indicam variáveis associadas (os resultados da criação desses objectos são imediatamente passados como argumentos).

File:PO-December2005-seq.png

2.6.1. Exercício de programação

2.6.2. Exercício de programação