|
|
(2 intermediate revisions by the same user not shown) |
Line 90: |
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]] |
| | | |
− | * [[Introdução à Modelação com UML/Galinha com fome|Galinha com fome]]
| + | '''1.6.''' (6.0 val.) [[Introdução à Modelação com UML/Transportadora de animais|Transportadora de animais]] |
− | | |
− | '''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|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) == |
Latest revision as of 14: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?
doIt pode ser directamente invocado através de referências para I
doThat não está definido para B
B implementa a interface I (através de C)
- C implementa a interface I
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?
Strategy
Builder
Visitor
Template Method
- Abstract Factory
2.3. O padrão de desenho Composite tem por objectivo...
criar objectos complexos a partir de pequenos objectos diferentes
adicionar funcionalidade a um objecto adaptando a sua interface
que o comportamento de um objecto mude quando o seu estado muda
- que os clientes tratem os objectos individuais e composições de objectos de forma uniforme
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?
Builder
Visitor
Observer
Abstract Factory
- 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?
definir a classe como final
definir a classe como static
aplicar o padrão de desenho Proxy
- aplicar o padrão de desenho Singleton
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?
não pode aceder aos atributos static da classe envolvente
só pode invocar métodos não-static da classe envolvente
não pode ter métodos que lancem excepções (iriam corromper o objecto da classe envolvente)
- pode aceder a qualquer atributo (privado ou não) do objecto da classe envolvente
todas frases anteriores são falsas
2.7. Quais são as características que todos os objectos possuem?
apenas identidade, estado e comportamento
apenas estado e comportamento
apenas comportamento
- existência
dimensão e peso
2.8. Em Java, o fragmento de código catch(Exception e) { /* … */ }
apanha todos os objectos que forem atirados por um throw anterior
é inútil desde que exista um qualquer catch anterior
- o seu bloco pode lançar, ele próprio, uma excepção
volta a apanhar todos os objectos, mesmo os que já tenham sido apanhados por um catch anterior
não apanha nunca nenhum objecto
2.9. Em Java, o método main é especial porque...
é o único método que pode criar objectos
- o interpretador começa sempre a execução da aplicação invocando o método main de uma determinada classe
todas as classes têm de ter um método main
é o único método static que uma classe pode ter
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...
não é alterado, porque o método recebe uma cópia do objecto
não é alterado, porque essa operação nunca é permitida
- é alterado imediatamente
é alterado, mas a alteração só é visível quando o método termina
é alterado, mas só se o método não for private