SakuraCrowd’s blog

ゲーム製作を中心としたパソコン関係のブログです。気軽にコメントしてください。

SakuraCrowd's BlogSpot にお引越しをしつつあります。
マッハこうもり ver1.1
マッハこうもり ver1.1
BLK2048
BLK2048
CandyMaze
CandyMaze
くの一宅配便
くの一宅配便
団子大砲 ver1.1
団子大砲 ver1.1

プチコン3号 関連記事のリスト
作品集の公開キーは【43K534A3】です。2015/03/04にアップロード。プチコン 3.1.0 で動作確認済みです。
ニンドリ公式ライブラリの公開キー【VK3KN3DM】から、同じ作品集をダウンロードできます。
マッハこうもり(MACH_BAT1_1), BLK2048, CandyMaze, くの一宅配便(9_1DELI)をプレイすることができます。

CandyMazeプチコン3号 - プチコン大喜利のアイディア賞にノミネートされました!
日経ソフトウェア2015年4月号「くの一宅配便」が掲載されました!専用の公開キーは【7474X33J】です。

Unity
団子大砲 ver1.1を公開しました。時間を表示し、ツイートとリセット機能を追加しました。
あほげー 第16回作品にエントリーしました。59作品中36位のあほさらしいです。エントリーしたver1.0はこちらです。

JSON のオブジェクトを ID でリンクする

複数のプロパティに同じ値のオブジェクトを設定するのは面倒だし同じであることがわかりにくい。

{"prop1":{"value":12345},

 "prop2":{"value":12345},

 "prop3":{"value":12345}}

 

いちいち同じ値のオブジェクトを記述しないで、共通のオブジェクトを参照したくなりました。

あれ={"value":12345}

{"prop1":あれ, "prop2":あれ, "prop3":あれ}

 

 そこで、 ID というプロパティを持たせて、オブジェクトを ID で表せないか考えました。

共通のオブジェクトを指定したい場合は、そのプロパティにオブジェクトの ID を指定します。

{"id":"hoge", "value":12345}

{"prop1":"hoge", "prop2":"hoge", "prop3":"hoge"}

 

ID といってもただの文字列なので、読み込み側でオブジェクトが指定されるはずのプロパティで文字列があったら、その文字列を ID とするオブジェクトを割り当てる処理が必要です。

 「オブジェクトが指定されるはずのプロパティ」かどうかを判別する手段として、あらかじめ読み込み側に教えておくか、プロパティ名にプレフィックスなどをつけて表すことが考えられます。

さらに何かないかと調べていると、JSON のハイパースキーマ仕様には参照型というものがある事を知りました。

JSONだってハイパーメディア -- JSONハイパースキーマ仕様をなんとかしたい - 檜山正幸のキマイラ飼育記

URL をただの文字列ではなく "$ref" というプロパティの値として指定することで、その文字列が参照であることを表します。

 

これを先ほどの例に適用すると、さきほどよりも参照であることが明確にわかるようになりました。

{"id":"hoge", "value":12345}

{"prop1":{"$ref":"hoge"}, "prop2":{"$ref":"hoge"}, "prop3":{"$ref":"hoge"}}

 

$ref をいちいち打つのが面倒とか思ってしまいそうですが、今後も特別な意味を持つ文字列を扱いたい場合などにこの方法は有効だと思いました。

直接の関係はありませんが、ECMA script 5 の property descriptor も値をオブジェクトに包んで情報を付加しています。

 

これならば読み込み側でプロパティによって処理を変える必要はないので、扱うデータによって読み込み側を変更する必要はありません。

「$ref プロパティだけのオブジェクト」が値の場合は参照として処理すればよいだけです。

 

今日は仕様をある程度形にできました。明日は実装までいきたいです。

JavaScript 自体まだ不慣れなところがありますが、テストケースのフレームワークがあればそれを使ってみたいです。