この記事はSRA Advent Calendar 2016の1日目の記事です。
アプリケーションを作っていると「設定ファイル」を使うことが多いと思います。
そんな時、どのような形式で設定ファイルを記述してますか?
私は今までJavaによる開発が多かったのですが、Javaでは一時期「設定ファイルはXMLで」というのが大流行りでフレームワークの設定ファイルはXMLというのが当たり前でした。
Javaには java.util.Properties
というクラスがありプロパティファイルをサポートする機能があるのですが、
- 単純な
key=value
という形式のため配列やXMLのような階層構造を持った設定には向いていない - 日本語を設定するにはUnicode表記にするために
native2ascii
で変換したりしないといけない
などの理由により、決して使い勝手がいいものではありませんでした。
ただ、2についてはIDEのサポートにより native2ascii
コマンドを叩く機会はほとんどなくなりましたし、Java9からはUTF-8での記述が可能になるようなので実際に気にすることはなさそうです。
XML
先ほども述べたように、Javaでは一時期XMLによる設定ファイルが当たり前の世界になっていました。
XMLは階層構造になった設定もOKだし、一つのキーに複数の値を設定することもできます。
ParserやJavaオブジェクトへマッピングするライブラリを使えば実装も楽でした。
XMLの例(一部)
<streetFighter>
<characters>
<character>
<name>リュウ</name>
<country>Japan</country>
<specialAttacks>
<specialAttack>波動拳</specialAttack>
<specialAttack>昇竜拳</specialAttack>
<specialAttack>竜巻旋風脚</specialAttack>
<specialAttacks>
</character>
<character>
<name>ガイル</name>
<country>USA</country>
<specialAttacks>
<specialAttack>ソニックブーム</specialAttack>
<specialAttack>サマーソルトキック</specialAttack>
<specialAttacks>
</character>
</characters>
</streetFighter>
色々と長所のあるXMLですが、
- 記述量が多い
- 可読性が良くない
という欠点があります。
JSON
次に、JavaScriptの世界では昔からよく使われ、最近ではRESTなどのWebアプリでもよく使われるJSONを設定ファイルとして使ってみてはという話です。
JSONは名前(JavaScript Object Notation)の通りJavaScriptではオブジェクトそのものを記述することができる形式のため、JavaScriptとの相性は抜群です。
また、XML同様階層構造や配列も表記できるため設定ファイルとしてもすぐれていると言えます。
JSONの例(一部)
{
"streetFighter": {
"characters": [
{"name": "リュウ",
"country": "Japan",
"specialAttacks": ["波動拳", "昇竜拳", "竜巻旋風脚"]
},
{"name": "ガイル",
"country": "USA",
"specialAttacks": ["ソニックブーム", "サマーソルトキック"]
}
]
}
}
XMLに比べるとかなりマシですが、やはり可読性はあまり良くありませんし、キーをダブルクォーテーションで囲まないといけないのも面倒です。
そしてJSONにはコメントが書けないという大きな欠点もあります。
YAML
次はYAMLです。
YAMLはJSONと似ていますが、JSONよりも記述量が少ないので設定ファイルとして非常にすぐれたものになっています。
YAMLの例(一部)
streetFighter:
characters:
- name: リュウ
country: Japan
specialAttacks:
- 波動拳
- 昇竜拳
- 竜巻旋風脚
- name: ガイル
country: USA
specialAttacks:
- ソニックブーム
- サマーソルトキック
また、ネストはスペースインデント(タブはNG)という特徴を持っており、コメントを記述することもできます。
TOML
最後にTOMLです。
YAMLは設定ファイルを記述するのに非常にすぐれた言語ですが、TOMLはYAMLよりもシンプルな言語仕様で、可読性も高い言語です。
TOMLの例(一部)
[streetFighter]
[[streetFighter.characters]]
name = "リュウ"
country = "Japan"
specialAttacks = ["波動拳", "昇竜拳", "竜巻旋風脚"]
[[streetFighter.characters]]
name = "ガイル"
country = "USA"
specialAttacks = ["ソニックブーム", "サマーソルトキック"]
他の言語と違い、キーに上位のキーも記述するためネスト時の可読性がとても高くなります。
また、上位のキー(ここでは「streetFighter」)を必ずしも書く必要がなく、上記の例は実は
[[streetFighter.characters]]
name = "リュウ"
country = "Japan"
specialAttacks = ["波動拳", "昇竜拳", "竜巻旋風脚"]
[[streetFighter.characters]]
name = "ガイル"
country = "USA"
specialAttacks = ["ソニックブーム", "サマーソルトキック"]
だけでよくなります。
TOMLは言語仕様がシンプルなこともあり、各種言語のパーサもたくさんあります。
今後、システム開発で設定ファイルを作成する時にはTOMLも選択肢として検討してみてはどうでしょうか。