Programação com Objectos/Teste 2 de 2013/02/04

From Wiki**3

< Programação com Objectos

Parte 1

1.1. Considere o seguinte programa em Java:

<java5> abstract class Thing {

 public abstract String doIt();
 public String toString() { return doIt(); }

}

class Blob extends Thing {

 public String doIt() { return "a blob"; }

}

class Something {

 public String doSomething() { return "something"; }

}

class Piece extends Thing {

 Something _else;
 public Piece(Something something) { _else = something; }
 public String doIt() { return _else.doSomething(); }

}

class Box {

 private Thing _thing;
 public Box(Thing t) { _thing = t; }
 public void open() {
   System.out.println("The box contains " + this);
 }
 public String toString() { return _thing.toString(); }

}

public class App {

 public static void main(String args[]) {
   Box b1 = new Box(new Blob());
   Box b2 = new Box(new Piece(new Something()));
   b1.open();
         b2.open();
 }

} </java5>

1.1.1. (0.75 val.) Qual o resultado que se obtém quando se executa o programa? (represente mudanças de linha com \n)

 The box contains a blob
 The box contains something

1.1.2. (0.25 val.) Que padrão de desenho é usado no programa?

Template Method (toString using doIt); Adapter (Piece and Something); Strategy (Box and Thing).

1.1.3. (1.25 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.2. (2.25 val.) Considere o seguinte domínio:

Uma transportadora tem vários camiões e comboios capazes de transportar vários tipos de equipamento industrial (inicialmente, tractores, escavadoras e perfuradoras, 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 e comprimento máximos que podem transportar. Desta forma, é possível acrescentar uma peça de equipamento 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 equipamentos têm um identificador único, registo do peso e capacidade de combustível, e têm o registo de quem é o seu proprietário. Cada tipo de equipamento tem funcionalidades adicionais distintas: os tractores puxam, as escavadoras escavam e as perfuradoras perfuram. Os proprietários são identificados pelo nome. Por vezes, os proprietários transportam lotes de vários equipamentos (i.e., um lote no mesmo meio de transporte). Os lotes têm um identificador único e apresentam as mesmas funcionalidades que os equipamentos 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.

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 está correcta (especialmente a que diz respeito às relações entre objectos).

Além da definição das classes de base do domínio, a ideia é utilizar o padrão Composite (para representar lotes).


1.3. (1.25 val.) O padrão de desenho Visitor depende tanto da funcionalidade de sobrecarregamento (overloading) como da de redefinição (overriding). Concorda? Justifique pormenorizadamente a sua resposta.


1.4. (1.25 val.) Discuta pormenorizadamente as diferenças entre os padrões de desenho Adapter e Decorator?


Parte 2 (resposta múltipla)

2.1. Em que situação se deve usar o padrão de desenho Composite? Quando se pretende...

  1. dissociar uma abstração de sua implementação, de modo que os dois possam variar independentemente
  2. traduzir para uma interface existente uma interface alvo compatível
  3. organizar hierarquias de objectos de tal forma que o código do cliente pode manipular de modo uniforme, tanto os objetos individuais, como os conjuntos desses objectos
  4. melhorar o desempenho geral do sistema através da composição de objectos
  5. aplicar uma família de operações a uma estrutura de dados

2.2. Considere o desenvolvimento de uma aplicação que está baseada num algoritmo “complexo” e que esse algoritmo pode ser alterado devido a pressões do mercado. Que padrão escolheria?

  1. Abstract Factory
  2. Command
  3. Composite
  4. Strategy
  5. Template Method

2.3. Considere o desenvolvimento de uma aplicação em que é necessário apresentar ao utilizador (para ele escolher) uma lista de operações que podem ser realizadas sobre entidades da aplicação. Estas operações têm de ser ordenadas tendo em atenção a sua prioridade e que a prioridade pode variar durante a execução da aplicação. Que padrão escolheria para representar as operações?

  1. Abstract Factory
  2. Command
  3. Composite
  4. Strategy
  5. Template Method

2.4. A utilização de padrões de desenho apresenta a seguinte desvantagem:

  1. dificulta a transição para a tecnologia OO
  2. dificulta a documentação dos programas
  3. não captura conhecimento dos peritos
  4. dificulta a comunicação entre programadores
  5. (nenhum das anteriores)
2.5.
PO-20130204t2facade.png
Considere o diagrama à direita. Que padrão de desenho reconhece?
  1. Abstract Factory
  2. Decorator
  3. Façade
  4. Strategy
  5. Template Method