Difference between revisions of "Programação com Objectos/Teste de 2012/01/30"

From Wiki**3

< Programação com Objectos
(Parte 2 (resposta múltipla))
 
(6 intermediate revisions by the same user not shown)
Line 6: Line 6:
  
 
<div style="padding: 8px; border-style: dashed; border-width: 1px; border-color: #2f6fab; background: #f9f9f9; ">
 
<div style="padding: 8px; border-style: dashed; border-width: 1px; border-color: #2f6fab; background: #f9f9f9; ">
(resposta)  
+
* Separação entre interface e implementação
 +
* Isolamento de responsabilidades e de consequências
 +
* Esconder a implementação de módulos e os seus dados (objectos)
 +
* Java: palavras chave de controlo de acesso
 +
* Java: explicitação do conceito de interface e de classe abstracta
 
</div>
 
</div>
  
Line 12: Line 16:
  
 
<div style="padding: 8px; border-style: dashed; border-width: 1px; border-color: #2f6fab; background: #f9f9f9; ">
 
<div style="padding: 8px; border-style: dashed; border-width: 1px; border-color: #2f6fab; background: #f9f9f9; ">
(resposta)
+
* Cliente e objectos do estado
 +
* Delegação de funcionalidade no objecto de estado actual
 +
* Comutação entre objectos de estado opaca para o cliente
 +
* Simplicidade de estruturação do esquema de transições
 +
* Explicitação da máquina de estados
 +
* Remoção de código de verificação de condições no cliente
 
</div>
 
</div>
  
Line 18: Line 27:
  
 
<div style="padding: 8px; border-style: dashed; border-width: 1px; border-color: #2f6fab; background: #f9f9f9; ">
 
<div style="padding: 8px; border-style: dashed; border-width: 1px; border-color: #2f6fab; background: #f9f9f9; ">
(resposta)
+
* Superclasse (possivelmente, mas não necessariamente) abstracta define algoritmo
 +
* Superclasse especifica passos do algoritmo (métodos, possivelmente abstractos, mas não necessariamente)
 +
* Subclasses definem os métodos que correspondem aos passos do algoritmo
 +
* Inversão de controlo: controlo a partir da superclasse (princípio de Hollywood - "don't call us, we'll call you")
 +
* No processo de herança, as subclasses chamam o código da superclasses e, de um modo geral, pelo mecanismo de redefinição detêm o controlo da execução e da definição dos métodos
 
</div>
 
</div>
  
Line 24: Line 37:
  
 
<div style="padding: 8px; border-style: dashed; border-width: 1px; border-color: #2f6fab; background: #f9f9f9; ">
 
<div style="padding: 8px; border-style: dashed; border-width: 1px; border-color: #2f6fab; background: #f9f9f9; ">
(resposta)
+
* Cliente é definido em termos de conceitos gerais, tando relativamente à fábrica, como aos tipos (concretos) de objectos construídos
 +
* A fábrica relaciona implicitamente os tipos de objectos contruídos num todo coerente (têm sentido no mesmo contexto)
 +
* Cliente é "inicializado" com fábrica concreta
 +
* Cliente usa interface relativa à criação de objectos "gerais", mas a fábrica produz os "concretos"
 +
* Exemplo: escola com salas, professores, alunos, disciplinas, com variação de matérias ensinadas
 
</div>
 
</div>
  
Line 73: Line 90:
 
  ''Strategy''  
 
  ''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''').
+
'''1.5.3.''' (1.5 val.) [[Introdução à Modelação com UML/Galinha com fome|Galinha com fome]]
  
<div style="padding: 8px; border-style: dashed; border-width: 1px; border-color: #2f6fab; background: #f9f9f9; ">
+
'''1.6.''' (6.0 val.) [[Introdução à Modelação com UML/Transportadora de animais|Transportadora de animais]]
Note-se que alguns objectos (anotados) não definem as variáveis associadas no momento indicado.
 
 
 
[[Image:PO-20120130-seq.png]]
 
</div>
 
 
 
'''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.
 
 
 
<div style="padding: 8px; border-style: dashed; border-width: 1px; border-color: #2f6fab; background: #f9f9f9; ">
 
