Programação com Objectos/Teste de 2012/01/30

From Wiki**3

< Programação com Objectos
Revision as of 17:54, 31 January 2012 by Root (talk | contribs) (Created page with "{{TOCright}} == Parte 1 == '''1.1.''' (1.5 val.) Discuta a importância do encapsulamento e relacione-o com os conceitos de interface e implementação. Em que medida contrib...")

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Parte 1

1.1. (1.5 val.) Discuta a importância do encapsulamento e relacione-o com os conceitos de interface e implementação. Em que medida contribuem aqueles conceitos para a qualidade da programação. Como estão disponíveis em Java?

(resposta)

1.2. (1.5 val.) O padrão State permite simplificar a programação de máquinas de estados. Explique pormenorizadamente como é realizada a função do padrão pelos seus intervenientes. Quais são as vantagens de utilização do padrão?

(resposta)

1.3. (1.5 val.) O padrão de desenho Template Method permite definir métodos cujas etapas podem não estar definidas (no sentido de não estarem implementadas). Como funciona o padrão? Que significa dizer-se que há inversão de controlo no funcionamento do padrão? Contraste com o processo habitual de redefinição de métodos na presença de herança.

(resposta)

1.4. (1.5 val.) O padrão de desenho Abstract Factory permite abstrair a criação de objectos pertencentes a uma família de conceitos. Explique como estão organizados os conceitos envolvidos no padrão e como é a interacção com o código cliente. Dê um exemplo de aplicação.

(resposta)

1.5. Considere o seguinte programa em Java: <java5> public class Chicken {

 private Stomach _stomach = new Hungry();

  public void eat() { _stomach.eat(); }   public void sleep() { _stomach.sleep(); }   public void setMood(Stomach stomach) { _stomach = stomach; } }

public abstract class Stomach {   protected Stomach() { System.out.println("Hmmm..."); }   public void eat() { System.out.println("..."); }   public void sleep() { System.out.println("..."); } }

public class Hungry extends Stomach {   public Hungry() { System.out.println("I'm hungry!!"); }   public void eat() { System.out.println("Eating..."); }   public void sleep() { System.out.println("I'm too hungry to sleep!!"); } }

public class Sated extends Stomach {   public Sated() { System.out.println("I'm sleepy!!"); }   public void eat() { System.out.println("I'm not hungry..."); }   public void sleep() { System.out.println("ZzZz..."); } }

public class Farm {

 public static void main(String args[]) {
   Chicken chicken = new Chicken();
   chicken.eat();
   chicken.setMood(new Sated());
   chicken.sleep();
   chicken.setMood(new Hungry());
   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)

Hmmm...\nI'm hungry!!\nEating...\nHmmm...\nI'm sleepy!!\nZzZz...\nHmmm...\nI'm hungry!!\nI'm too hungry to sleep!!

1.5.2. (0.5 val.) Que padrão de desenho é usado no programa?

Strategy 

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).

Note-se que alguns objectos (anotados) não definem as variáveis associadas no momento indicado.

PO-20120130-seq.png

1.6. Considere o seguinte domínio:

Uma transportadora tem vários camiões e comboios capazes de transportar vários tipos de animais (inicialmente, ovelhas, vacas e cavalos, embora seja de prever que venham a ser considerados outros). Os camiões e comboios têm identificadores únicos e uma dada capacidade de transporte, determinada pelo peso máximo que pode transportar. Desta forma, é possível acrescentar um animal a transportar a um dado camião ou comboio se a capacidade de transporte não tiver sido ultrapassada. Dado um meio de transporte, é possível saber a capacidade de transporte ainda disponível.

Os animais têm um identificador único, registo do peso, sabem andar e comer, e têm o registo de quem é o seu dono. Cada tipo de animal tem capacidades adicionais distintas: os cavalos sabem correr, as ovelhas pastar e as vacas mugir. Os donos são identificados pelo nome. Por vezes, os donos transportam lotes de animais, todos no mesmo meio de transporte. Os lotes têm um identificador único e apresentam as mesmas capacidades que os animais individuais.

Um comboio é constituído por carruagens e cada carruagem tem uma capacidade máxima de transporte. A capacidade máxima de transporte de um comboio é igual à soma das capacidades das suas carruagens. É possível adicionar carruagens a um comboio. Quando se adiciona uma dada carga a transportar a um comboio, o comboio utiliza a primeira carruagem com capacidade disponível para transportar essa carga.

