Difference between revisions of "Herança e Composição/Exercício 03: Energia"

From Wiki**3

< Herança e Composição
(Conceito de Gato)
(Conceito de Rato)
Line 422: Line 422:
  
 
Comparar a implementação com a versão sem herança e considerar outras possibilidades de abstracção.
 
Comparar a implementação com a versão sem herança e considerar outras possibilidades de abstracção.
 +
 +
{{CollapsedCode|Ficheiro '''Mouse.java'''|
 
<java5>
 
<java5>
 
public class Mouse extends Animal {
 
public class Mouse extends Animal {
Line 468: Line 470:
 
}
 
}
 
</java5>
 
</java5>
 +
}}
  
 
== Conceito de Pássaro ==
 
== Conceito de Pássaro ==

Revision as of 00:44, 1 September 2015

Considere o seguinte problema (baseado no domínio do exercício 02). Considere ainda as possíveis abstracções de comportamentos e propriedades comuns aos vários conceitos. Defina os conceitos do problema com base nas suas abstracções.

Problema

Numa casa de campo existem vários animais.

Alguns animais são domésticos: cães, gatos e pássaros (canários, etc.). Os donos acreditam em dar liberdade completa aos animais, o que causa alguns problemas de interacção nem sempre do agrado geral.

Outros animais, embora vivam na casa ou perto dela, não são oficialmente considerados animais domésticos: ratos, cobras, insectos, aranhas, etc. Estes animais também se deslocam pela propriedade, livre mas nem sempre impunemente.

Todos os animais podem correr (e os pássaros voar), consumindo energia para o efeito. Quando a energia termina, não podem correr mais e têm de dormir para recuperar forças.

Além do repouso, os cães e os gatos podem recuperar energia comendo ratos. Um rato devorado perde, claro está, toda a energia (é transferida para o predador). Os gatos, por serem ágeis, também conseguem comer pássaros (com efeitos muito semelhantes aos da relação gato-rato).

Por vezes, os cães perdem a paciência e atacam os gatos. Ambos perdem energia no processo.

Modele os conceitos "cão", "gato", "pássaro" e "rato". Além da energia, os cães e os gatos têm nome (uma cadeia de caracteres).

Considere que a energia disponível inicialmente para os cães, gatos, pássaros e ratos é, respectivamente, de 1000, 500, 20 e 50 unidades. Quando os animais correm, gastam, respectivamente, 50, 25, 5 e 2 unidades. Um pássaro, quando voa, gasta apenas 2 unidades. Um cão que ataque um gato gasta 100 unidades e faz com que o gato perca 25.

Para um predador comer uma presa tem de a perseguir para a capturar (podendo a perseguição ser ou não bem sucedida). Um cão consegue capturar um rato em cada 25 tentativas. Para os gatos, o rácio é 1 em 5 (ratos) e 1 em 10 (pássaros). A perseguição consome a mesma energia que correr (para cada interveniente), mas a presa recebe um bónus de 5 unidades se escapar. Se a presa estiver a dormir, é apanhada 1 em cada 2 tentativas.

Construa uma aplicação onde existem 2 cães ("Piloto" e "Átila"), 3 gatos ("Tareco", "Pantufa" e "Kitty"), 20 pássaros e 50 ratos (os pássaros e ratos podem ser organizados em arrays).

Neste cenário, os gatos correm, perseguem pássaros e ratos e são atacados pelos cães, que também podem correr e perseguir e comer ratos. Os animais dormem automaticamente se ficam sem energia (excepto quando são devorados: nesse caso devem ser considerados mortos).

Apresente o estado inicial dos animais (métodos toString) e o estado final (depois de algumas interacções).

Discuta as opções da abstracção, em particular, no que respeita a aspectos menos flexíveis relativamente a possíveis alterações do modelo (constantes, propriedades, comportamentos comuns, etc.). Ainda neste sentido, compare a nova solução com a solução da anterior. Chegou à conclusão que a sua nova solução ainda apresenta dificuldades face à manutenção do código? Neste caso, quais são os aspectos problemáticos?

