ポリモーフィズムを使用するようにしてください。
スイッチ/if-elsesの場合
攻撃を表すインターフェースを作成し、単一のメソッドを宣言させます。
public interface Attack {
double doAttack(double baseDamage);
}
次に、このインターフェイスを実装するクラスを作成します。
public class FireAttack implements Attack {
double doAttack(double baseDamage){
return 1.1 * baseDamage;
}
}
public class IceAttack implements Attack {
double doAttack(double baseDamage){
return 2 * baseDamage;
}
}
次に、コードでswitchステートメントを使用する代わりに、次のようにします。
public class Player {
private Attack mAttack;
// Somewhere in your code, you setup something like
void setFireWeapon(){
mAttack = new FireAttack();
}
// This is where the attack is taken care of
double inflictDamage() {
return mAttack.doAttack();
}
}
これにより、将来必要になる可能性のある新しいタイプの攻撃をAttack mAttack
実装し、この新しいインターフェイスの実装を割り当てるだけで済みますAttack
。これは些細な例です。必要な場合よりもはるかに強力な処理を実行できますbaseDamage * aDouble
。
ステータス(焼け/冷凍)について
凍結などの状態を実装する方法はたくさんあります。まず、上で説明したのと同じパターンを使用できます。
メンバーを持つことに加えて、または任意の名前Attack mAttack
で同様のロジックを追加することもできます。HealthStatus mHealthStatus
次に、を呼び出すと、オブジェクトがオブジェクトにinflictDamage()
リダイレクトされます。mAttack
mHealthStatus
その場合、HealthStatus
クラスは再びインターフェイスになります。
public interface HealthStatus {
double considerAttack(Attack anAttack);
}
さまざまな状態の実装があります。
public class NormalStatus implements HealthStatus{
double considerAttack(Attack anAttack){
return anAttack.doAttack(); // No change here
}
}
public class FrozenStatus implements HealthStatus{
double considerAttack(Attack anAttack){
return 0; // Can't attack when froxen
}
}
public class BurnedStatus implements HealthStatus{
double considerAttack(Attack anAttack){
return anAttack.doAttack() * 2.0; // Get berserk when on fire!
}
}
他のパターンを使用することもできます。直面しているような問題を解決するデザインパターンを確認することをお勧めします。
ほんの数例を挙げると。