Considere que os comboios podem transportar qualquer tipo de animal. No entanto, e por enquanto, os camiões apenas podem transportar vacas ou cavalos, podendo no futuro aceitar novos tipos de animais. Apresente uma solução que garanta a flexibilidade 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.

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

PO-20120130-class.png

1.6.2. (4.0 val.) Implemente em Java as classes do domínio apresentado (ver nota abaixo), 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 está presente e que realiza as operações especificadas.

Nota: não é necessário implementar as classes que representam os seguintes conceitos: camião, cavalo, vaca.

<java5>

</java5>

Parte 2 (resposta múltipla)

UML-teste-po-20120107.png
2.1. Considere o diagrama UML da figura 1 (à direita). Qual das seguintes afirmações está correcta?
  1. doIt pode ser directamente invocado através de referências para I
  2. doThat não está definido para B
  3. B implementa a interface I (através de C)
  4. C implementa a interface I
  5. A implementa a interface I

2.2. Que padrão de desenho permite criar famílias de objectos relacionados, de modo que os seus elementos possam ser usados de modo alternativo?

  1. Strategy
  2. Builder
  3. Visitor
  4. Template Method
  5. Abstract Factory

2.3. O padrão de desenho Composite tem por objectivo...

  1. criar objectos complexos a partir de pequenos objectos diferentes
  2. adicionar funcionalidade a um objecto adaptando a sua interface
  3. que o comportamento de um objecto mude quando o seu estado muda
  4. que os clientes tratem os objectos individuais e composições de objectos de forma uniforme
  5. estabelecer o esqueleto de um algoritmo

2.4. Qual é o padrão de desenho que tem o objectivo de converter a interface de uma classe numa outra interface (esperada pelos clientes) e permitir que classes possam colaborar, apesar das incompatibilidades das suas interfaces?

  1. Builder
  2. Visitor
  3. Observer
  4. Abstract Factory
  5. Adapter

2.5. Quando se pretende que todos os clientes de uma classe usem sempre a mesma instância dessa classe, qual é a melhor opção?

  1. definir a classe como final
  2. definir a classe como static
  3. aplicar o padrão de desenho Proxy
  4. aplicar o padrão de desenho Singleton
  5. utilizar uma variável global, definida através da palavra reservada global

2.6. Qual das seguintes frases está correcta, relativamente a uma instância (designada por inst) de uma classe interna não static?

  1. não pode aceder aos atributos static da classe envolvente
  2. só pode invocar métodos não-static da classe envolvente
  3. não pode ter métodos que lancem excepções (iriam corromper o objecto da classe envolvente)
  4. pode aceder a qualquer atributo (privado ou não) do objecto da classe envolvente
  5. todas frases anteriores são falsas

2.7. Quais são as características que todos os objectos possuem?

  1. (a) apenas identidade, estado e comportamento
  2. (b) apenas estado e comportamento
  3. (c) apenas comportamento
  4. existência
  5. (e) dimensão e peso

2.8. Em Java, o fragmento de código catch(Exception e) { /* … */ }

  1. apanha todos os objectos que forem atirados por um throw anterior
  2. é inútil desde que exista um qualquer catch anterior
  3. o seu bloco pode lançar, ele próprio, uma excepção
  4. volta a apanhar todos os objectos, mesmo os que já tenham sido apanhados por um catch anterior
  5. não apanha nunca nenhum objecto

2.9. Em Java, o método main é especial porque...

  1. é o único método que pode criar objectos
  2. o interpretador começa sempre a execução da aplicação invocando o método main de uma determinada classe
  3. todas as classes têm de ter um método main
  4. é o único método static que uma classe pode ter
  5. só uma classe da aplicação pode ter o método main

2.10. Em Java, quando um método atribui um valor a um atributo de um objecto passado como seu argumento, esse objecto...

  1. não é alterado, porque o método recebe uma cópia do objecto
  2. não é alterado, porque essa operação nunca é permitida
  3. é alterado imediatamente
  4. é alterado, mas a alteração só é visível quando o método termina
  5. é alterado, mas só se o método não for private