FGOで例えると分かりやすい

Fate/Grand Order(FGO)でオブジェクト指向を説明してみます。

ITが必須となった現在、オブジェクト指向言語を学ぶ機会は多いです。しかし初学者のうちに躓きやすい点といえば「オブジェクト指向」という考え方そのものではないでしょうか。

私が何度かプログラミング言語の学習を監督した際に特によく質問を受けた、もしくは問題を解かせてみると誤答率が高いのがこの分野でした。

実感を持ちにくい車の設計図〜などと説明されるより、自分で遊んでシステムも理解しているゲームで例えたほうが分かりやすいはずです。早速説明してみましょう。

なお本記事はLambdaカクテルを大いに参考にしており、骨組みを流用しています。艦これの理解度が高い方はこちらをおすすめします。

クラスとインスタンス – サーヴァント

クラスの考え方とインスタンスの考え方が最も基本にして重要です。同時に最も躓きやすい部分でしょう。

  • クラスセイバーアーチャーはクラスです。ゲーム内でもクラス名と説明されているので分かりやすいかと思います。
  • インスタンスアルトリア・ペンドラゴン沖田総司は「セイバー」クラスのインスタンスです。

クラスとインスタンス、両者の違いはそれが存在を持つかどうかで説明できます。セイバーというサーヴァントは存在しませんが、セイバークラスのサーヴァント(アルトリア・ペンドラゴンや沖田総司)は存在します。

今回はセイバークラスで説明しましたが、例えばギルガメッシュはアーチャークラスですし、酒呑童子はアサシンクラスです。

クラスとはあくまでもサーヴァントの分類であり、そこに実体を持つのはそれぞれ召喚されたサーヴァントだと覚えましょう。

インスタンス生成 – 召喚、現界

沖田総司

さて、クラスとインスタンスの関係が少しわかったかと思いますが、ここでインスタンス生成に触れておきます。

FGOに沖田総司は実装されていますが、あなたが召喚していない場合は沖田総司を自由に使うことはできません。これはあなたが沖田総司というインスタンス生成を行っていないためと言い換えることが出来ます。

フレンドの沖田総司が使える理由は、フレンドは自身のサーヴァントとして沖田総司をインスタンス生成(召喚)しているためです。

変数、インスタンス変数 – フレンドの沖田総司

あなたが召喚した沖田総司と、フレンドの召喚した沖田総司が異なる沖田総司ということは直感的に理解できていると思います。

同じ沖田総司という英霊のサーヴァントですが、それぞれマスターや絆レベル、能力値が異なって管理されています。複数の沖田総司を召喚している場合も同じです。

それぞれの管理された項目を変数と言います。

そしてその変数がインスタンス毎に独立して管理されていることから、インスタンス変数と呼ぶことができます。

この考え方はクラスにも適用できます。沖田総司と酒呑童子では攻撃力やHPが異なりますが、こらはそれぞれ基本となる変数が異なる値で設定されているためです。これをクラス変数と呼べます。

インスタンス変数とクラス変数の違いを説明します。

あなたの召喚した沖田総司のレベルを上げても、他のマスターの沖田総司のレベルまで一緒に上がることはありません。インスタンス変数はインスタンス毎に管理されているからです。

対して運営が沖田総司の基準HPを変更すると、あなたの沖田総司もフレンドの沖田総司も一括して変更後のHPに合わせて書き換わります。これは沖田総司の基準HPがクラス変数であり、あなたの沖田総司のHP(インスタンス変数)はクラス変数を参照して導き出しているからです。

スーパークラスとサブクラス – 使い魔とサーヴァント

沖田総司はセイバークラスのサーヴァントですが、これらはそれぞれをオブジェクト指向上のクラスという概念に当てはめることができます。

  • あなたの召喚した沖田総司は、沖田総司クラスのインスタンスの1つである。
  • フレンドの召喚した沖田総司は、沖田総司クラスのインスタンスの1つである。
  • 沖田総司クラスは、セイバークラスの1つである。
  • セイバークラスは、サーヴァントクラスの1つである。
  • サーヴァントクラスは、使い魔クラスの1つである。

こうして要素を列挙してみると、クラスという概念にも親子関係があることが分かります。この親子関係がスーパークラスサブクラスを表します。

