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

From Wiki**3

< Programação com Objectos

Parte 1 (resposta múltipla)

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.

Figura 1

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

  1. a cada instância de A está associada uma e uma só instância de B
  2. cada objecto da classe A pode estar associado a vários da classe B
  3. o método doThis só pode ser invocado sobre instâncias de R
  4. a classe A implementa o método doThat da interface I
  5. B é uma classe derivada de R

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. encapsulamento
  2. controlo de acesso
  3. polimorfismo
  4. serialização
  5. sobrecarregar

1.3. Em Java, qual das seguintes frases está correcta?

  1. todas as classes herdam da classe Class
  2. uma classe interna tem de ser static
  3. pode definir-se mais do que uma interface no mesmo ficheiro
  4. uma classe que derive de Throwable apenas pode concretizar (no máximo) uma interface
  5. é obrigatório definir pelo menos um método abstracto dentro de uma classe classe abstracta

1.4. A utilização de uma referência de um tipo onde é esperada uma de um tipo hierarquicamente superior designa-se por:

  1. polimorfismo
  2. abstracção
  3. sobrecarregar
  4. herança
  5. extensão

1.5. Em Java, a operação de serialização...

  1. está automaticamente disponível para todas as classes
  2. não pode ser utilizada em excepções
  3. pode lançar uma excepção
  4. permite transformar os objectos de uma árvore
  5. apenas tem significado para as classes da hierarquia das colecções

1.6. Em Java, o método equals...

  1. não pode ser utilizado
  2. é utilizado para definir ordem entre as instâncias de uma classe
  3. é utilizado pelas colecções para parametrizar algoritmos de ordenação
  4. é utilizado para realizar sobrecarregamento (overloading) de métodos
  5. permite comparar dois objectos de qualquer tipo

1.7. Relativamente à classe java.lang.String, qual das seguintes frases está correcta?

  1. é um tipo primitivo
  2. as suas instâncias não são compatíveis com a classe java.util.TreeMap
  3. não pode ser directamente utilizada pelas aplicações Java
  4. só tem instâncias para as cadeias de caracteres directamente escritas num programa
  5. as respostas anteriores estão erradas

1.8. Ao utilizar o padrão de desenho Proxy passa a ser possível...

  1. permitir mudar o comportamento de um objecto quando o seu estado muda
  2. adicionar responsabilidades a objectos individuais em tempo de execução
  3. representar uma operação a ser realizada sobre os elementos de uma estrutura de objectos
  4. gerir as dependências de outros objectos relativamente ao estado de um objecto
  5. controlar o acesso a um objecto

1.9. O padrão de desenho Decorator...

  1. permite adicionar funcionalidade a um objecto sem alterar a sua interface
  2. não pode ser aplicado em conjunto com padrão Visitor
  3. permite adicionar funcionalidade a um objecto, mas altera a sua interface
  4. permite aplicar uma operação a uma estrutura de objectos
  5. permite estabelecer o esqueleto de um algoritmo

1.10. O padrão de desenho Abstract Factory...

  1. representa uma operação a ser realizada sobre os elementos de uma estrutura de objectos
  2. não pode ser aplicado em conjunto com padrão Singleton
  3. permite abstrair a criação de famílias de objectos para uma aplicação
  4. permite tratar famílias de objectos e seus grupos indiscriminadamente
  5. não pode ser implementado com classes abstractas

Parte 2

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>

Chave da Parte 1

Figura 1

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

  1. a cada instância de A está associada uma e uma só instância de B
  2. cada objecto da classe A pode estar associado a vários da classe B
  3. o método doThis só pode ser invocado sobre instâncias de R
  4. a classe A implementa o método doThat da interface I
  5. B é uma classe derivada de R

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. encapsulamento
  2. controlo de acesso
  3. polimorfismo
  4. serialização
  5. sobrecarregar

1.3. Em Java, qual das seguintes frases está correcta?

  1. todas as classes herdam da classe Class
  2. uma classe interna tem de ser static
  3. pode definir-se mais do que uma interface no mesmo ficheiro
  4. uma classe que derive de Throwable apenas pode concretizar (no máximo) uma interface
  5. é obrigatório definir pelo menos um método abstracto dentro de uma classe classe abstracta

