エンティティ・型・インスタンス

プログラムが扱う「何か」を、エンティティと呼びます。エンティティとは、「存在しているもの」「実体としてあるもの」という意味です。あまり正確な言い方ではありませんが、人によっては、オブジェクトと呼ぶこともあります。

ここでわざタイプかたまたはタイプと呼びます。あまり正確な言い方ではありませんが、人によっては、エンティティの種類、概念、カテゴリー、クラスなどと呼ぶこともあります。

かえんほうしゃわざインスタンスと呼びます。インスタンスとは、「実例」という意味です。ほのおタイプのインスタンスです。

わざ型のエンティティには、わざタイプとして、タイプ型のエンティティが設定されている。」と表現できます。

ここで、わざタイプわざ属性またはアトリビュート(attribute)と呼びます。プロパティ(property)と呼ぶこともあります。アトリビュートとは関連づけられるもの、プロパティとは所有物という意味です。

わざ型のエンティティは、他にも、数値型の属性として、ダメージも持っているでしょう。

余談…200.5数値型のインスタンスですが、200.5 を「エンティティ」とは呼ぶことはあまりありません。エンティティとは、存在する数が有限の何かであったり、属性を持つ可能性があったり、生成したり消滅させたりするのに何らかの手続きがあるものを指すことが多いです。

属性の名前と、型は一致する必要がないことに気を付けてください。以下の例もみてください。

ポケモンには、ポケモン型の属性進化前ポケモンがある。」と言えます。「わざ型には、タイプ型の属性がある」の場合ではおおよそ意味がわかりましたが、「ポケモン型には、ポケモン型の属性がある」では意味が分かりません。属性の意味は、型の名前ではなく、属性の名前が重要であることを理解してください。

多対1関係

以下は、わざの属性「わざタイプ」による、わざとタイプの対応関係を示した図です。

かえんほうしゃ
ほのおのうず
そらをとぶ
ゴッドバード
ほのお
ひこう

以下は、この属性を定義するコードの例です。

    let typeList = { "ほのお": 0, "ひこう": 1 };
    let wazaList = {
      "かえんほうしゃ": { wazaType: typeList["ほのお"] }, 
      "ほのおのうず": { wazaType: typeList["ほのお"] },
      "そらをとぶ": { wazaType: typeList["ひこう"] },
      "ゴッドバード": { wazaType: typeList["ひこう"] },
    }
    

(typeList["ほのお"]は、typeList.ほのお と同じ意味です。)

以下は、上のコードを実行した場合のメモリのデータの例です。

メモリの番地データ意味
(typeList)100000 オブジェクト -> 0
(wazaList)100013 オブジェクト -> 13
0200005文字列「ほのお」
10数値 0
2200009文字列「ひこう」
31数値 1
40おわり
512411
612398
712362
80おわり
... (省略)
13200022文字列「かえんほうしゃ」
14100050オブジェクト -> 50
15200030文字列「ほのおのうず」
16100053オブジェクト -> 53
17200037文字列「そらをとぶ」
18100056オブジェクト -> 56
19200043文字列「ゴッドバード」
20100059オブジェクト -> 59
210おわり
22...
23
24
... (省略)
50100062文字列「wazaType」
510数値 0 (「ほのお」タイプ)
520おわり
53100062文字列「wazaType」
540数値 0 (「ほのお」タイプ)
550おわり
56100062文字列「wazaType」
571数値 1 (「ひこう」タイプ)
580おわり
59100062文字列「wazaType」
601数値 1 (「ひこう」タイプ)
610おわり
62...w
63a
64z
65a
... (省略)

多対多関係

以下は、ポケモンの属性「習得可能わざ」による、ポケモンとわざの対応関係を示した図です。

リザードン
キュウコン
ピジョット
かえんほうしゃ
ほのおのうず
そらをとぶ
ふきとばし

以下は、習得可能わざを表すcanLearn属性を定義するコードの例です。

    let typeList = { "ほのお": 0, "ひこう": 1, "ノーマル": 2 };
    let wazaList = {
      "かえんほうしゃ": { wazaType: typeList["ほのお"] },
      "ほのおのうず": { wazaType: typeList["ほのお"] },
      "そらをとぶ": { wazaType: typeList["ひこう"] },
      "ふきとばす": { wazaType: typeList["ノーマル"] },
    };
    let pokemonList = {
      "リザードン": {
          canLearn: [
              wazaList["かえんほうしゃ"],
              wazaList["ほのおのうず"],
              wazaList["そらをとぶ"]
            ]
        },
      "キュウコン": {
          canLearn: [
              wazaList["かえんほうしゃ"],
              wazaList["ほのおのうず"]
            ]
        },
      "ピジョット": {
          canLearn: [
              wazaList["そらをとぶ"],
              wazaList["ふきとばす"]
            ]
        },
    };
    

おなじ種類のエンティティ同士の属性もあります。これは相性の例です。

くさ
みず
ほのお
ひこう
でんき
くさ
みず
ほのお
ひこう
でんき

相性が有利なタイプを属性"advantage"で表すとすると、以下のようなコードで表現可能です。

    let typeList = {
      "ほのお": { name: "ほのお" },
      "みず": { name: "みず" },
      "ほのお": { name: "ほのお" },
      "ひこう": { name: "ひこう" },
      "でんき": { name: "でんき" }
    };
    // タイプにadvantage 属性を設定する。
    typeList["くさ"].advantage = [typeList["みず"]];
    typeList["みず"].advantage = [typeList["ほのお"]];
    typeList["ほのお"].advantage = [typeList["くさ"]];
    typeList["ひこう"].advantage = [typeList["くさ"]];
    typeList["でんき"].advantage = [typeList["みず"], typeList["ひこう"]];
    

いままでの例では、タイプは属性を持たなかったので整数で表していましたが、この例では属性を持つので、オブジェクトに定義を変更しています。

1対1関係

最後に、ポケモンと図鑑番号の例です。この例では、ポケモンと図鑑番号が1対1に対応しています。このように、エンティティと1対1に対応する整数や文字列を、IDと呼ぶこともあります。IDとはIdentifier(特定するもの)の略称です。

リザードン
キュウコン
ピジョット
6
38
18

エンティティ関連図

わざ型のエンティティは、タイプ型の属性わざタイプがあり、その関係は多対1である。」というような、型と型の関係を図で書くことができるとわかりやすくて便利です。

わざ
タイプ
わざタイプ
1

エンティティの関連図が書ければ、どのようなプログラムを書けばよいのか、ほとんど機械的に決めることができます。

練習問題

  1. ポケモン, タイプ, わざの間の関係をすべて表したエンティティ関連図を描いてください。

  2. レストランの経営ゲームを作成しようとしています。このゲームでは、エンティティの型として、
    • 客レベル: 「セレブ」、「普通客」、「貧乏学生」など
    • テーブル
    • メニュー: カレー、シチュー、ハンバーグなど
    • 数値 (価格)
    を扱いたいです。これらのエンティティ型の関連図を描いてください。