オブジェクト指向についてメモ
こんにちは。未来電子テクノロジーでインターンをしている梅原です。
つい最近、オブジェクト指向を学んだので、アウトプットします。
オブジェクトは命令を受けるものです(shiracamusさんありがとうございます、コメント欄参照)
それだけ聞いても、なにもわからないので、今回は
「もしも遊戯王のカードゲームをオブジェクト指向言語で書くとどうなるだろう」
という思考実験的なコンセプトで書きました。
オブジェクト指向を構成する二つの要素(属性とメソッド)
モンスターカードの「ゴブリン突撃部隊」について考える。
ゴブリン突撃部隊に書かれている情報は
地属性
戦士族
ATP(攻撃力)=2300
DEF(守備力)=0
モンスター効果=「攻撃したら守備表示になり、次のターンまで攻撃表示にできない」
などである。
〇属性
上で上げたものはオブジェクト指向ではプロパティなどと呼ぶ。
ではこの情報を与えれば、ゲームをプログラムできるだろうか?
いや出来ないはずだ。
モンスターカードは召喚したり、攻撃したりせねばならぬではないか!
〇メソッド
そう、オブジェクト指向を構成する二つ目の要素はこのようなメソッドである。
「攻撃すると、攻撃表示のモンスターでは攻撃力の低いモンスターが破壊され。。。。。」
といった、メソッドが必要なのだ。
なぜ、オブジェクト指向なのか
では、仮想の遊戯王ゲームをプログラムしていくことを想像してみよう。
いま、オブジェクト指向で遊戯王カードを記述するイメージはできただろう。
では、「ゴブリン突撃部隊」を書いて作り、「ブラックマジシャン」を作り、「死者蘇生」を作り、、、、、。一体いつこのゲームは完成するのだろう。
2017年の時点で、遊戯王カードの種類は8000種類を超えている。
え、無理じゃね???
安心してください。オブジェクト指向の利点を生かせば、そんな苦労をしないで済むのです!
クラスを使う
そもそも、先ほどの例では何が問題なのだろう。
答えは同じ内容を何回も書いているからだ。
モンスターカードは召喚、攻撃するのだからその処理をカードごとに何回も書くのは非効率だ。
だから、モンスターカードクラスを考える。
このクラスは攻撃、召喚、攻撃力、守備力など、共通のものをまとめたものである。
このクラスに対して、個々のモンスターカードはインスタンスと呼ばれる。
車というクラスがあって、ポルシェというインスタンスが存在するという関係と同じだ。
「ゴブリン突撃部隊」はモンスターカードクラスのインスタンスとして作ればよい。
「ブラックマジシャン」はモンスターカードクラスのインスタンスとして作ればよい。
「ブルーアイズホワイトドラゴン」はモンスターカードクラスのインスタンスとして作ればよい。
攻撃力や守備力などを入力するだけで、カードのコードが作れる。
継承とは
よし、これで作業が楽になった。めでたし、めでたし。。。。
そう、あなたは思ったかもしれない。
ところが、上司に「仕様変更でシンクロを追加するから、実装よろしく」と言われてしまった。
シンクロモンスターは普通のモンスターと違って、デッキ外から召喚するし、手続きも異なる。つまり、シンクロモンスターはモンスターカードクラスに属していながら、モンスターカードクラスにないプロパティやメソッドを持っている。
そんな、また、シンクロモンスタークラスを一から作らなければいけないのか。。。。。
安心してくれ、オブジェクト指向の「継承」を使えば一瞬だ。
親クラスがモンスターカードクラス。
子クラスがシンクロモンスターカードクラス。
という状況を考える。
ここで、継承を使えばモンスターカードクラスが持っている機能をシンクロモンスターカードクラスに引き継いで、残りの部分の機能だけ、追加すればいいのだ。
遊戯王には様々な神をモチーフにしたカードが存在するが、「オブジェクト指向」と名のついた、カードがあってもいいのではないか。
オブジェクト指向 Is 神
最後に
実は、プログラミングも、遊戯王も初心者なので、いろいろ間違えていることもあるかもしれません。その時はご指摘ください。
この記事が、誰かの理解の助けになれば幸いです。
参考
https://eng-entrance.com/what-oop
https://qiita.com/hirokidaichi/items/591ad96ab12938878fe1