設定ファイルを使うものは ウェブサーバーだったり 手動実行するスクリプトや常駐するツールなどです
ここでは app1, app2, ... とします
設定する内容は色々ありますが仮に logger の設定と database の設定とします
export default {
logger: {
app1: {
path: "/path/to/log-file1",
},
app2: {
path: "/path/to/log-file2",
},
},
database: {
app1: {
host: "localhost",
user: "user1",
database: "app1",
password: "pw",
},
app2: {
host: "localhost",
user: "user2",
database: "app2",
password: "pw",
}
}
}
みたいに logger や database を外側に書いて app1 や app2 を内側に書くのがひとつです
もうひとつは反対に app1 や app2 を外側に書いて logger や database を内側に書きます
export default {
app1: {
logger: {
path: "/path/to/log-file1",
},
database: {
host: "localhost",
user: "user1",
database: "app1",
password: "pw",
},
},
app2: {
logger: {
path: "/path/to/log-file2",
},
database: {
host: "localhost",
user: "user2",
database: "app2",
password: "pw",
},
},
}
どっちにしようかよく悩むんですよね
外側にある方はトップレベルのキーを見るだけでいいので一覧がすぐわかります
例えば database などが外側だと app1 は内側です
app は何種類あるのかを探すときに各ブロックを見ていくことになり少し手間です
上の例だと database にも logger にも app1 と app2 となっていて 内側のキーは一緒ですが app2 が database を使わないなら database のオブジェクトに app2 キーは存在しなくなります
なので 1 つ目を見るだけでは app が何種類あるかを判断できず logger など他のすべての外側のオブジェクトを見る必要があります
その点では アプリケーションの種類を一覧したいなら app1 などを外側に出すといいです
ただ使うツール・サービスの方も一覧で見たいことがあります
メールを使うものあったっけと思ったときに外側のキーだけを見て無いなとわかります
なのでどっちもどっちなんですよね
外側でグループされた内側の一覧も考えてみます
app1 が外側だと app1 で使うツール・サービスを一覧できるので app1 は database と logger を使うんだ というのがわかりやすいといえます
ただ database を使うのはどれなのか 使う場合の host をまとめて見たい という視点だと database が外側にあって database でグループ化されてるほうが見やすいです
やっぱりどっちという決め手にならないんですよね
それにこれらは見るときの都合です
ちょっとしたスクリプトを書けば階層を展開してフラットにしてフィルタやソートができますし そこまでこだわるほどでもない気がします
各アプリケーションが設定を保持することを考えると トップレベルにある自身の名前空間だけを取得して残りは捨てれる app1 を外側に持ってくるパターンの方がいいのかもしれません
その考えで言えば最初から設定ファイルはアプリケーションごとに作ればとも思えてきます
でもそれをまとめている理由は共通部分があるからのはずです
データベースは全部共通だったり データベースやスキーマは別でもホストは共通とかあります
共通部分を外側の database として書いて 個別に違うところだけを app1 みたいなキーも用意して書いてみると
export default {
database: {
host: "localhost",
user: "user1",
database: "app1",
password: "pw",
},
app1: {
// 共通と一緒
},
app2: {
database: {
// データベースだけ違う
database: "app2",
},
},
}
外側にキーが混ざるのでネストする形にすると
export default {
database: {
host: "localhost",
user: "user1",
database: "app1",
password: "pw",
app2: {
database: "app2",
},
},
}
量は少なくなって共通部分と差分という形はわかりますが 脳内でマージしないといけないので本当に見やすいのか疑問です
脳内に限らず実際に使うときも差分形を解決して一つのオブジェクトにする必要があります
それなら冗長でも最初のような形のほうが良かった気がします
同じ設定を繰り返すので変更時に複数箇所の変更が必要になりますが 一括置換できますし JavaScript で作るオブジェクトなので変わりそうなら変数に入れておくこともできます
となると 最初に戻るわけですが どっちにするか悩みます