階層としてまとめると分かりやすいです。

ここでは「使い魔」クラスを最上位のクラスとして、その下位に「サーヴァント」クラス、さらに下位に「セイバー」クラスと位置付けています。

下位に位置するクラスは、上位に位置するクラスの性質を引き継いでいます。親子の遺伝に例えられることから親子関係と表現していました。

上位に位置するクラスの性質を引き継いでいる、ということがどういう意味か説明します。セイバークラスは「ランサークラスに強く、アーチャークラスに弱い」という性質を持ちます。これはセイバークラスに属する沖田総司にも引き継がれています。

同じようにセイバークラスは更に上位クラスの性質を引き継いでいて、それが連続しています。結果として沖田総司はそれら全てを基本的に引き継いでいます。

このように性質の引き継ぎ関係にあるクラス同士について、上位(親)クラスをスーパークラスと言い、下位(子)クラスをサブクラスと言います。そしてこの関係を継承していると表現します。

セイバーにとってサーヴァントはスーパークラス、沖田総司はサブクラスとなります。

抽象クラス – セイバー、アーチャー

クラスを実体化したものがインスタンスと説明しました。しかし初めにクラスとインスタンスを説明した際に、セイバークラスそのものは実体を持たないとも説明しました。

これはインスタンスを持つことができるクラスと、インスタンスを持つことができないクラスが存在するための説明でした。

直接インスタンスを持つことができるクラスを具象クラス、直接インスタンスを持つことができないクラスを抽象クラスと呼びます。

抽象クラスは自身を継承する具象クラスが定義されることを前提としたクラスであり、そのままでは複雑な概念を整理して表現するために用いられます。

聖杯戦争において英霊をサーヴァントとして召喚するために、分かりやすくセイバーやアーチャーなどのクラスに落とし込んだ上で召喚していることを思い出すと理解しやすいでしょう。

カプセル化 – コマンドカード

戦闘シーン via マンガで分かる!FGO

マスターは英霊たちのように戦いに精通していません。知っていることといえばコマンドカードのどれを選択すればどのような効果があるか、といった単純なことのみです。

しかし実際に戦闘はそれだけの理解であっても上手く進行してくれます。これは戦いの方針を決めるのはマスター、その方針に従って実際に戦闘するのはサーヴァント、という具合に役割分担が行われているためです。

マスターが敵への攻撃を沖田総司に命令するとき、どのような剣さばきで攻撃すべきなのかといった命令以上のことを考える必要がありません。指示を受けた沖田総司がその細かい部分を考えて実行する役割を担っているためです。

マスターはどの敵を攻撃するのかという判断に集中し、詳しいやり方は沖田総司に任せます。実際の攻撃の仕方は英霊である沖田総司に任せたほうが効率が良いからです。マスターが「そこは右足から踏み込んで斬り上げ!」などと全て指示を出していては戦闘も上手くいかなくなるでしょう。

この「それぞれが役割を担い、その役割にのみ集中する」というオブジェクト指向における重要な考え方がカプセル化です。この考え方を徹底することで各々のやるべき範囲と責任の範囲が明確化し、メンテナンス性が向上します。

沖田総司、酒呑童子、ギルガメッシュら各々のサーヴァントは「攻撃しろ」という命令に対して、それぞれのやり方を理解しています。その指示を受けたらこう動く、という流れが構築されていると言えます。マスターからはその詳細な中身は見えず、ただ指示を出すのみですがそれで上手く戦闘が推移するのです。これがカプセル化出来ている状態となります。

反対にもしカプセル化出来ていないFGOを想定すると、「攻撃しろ」という命令だけではサーヴァントは動けず、マスターがサーヴァントに対して「まずは右足から踏み出して次に左足、それからそれから・・・」という具合に全てを指示しなくてはならなくなります。戦闘時に非効率すぎてやっていられません。

カプセル化されていることで、マスターはとにかく「攻撃しろ」と指示をするだけで済むため、途中でサーヴァントの攻撃のモーションが変わったとしても指示の仕方を変える必要がありません。変更に強いということがカプセル化の強みと言えます。

まとめ

FGOは可愛いしかっこいいし勉強にもなる。

コメントを残す

メールアドレスが公開されることはありません。