Skip to content

Instantly share code, notes, and snippets.

@rotelstift
Created January 8, 2023 08:21
Show Gist options
  • Save rotelstift/c3f761c18cf83616bf9124da4ee08007 to your computer and use it in GitHub Desktop.
Save rotelstift/c3f761c18cf83616bf9124da4ee08007 to your computer and use it in GitHub Desktop.
良いコード/悪いコードで学ぶ設計入門を見ながら書いたコード
import java.util.HashMap;
import java.util.Map;
class Main {
static final Map<MagicType, Magic> magics = new HashMap<>();
public static void main(String[] args) {
final Caster caster = new Caster("アルトリア", 90);
final Fire fire = new Fire(caster);
final Thunder thunder = new Thunder(caster);
final HellFire hellFire = new HellFire(caster);
magics.put(MagicType.fire, fire);
magics.put(MagicType.thunder, thunder);
magics.put(MagicType.hellFire, hellFire);
magicAttack(MagicType.thunder);
}
static void magicAttack(final MagicType magicType) {
final Magic usingMagic = magics.get(magicType);
System.out.println(usingMagic.name());
}
}
enum MagicType {
fire,
thunder,
hellFire
}
class Caster {
private static int GROWTH_RATE_OF_AGILITY = 5;
private static int GROWTH_RATE_OF_MAGIC_ATTACK = 15;
private static int GROWTH_RATE_OF_VITALITY = 2;
String name;
int level;
int agility;
int magicAttack;
int vitality;
Caster(final String name, final int level) {
this.name = name;
this.level = level;
this.agility = level * GROWTH_RATE_OF_AGILITY;
this.magicAttack = level * GROWTH_RATE_OF_MAGIC_ATTACK;
this.vitality = level * GROWTH_RATE_OF_VITALITY;
}
}
class MagicPoint {
final int value;
MagicPoint(final int value) {
this.value = value;
}
}
class AttackPower {
final int value;
AttackPower(final int value) {
this.value = value;
}
}
class TechnicalPoint {
final int value;
TechnicalPoint(final int value) {
this.value = value;
}
}
interface Magic {
String name();
MagicPoint costMagicPoint();
AttackPower attackPower();
TechnicalPoint costTechnicalPoint();
}
class Fire implements Magic {
private final Caster caster;
Fire(final Caster caster) {
this.caster = caster;
}
public String name() {
return "ファイア";
}
public MagicPoint costMagicPoint() {
return new MagicPoint(2);
}
public AttackPower attackPower() {
final int value = 20 + (int)(caster.level * 0.5);
return new AttackPower(value);
}
public TechnicalPoint costTechnicalPoint() {
return new TechnicalPoint(0);
}
}
class Thunder implements Magic {
private final Caster caster;
Thunder(final Caster caster) {
this.caster = caster;
}
public String name() {
return "紫電";
}
public MagicPoint costMagicPoint() {
final int value = 5 + (int)(caster.level * 0.2);
return new MagicPoint(value);
}
public AttackPower attackPower() {
final int value = 50 + (int)(caster.agility * 1.5);
return new AttackPower(value);
}
public TechnicalPoint costTechnicalPoint() {
return new TechnicalPoint(5);
}
}
class HellFire implements Magic {
private final Caster caster;
HellFire(final Caster caster) {
this.caster = caster;
}
public String name() {
return "地獄の業火";
}
public MagicPoint costMagicPoint() {
return new MagicPoint(16);
}
public AttackPower attackPower() {
final int value = 200 + (int)(caster.magicAttack * 0.5 + caster.vitality * 2);
return new AttackPower(value);
}
public TechnicalPoint costTechnicalPoint() {
final int value = 20 + (int)(caster.level * 0.4);
return new TechnicalPoint(value);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment