その昔、文系からシステム会社に就職したものの、基本情報試験合格という課題を課せられました。
午後の基本情報試験は選択問題があり、Javaで戦うことを決意し猛勉強を始めました。
ところが、全くabstractやclassの概念が頭に入らず、頭の良い人に泣きつくことにしました。
※大まかな枠を掴むレベルなので詳しく知りたい方は別の記事をご覧ください
オブジェクト指向が分からない・・・
対策本とか読んでいると下記の3原則が出てきます。
・継承
・カプセル化
・ポリモーフィズム
これらを理解することでオブジェクト指向の理解度が大きく変わります。(個人的感想)
Fateに置き換えて考えよう
私は特別Fateが好きとかではないのですが、ちょうどそのスマホゲームをやっていたので題材にしてくれました。
設計によって作り方は変わってきますのであくまで一例として認識いただければと思います。
オブジェクト
英霊たちがオブジェクトにあたります。器を求めて攻撃したり、呪いをかけられたり、必殺技(メソッド)を使ったりします。
このクラスがわちゃわちゃすることで物語(システム)が動きます。
インターフェース
サーヴァントという概念にあたります。
オブジェクトたちがぐちゃぐちゃだと物語がおかしくなったり、性能差がありすぎてバトルにならないなど問題が起きます。
ある程度決まりを持たせるために枠を作ってあげなければなりません。
それがインターフェースです。
例えば、「サーヴァントには宝具という必殺技を持っている」や「ランク」「属性」などのパラメータを持っています。
注意点としては、このインターフェース時点では「どういう宝具か」や「何属性か」は分からないという点です。あくまで枠であり実体ではないということを理解しておきましょう。
(Java8以降、defaultを使って実装可能らしい。言語によって違うのも要注意。)
abstractクラス
アブストラクトクラス、抽象クラスと呼ばれます。カタカナで書くと変な感じがしますね。
これがセイバーやライダーなどのクラスにあたります。
セイバーのクラスには基本ステータスが設定されていたり、特殊能力があります。別のクラスにもそれぞれ異なる設定することができます。
ただし、アブストラクトクラスのみで実体化(オブジェクト)はされません。セイバーと言われても思い浮かぶのが、アルトリアペンドラゴンなのか、武蔵ちゃんなのかと「どれ?」と指定できないですよね。抽象的だから=抽象クラスと覚えるとよいでしょう。
インターフェースとは違いは項目が設定された状態にできることでしょう。(細かく言うと違うところもありますが。。。)
継承
セイバーのクラスで「ケンシン」というサーヴァントを新規で作りたい場合、セイバーというアブストラクトクラスを継承した「ケンシン」を作れば完成です。
この「ケンシン」はセイバーとしての能力を持った実体(オブジェクト)になります。
作りたいものに合わせたアブストラクトクラスを作成、継承させてサーヴァントを作ると物語(システム)に合う実体(オブジェクト)を何も考えることなく作ることができます。
カプセル化
アルトリアペンドラゴンと名前が分かると宝具が分かってしまい攻撃を受けやすくなります。それを防ぐために身命を隠して戦いますよね。
とはいえ、マスターも知らないとなると困るので真名を取得できるようにメソッドを持っておきます。すると、よくありがちな「実体の名前」と直接取得はできないが、「実体の名前を取得してきてくれい」や「実体の名前をくださーい」とマスターしか知らない呪文を唱えれば取得が可能です。
このように情報が簡単に漏れないよう隠しておくことカプセル化といいます。
ポリモーフィズム
必殺技は宝具として扱われていますが、宝具の中身はそれぞれ違います。つまり、
宝具→アルトリアペンドラゴン→エクスカリバー
宝具→エミヤ→UBW
みたいに呼び出し方は同じでも実体(オブジェクト)が違うことで振る舞いが変わることをいいます。
結論
オブジェクト指向って意外と身近なものでも置き換え可能っぽいですね。
今回はゲームで例えたので実際のゲームのそんな感じで作ってるのかなーという感じですが。。。
個人的にはとてもしっくりきましたし、おかげで基本情報試験に合格できました。