Esboço do diagrama de classes para o problema apresentado.
 
 
 
[[Image:PO-20120130-class.png|900px|PO-20120130-class.png]]  
 
</div>
 
 
 
'''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)  ==
 
== Parte 2 (resposta múltipla)  ==
Line 118: Line 105:
 
'''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?  
 
'''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?  
  
:#<s>Strategy</s>
+
:#<s>''Strategy''</s>
:#<s>Builder</s>  
+
:#<s>''Builder''</s>  
:#<s>Visitor</s>  
+
:#<s>''Visitor''</s>  
:#<s>Template Method</s>  
+
:#<s>''Template Method''</s>  
:#Abstract Factory
+
:#''Abstract Factory''
  
 
'''2.3.''' O padrão de desenho ''Composite'' tem por objectivo...
 
'''2.3.''' O padrão de desenho ''Composite'' tem por objectivo...
Line 134: Line 121:
 
'''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?
 
'''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?
  
:#<s>Builder</s>
+
:#<s>''Builder''</s>
:#<s>Visitor</s>
+
:#<s>''Visitor''</s>
:#<s>Observer</s>
+
:#<s>''Observer''</s>
:#<s>Abstract Factory</s>
+
:#<s>''Abstract Factory''</s>
:#Adapter
+
:#''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?
 
'''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?
Line 158: Line 145:
 
'''2.7.''' Quais são as características que todos os objectos possuem?
 
'''2.7.''' Quais são as características que todos os objectos possuem?
  
:#<s>(a) apenas identidade, estado e comportamento</s>  
+
:#<s>apenas identidade, estado e comportamento</s>  
:#<s>(b) apenas estado e comportamento</s>
+
:#<s>apenas estado e comportamento</s>
:#<s>(c) apenas comportamento</s>
+
:#<s>apenas comportamento</s>
 
:#existência
 
:#existência
:#<s>(e) dimensão e peso</s>
+
:#<s>dimensão e peso</s>
  
 
'''2.8.''' Em Java, o fragmento de código '''catch(Exception e) { /* … */ }'''
 
'''2.8.''' Em Java, o fragmento de código '''catch(Exception e) { /* … */ }'''

Latest revision as of 15:24, 18 November 2013

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?

  • Separação entre interface e implementação
  • Isolamento de responsabilidades e de consequências
  • Esconder a implementação de módulos e os seus dados (objectos)
  • Java: palavras chave de controlo de acesso
  • Java: explicitação do conceito de interface e de classe abstracta

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?

  • Cliente e objectos do estado
  • Delegação de funcionalidade no objecto de estado actual
  • Comutação entre objectos de estado opaca para o cliente
  • Simplicidade de estruturação do esquema de transições
  • Explicitação da máquina de estados
  • Remoção de código de verificação de condições no cliente

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.

  • Superclasse (possivelmente, mas não necessariamente) abstracta define algoritmo
  • Superclasse especifica passos do algoritmo (métodos, possivelmente abstractos, mas não necessariamente)
  • Subclasses definem os métodos que correspondem aos passos do algoritmo
  • Inversão de controlo: controlo a partir da superclasse (princípio de Hollywood - "don't call us, we'll call you")
  • No processo de herança, as subclasses chamam o código da superclasses e, de um modo geral, pelo mecanismo de redefinição detêm o controlo da execução e da definição dos métodos

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.

  • Cliente é definido em termos de conceitos gerais, tando relativamente à fábrica, como aos tipos (concretos) de objectos construídos
  • A fábrica relaciona implicitamente os tipos de objectos contruídos num todo coerente (têm sentido no mesmo contexto)
  • Cliente é "inicializado" com fábrica concreta
  • Cliente usa interface relativa à criação de objectos "gerais", mas a fábrica produz os "concretos"
  • Exemplo: escola com salas, professores, alunos, disciplinas, com variação de matérias ensinadas

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.) Galinha com fome

1.6. (6.0 val.) Transportadora de animais

Parte 2 (resposta múltipla)

Figura 1 (todos os métodos estão implementados)
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. apenas identidade, estado e comportamento
  2. apenas estado e comportamento
  3. apenas comportamento
  4. existência
  5. 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