LoginSignup
2
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-01-11

1.目的

  • オブジェクト指向の備忘録
  • UML設計の備忘録

2.概要

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

※具体的な実装に関しては都度行っていく

3.UML設計

UML図(クラス図)

よく使うものまとめ

image.png

アクセス修飾子(UML図)

image.png

4.設計 ~ 実装

戦士の特徴:戦う機能 → インターフェースとして扱う

uploading-0

image.png

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

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

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

image.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

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

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();
        }
    }
}

5.実行結果

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

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

→続きはまたいつか

6.終わり

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

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

2
0
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0