ドラゴンボールから学ぶオブジェクト指向プログラミング

#１．目的
+ オブジェクト指向の備忘録
+ UML設計の備忘録

#２．概要
ドラゴンボールの世界は悟空・人造人間セル・魔人ブウなどの様々な戦士によって構成されている
今回は一般人と異なる彼らに焦点を置きながらスモールケースの設計・実装を行う

※具体的な実装に関しては都度行っていく
#３．UML設計
####UML図(クラス図)
よく使うものまとめ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497973/30cc9d44-81b3-e6ad-1979-be09a379fe7d.png)

####アクセス修飾子(UML図)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497973/ed25f1a3-ec6a-d801-c7f1-26761bcd513e.png)

#４．設計 ～ 実装


戦士の特徴：戦う機能 → インターフェースとして扱う
 
![uploading-0]()
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497973/bca311f4-0f3c-4a84-13d1-e490fb91d755.png)

```Fighter.java
interface Fighter {
	void fight();
}
```

戦士達は上記の機能を所持し,以下の特徴を持つ

> 
+ 名前
+ 戦闘力
+ 体力
+ 技を習得する
+ 技を繰り出す...など

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497973/9bb5735f-cc99-abdd-ec75-d79332b5213d.png)




```DragonballWarrior.java
public class DragonballWarrior implements Fighter {
	private String name;
	private int property;
	private int HP;

	@Override
	public void fight() {
	}

	public void getSkill() {
	}

	public void doSkill() {
	}
}
```
悟空は戦士のサブクラスとして扱える
戦士の共通項を纏めさらに細分化する

>+ サイヤ人(一定条件下でスーパーサイヤ人化 / 月を見ると猿人)
+ 人造人間(製造番号 / 号機名)
+ 地球人武道家
+ ナメック星人(損傷を自己修復 / 同化)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497973/49cb0294-1804-647b-fd10-734abe3db2b5.png)

```Saiyan.java
public class Saiyan extends DragonballWarrior {
	/** [1:normal / 2:monkey / 3:super-saiyan] */
	private int status;

	public void changeStatus(Saiyan saiyan) {
		this.status = saiyan.status;
	}
}
```

戦士達を戦わせる天下一武道会を設計したい

> + フィールド
+ 戦士
+ 天候

天下一武道会 - 戦士のhas-a関係について考える
スーパークラスのコンストラクタやゲッター/セッターについて定義する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497973/2869da2c-4303-7131-c2b8-51ed2634f47c.png)

```DragonballWarrior.java
public class DragonballWarrior implements Fighter {
	private String name;
	private int property;
	private int HP;

	/** default constractor */
	DragonballWarrior() {
	}

	DragonballWarrior(String name, int property, int HP) {
		this.name = name;
		this.property = property;
		this.HP = HP;
	}

	@Override
	public void fight() {
	}

	public void getSkill() {
	}

	public void doSkill() {
	}

	// S - getter,setter
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getProperty() {
		return property;
	}

	public void setProperty(int property) {
		this.property = property;
	}

	public int getHP() {
		return HP;
	}

	public void setHP(int hP) {
		HP = hP;
	}
	// E - getter,setter
}
```

```Saiyan.java
public class Saiyan extends DragonballWarrior {
	/** [1:normal / 2:monkey / 3:super-saiyan] */
	private int status = 0;

	public Saiyan(String name, int property, int HP) {
		super(name, property, HP);
	}

	public void changeStatus(Saiyan saiyan) {
		this.status = saiyan.status;
	}

	@Override
	public void doSkill() {
		if (super.getName().equals("Goku")) {
			System.out.println("kamehame-ha");
		}
	}

	@Override
	public void fight() {
		if (super.getName().equals("Goku")) {
			System.out.println("ora-Goku!");
		}
	}
```

```Saiyan.java
public class MartialArtist extends DragonballWarrior {
	public MartialArtist(String name, int property, int HP) {
		super(name, property, HP);
	}

	@Override
	public void doSkill() {
		if (super.getName().equals("Kuririn")) {
			System.out.println("kien-zan");
		}
	}

	@Override
	public void fight() {
		if (super.getName().equals("Kuririn")) {
			System.out.println("oreha-Kuririn!");
		}
	}
}
```

```BattleTournament.java
public class BattleTournament {
	private List<DragonballWarrior> dwlist;

	public static void main(String args[]) {
		List<DragonballWarrior> dwlist = new ArrayList<>();
		dwlist.add(new Saiyan("Goku", 50000, 200));
		dwlist.add(new Saiyan("Vegeta", 40000, 250));
		dwlist.add(new MartialArtist("Kuririn", 3000, 80));
		dwlist.add(new MartialArtist("Kamesennin", 3000, 80));
		for (DragonballWarrior dw : dwlist) {
			dw.fight();
			dw.doSkill();
		}
	}
}
```
#５．実行結果

```実行結果.java
ora-Goku!
kamehame-ha
oreha-Kuririn!
kien-zan
```

突っ込みどころ満載ですが
ポリモーフィズムが働いていることを確認できました

→続きはまたいつか

#６．終わり
3ヶ月テスター → 基本設計に回りデザインパターン学ばなければと思い立ちました
完全体セルはシングルトン・クラス設計,技はインターフェースor抽象クラスに纏めてcompositionの関係

今度は匿名クラス→ジェネリクス→ラムダ式と関数型インターフェース→Stream APIについて纏めてみたいです