Solução

A solução apresentada procura uma abstracção adequada das propriedades e comportamentos intrínsecos dos conceitos em causa. Alguns aspectos, relativos à abstracção funcional não são ainda considerados.

UML: Diagrama de Classes

Diagrama de classes

PO-dog-cat-mouse-bird-energy-with-inheritance.png

Conceito de Animal

Conceito que gere a energia e o consumo quando se corre, i.e., todos os animais têm energia (boa abstracção) e todos correm (não tão boa, mas neste caso é aceitável, embora haja melhores soluções utilizando técnicas mais avançadas de modelação).

Ficheiro Animal.java
{{{2}}}

Conceito de Animal com Nome

Tal como no caso anterior, utilizando técnicas de modelação mais avançadas, este conceito poderia não ser sobrecarregado com alguns aspectos, presentes apenas por serem comuns às subclasses (nomeadamente, perseguir e comer ratos).

Ficheiro NamedAnimal.java
{{{2}}}

Conceito de Cão

Um cão é um animal com nome, com uma dada energia inicial e que consome uma determinada energia quando corre (ver definição destes parâmetros na chamada ao construtor).

Comparar a reduzida dimensão da classe, quando comparada com a versão sem herança.

Ficheiro Dog.java

<java5> public class Dog extends NamedAnimal {

/** * Base energy level: 500. Run spending: 25. * * @param name */ Dog(String name) { super(name, 25, 1000, 50); }

/** * We assume that the dog is always able to attack the cat. The parameter to * attacked is used to specify the amount of energy lost by the cat. * Note that we are assuming that the degree of loss depends on the attacker * (hence the value being defined in the dog class). * * The energy values could be defined as attributes or as constants. * * @param cat * the cat the dog attacks */ public void attackCat(Cat cat) { increaseEnergy(-100); cat.attacked(25); }

/** * @see java.lang.Object#toString() */ @Override public String toString() { return "Dog: " + super.toString(); }

/** * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object o) { if (o instanceof Dog) return super.equals(o); return false; }

} </java5>

Conceito de Gato

Um gato é um animal com nome, com uma dada energia inicial e que consome uma determinada energia quando corre (ver definição destes parâmetros na chamada ao construtor).

Comparar a reduzida dimensão da classe, quando comparada com a versão sem herança.

Ficheiro Cat.java
{{{2}}}

Conceito de Rato

O conceito de rato poderia ser melhor definido, mas, nesta fase, utiliza-se um grau de abstracção menos conveniente, evitando definir conceitos apenas para evitar repetição de código (uma decisão que, na ausência de outras técnicas, poderia ter sido tomada na outra direcção -- ver, como exemplo, a classe NamedAnimal, que agrega alguma funcionalidade que não lhe pertence intrinsecamente).

Comparar a implementação com a versão sem herança e considerar outras possibilidades de abstracção.

Ficheiro Mouse.java
{{{2}}}

Conceito de Pássaro

O conceito de pássaro poderia ser melhor definido, mas, nesta fase, utiliza-se um grau de abstracção menos conveniente, evitando definir conceitos apenas para evitar repetição de código (uma decisão que, na ausência de outras técnicas, poderia ter sido tomada na outra direcção -- ver, como exemplo, a classe NamedAnimal, que agrega alguma funcionalidade que não lhe pertence intrinsecamente).

Comparar a implementação com a versão sem herança e considerar outras possibilidades de abstracção.

Ficheiro Bird.java
{{{2}}}

Programa Principal

Almost unchanged from the previous versions (only object construction was changed -- it is simpler now).

Ficheiro Application.java
{{{2}}}

Compiling and Running

How to Compile?

The compilation is as follows:

 javac Animal.java
 javac NamedAnimal.java
 javac Dog.java
 javac Cat.java
 javac Mouse.java
 javac Bird.java
 javac Application.java

In fact, compiling Application.java would cause the rest of them be compiled as well (the Java compiler accounts for all explicit class dependencies).

Running

The program starts at a main function (in this case, contained in the Application class):

 java Application