Herança e Composição/Exercício 03: Energia: Difference between revisions
From Wiki**3
< Herança e Composição
No edit summary |
|||
Line 17: | Line 17: | ||
== Conceito de Animal == | == 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). | |||
<java5> | |||
public class Animal { | |||
/** | |||
* The animal's base energy value. | |||
*/ | |||
private final int _baseEnergy; | |||
/** | |||
* The dog's current energy value. | |||
*/ | |||
private int _energy; | |||
/** | |||
* The animal's energy spent when running. | |||
*/ | |||
private final int _runEnergy; | |||
/** | |||
* Note that baseEnergy and runEnergy are final and thus, constant after | |||
* initialization. | |||
* | |||
* @param baseEnergy | |||
* @param energy | |||
* @param runEnergy | |||
*/ | |||
Animal(int baseEnergy, int energy, int runEnergy) { | |||
_energy = Math.min(energy, baseEnergy); | |||
_baseEnergy = baseEnergy; | |||
_runEnergy = Math.min(runEnergy, baseEnergy); | |||
} | |||
/** | |||
* @param baseEnergy | |||
* @param runEnergy | |||
*/ | |||
Animal(int baseEnergy, int runEnergy) { | |||
_energy = _baseEnergy = baseEnergy; | |||
_runEnergy = Math.min(runEnergy, baseEnergy); | |||
} | |||
/** | |||
* @return the animal's base energy level. | |||
*/ | |||
public int getBaseEnergy() { | |||
return _energy; | |||
} | |||
/** | |||
* @return the animal's current energy level. | |||
*/ | |||
public int getEnergy() { | |||
return _energy; | |||
} | |||
/** | |||
* @param energy | |||
* the animal's new energy level. | |||
*/ | |||
public void setEnergy(int energy) { | |||
_energy = energy; | |||
} | |||
/** | |||
* @return the animal's energy spent when running | |||
*/ | |||
public int getRunEnergy() { | |||
return _runEnergy; | |||
} | |||
/** | |||
* @param delta | |||
*/ | |||
void increaseEnergy(int delta) { | |||
_energy += delta; | |||
} | |||
/** | |||
* When an animal runs, the energy decreases by 50 units. This value could | |||
* be defined as an attribute or as a constant. | |||
* | |||
* @return whether the dog was able to run. | |||
*/ | |||
public boolean run() { | |||
if (_energy < _runEnergy) | |||
return false; | |||
_energy -= _runEnergy; | |||
return true; | |||
} | |||
/** | |||
* Energy is recovered when sleeping. | |||
*/ | |||
public void sleep() { | |||
_energy = _baseEnergy; | |||
} | |||
/** | |||
* @see java.lang.Object#equals(java.lang.Object) | |||
*/ | |||
@Override | |||
public boolean equals(Object o) { | |||
if (o instanceof Animal) { | |||
Animal animal = (Animal) o; | |||
return _baseEnergy == animal.getBaseEnergy() && _energy == animal.getEnergy() | |||
&& _runEnergy == animal.getRunEnergy(); | |||
} | |||
return false; | |||
} | |||
/** | |||
* @see java.lang.Object#toString() | |||
*/ | |||
@Override | |||
public String toString() { | |||
return "base energy: " + _baseEnergy + ", energy left: " + _energy + ", spent running: " | |||
+ _runEnergy; | |||
} | |||
} | |||
</java5> | |||
== Conceito de Cão == | == Conceito de Cão == |
Revision as of 19:39, 27 September 2009
Problema
Considere o Exercício 02 da Introdução aos Objectos.
Resolva agora o mesmo problema, mas considerando 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.
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
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).
<java5> public class Animal {
/** * The animal's base energy value. */ private final int _baseEnergy;
/** * The dog's current energy value. */ private int _energy;
/** * The animal's energy spent when running. */ private final int _runEnergy;
/** * Note that baseEnergy and runEnergy are final and thus, constant after * initialization. * * @param baseEnergy * @param energy * @param runEnergy */ Animal(int baseEnergy, int energy, int runEnergy) { _energy = Math.min(energy, baseEnergy); _baseEnergy = baseEnergy; _runEnergy = Math.min(runEnergy, baseEnergy); }
/** * @param baseEnergy * @param runEnergy */ Animal(int baseEnergy, int runEnergy) { _energy = _baseEnergy = baseEnergy; _runEnergy = Math.min(runEnergy, baseEnergy); }
/** * @return the animal's base energy level. */ public int getBaseEnergy() { return _energy; }
/** * @return the animal's current energy level. */ public int getEnergy() { return _energy; }
/** * @param energy * the animal's new energy level. */ public void setEnergy(int energy) { _energy = energy; }
/** * @return the animal's energy spent when running */ public int getRunEnergy() { return _runEnergy; }
/** * @param delta */ void increaseEnergy(int delta) { _energy += delta; }
/** * When an animal runs, the energy decreases by 50 units. This value could * be defined as an attribute or as a constant. * * @return whether the dog was able to run. */ public boolean run() { if (_energy < _runEnergy) return false; _energy -= _runEnergy; return true; }
/** * Energy is recovered when sleeping. */ public void sleep() { _energy = _baseEnergy; }
/** * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object o) { if (o instanceof Animal) { Animal animal = (Animal) o; return _baseEnergy == animal.getBaseEnergy() && _energy == animal.getEnergy() && _runEnergy == animal.getRunEnergy(); } return false; }
/** * @see java.lang.Object#toString() */ @Override public String toString() { return "base energy: " + _baseEnergy + ", energy left: " + _energy + ", spent running: " + _runEnergy; } } </java5>