1.4. A utilização de uma referência de um tipo onde é esperada uma de um tipo hierarquicamente superior designa-se por:

  1. polimorfismo
  2. abstracção
  3. sobrecarregar
  4. herança
  5. extensão

1.5. Em Java, a operação de serialização...

  1. está automaticamente disponível para todas as classes
  2. não pode ser utilizada em excepções
  3. pode lançar uma excepção
  4. permite transformar os objectos de uma árvore
  5. apenas tem significado para as classes da hierarquia das colecções

1.6. Em Java, o método equals...

  1. não pode ser utilizado
  2. é utilizado para definir ordem entre as instâncias de uma classe
  3. é utilizado pelas colecções para parametrizar algoritmos de ordenação
  4. é utilizado para realizar sobrecarregamento (overloading) de métodos
  5. permite comparar dois objectos de qualquer tipo

1.7. Relativamente à classe java.lang.String, qual das seguintes frases está correcta?

  1. é um tipo primitivo
  2. as suas instâncias não são compatíveis com a classe java.util.TreeMap
  3. não pode ser directamente utilizada pelas aplicações Java
  4. só tem instâncias para as cadeias de caracteres directamente escritas num programa
  5. as respostas anteriores estão erradas

1.8. Ao utilizar o padrão de desenho Proxy passa a ser possível...

  1. permitir mudar o comportamento de um objecto quando o seu estado muda
  2. adicionar responsabilidades a objectos individuais em tempo de execução
  3. representar uma operação a ser realizada sobre os elementos de uma estrutura de objectos
  4. gerir as dependências de outros objectos relativamente ao estado de um objecto
  5. controlar o acesso a um objecto

1.9. O padrão de desenho Decorator...

  1. permite adicionar funcionalidade a um objecto sem alterar a sua interface
  2. não pode ser aplicado em conjunto com padrão Visitor
  3. permite adicionar funcionalidade a um objecto, mas altera a sua interface
  4. permite aplicar uma operação a uma estrutura de objectos
  5. permite estabelecer o esqueleto de um algoritmo

1.10. O padrão de desenho Abstract Factory...

  1. representa uma operação a ser realizada sobre os elementos de uma estrutura de objectos
  2. não pode ser aplicado em conjunto com padrão Singleton
  3. permite abstrair a criação de famílias de objectos para uma aplicação
  4. permite tratar famílias de objectos e seus grupos indiscriminadamente
  5. não pode ser implementado com classes abstractas

Resolução da Parte 2

2.1. Gestão de universidade

Duas soluções competem por este problema:

  • Composite (grupos e subgrupos) + Template Method (reutilização de algoritmos com partes dependentes da subclasse específica);
  • Composite (grupos e subgrupos) + Visitor (neste caso, haveria definição de comportamentos específicos para cada tipo).

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

2.2. Adapter & Bridge

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.

2.3. Polimorfismo

A resposta correcta conteria a definição de polimorfismo (em geral), seguida das formas de polimorfismo disponíveis em Java:

  • Polimorfismo dos operadores relativamente a alguns tipos primitivos (e.g., inteiros e doubles);
  • Polimorfismo de inclusão (tipos, subtipos, etc.): classes, interfaces, upcast (automático), downcast (explícito);
  • Polimorfismo paramétrico: classes genéricas (e.g. ArrayList).

2.4. Hierarquia Pessoa, etc.

Dois padrões permitiriam resolver (independentemente um do outro) este problema:

  • Decorator
  • Proxy

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.

2.5.1. Saída do programa

 Salty pop corn\nHot pop corn\n

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

O padrão utilizado é o Strategy (método "taste").

2.6. Diagrama de classes (UML)

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

PO-December2008-class.png

2.7. Diagrama de sequência (UML)

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

PO-December2008-seq.png

2.8. Exercício de programação (folha de cálculo)

Conceitos importantes:

  • Folha
  • Célula
  • Conteúdo
    • Número
    • Cadeias de caracteres
    • Referências
    • Fórmulas e respectivos argumentos

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

2.9. Exercício de programação (página)

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.