プログラムが扱う「何か」を、エンティティと呼びます。エンティティとは、「存在しているもの」「実体としてあるもの」という意味です。あまり正確な言い方ではありませんが、人によっては、オブジェクトと呼ぶこともあります。
ここでわざやタイプを
かえんほうしゃをわざのインスタンスと呼びます。インスタンスとは、「実例」という意味です。ほのおはタイプのインスタンスです。
「わざ型のエンティティには、わざタイプとして、タイプ型のエンティティが設定されている。」と表現できます。
ここで、わざタイプをわざの属性またはアトリビュート(attribute)と呼びます。プロパティ(property)と呼ぶこともあります。アトリビュートとは関連づけられるもの、プロパティとは所有物という意味です。
わざ型のエンティティは、他にも、数値型の属性として、ダメージも持っているでしょう。
余談…20 や 0.5 は数値型のインスタンスですが、20 や 0.5 を「エンティティ」とは呼ぶことはあまりありません。エンティティとは、存在する数が有限の何かであったり、属性を持つ可能性があったり、生成したり消滅させたりするのに何らかの手続きがあるものを指すことが多いです。
属性の名前と、型は一致する必要がないことに気を付けてください。以下の例もみてください。
「ポケモンには、ポケモン型の属性進化前ポケモンがある。」と言えます。「わざ型には、タイプ型の属性がある」の場合ではおおよそ意味がわかりましたが、「ポケモン型には、ポケモン型の属性がある」では意味が分かりません。属性の意味は、型の名前ではなく、属性の名前が重要であることを理解してください。
以下は、わざの属性「わざタイプ」による、わざとタイプの対応関係を示した図です。
以下は、この属性を定義するコードの例です。
let typeList = { "ほのお": 0, "ひこう": 1 }; let wazaList = { "かえんほうしゃ": { wazaType: typeList["ほのお"] }, "ほのおのうず": { wazaType: typeList["ほのお"] }, "そらをとぶ": { wazaType: typeList["ひこう"] }, "ゴッドバード": { wazaType: typeList["ひこう"] }, }
(typeList["ほのお"]は、typeList.ほのお と同じ意味です。)
以下は、上のコードを実行した場合のメモリのデータの例です。
メモリの番地 | データ | 意味 |
---|---|---|
(typeList) | 100000 | オブジェクト -> 0 |
(wazaList) | 100013 | オブジェクト -> 13 |
0 | 200005 | 文字列「ほのお」 |
1 | 0 | 数値 0 |
2 | 200009 | 文字列「ひこう」 |
3 | 1 | 数値 1 |
4 | 0 | おわり |
5 | 12411 | ほ |
6 | 12398 | の |
7 | 12362 | お |
8 | 0 | おわり |
... | (省略) | |
13 | 200022 | 文字列「かえんほうしゃ」 |
14 | 100050 | オブジェクト -> 50 |
15 | 200030 | 文字列「ほのおのうず」 |
16 | 100053 | オブジェクト -> 53 |
17 | 200037 | 文字列「そらをとぶ」 |
18 | 100056 | オブジェクト -> 56 |
19 | 200043 | 文字列「ゴッドバード」 |
20 | 100059 | オブジェクト -> 59 |
21 | 0 | おわり |
22 | ... | か |
23 | え | |
24 | ん | |
... | (省略) | |
50 | 100062 | 文字列「wazaType」 |
51 | 0 | 数値 0 (「ほのお」タイプ) |
52 | 0 | おわり |
53 | 100062 | 文字列「wazaType」 |
54 | 0 | 数値 0 (「ほのお」タイプ) |
55 | 0 | おわり |
56 | 100062 | 文字列「wazaType」 |
57 | 1 | 数値 1 (「ひこう」タイプ) |
58 | 0 | おわり |
59 | 100062 | 文字列「wazaType」 |
60 | 1 | 数値 1 (「ひこう」タイプ) |
61 | 0 | おわり |
62 | ... | w |
63 | a | |
64 | z | |
65 | a | |
... | (省略) |
以下は、ポケモンの属性「習得可能わざ」による、ポケモンとわざの対応関係を示した図です。
以下は、習得可能わざを表す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に対応する整数や文字列を、IDと呼ぶこともあります。IDとはIdentifier(特定するもの)の略称です。
「わざ型のエンティティは、タイプ型の属性わざタイプがあり、その関係は多対1である。」というような、型と型の関係を図で書くことができるとわかりやすくて便利です。
エンティティの関連図が書ければ、どのようなプログラムを書けばよいのか、ほとんど機械的に決めることができます。