継承される設定を子スコープで部分上書きすると、置換セマンティクスなら未指定キーごと消える
設計判断
検証
設定管理
知識
判断
運用
親スコープの既定値が子スコープへ継承される設定機構(フレームワークのメタデータ定義、テンプレート継承、マニフェストのオーバーレイ等)で、子側が一部のキーだけを指定したいときの判断。
問題の型
マージであれば未指定キーは親から引き継がれるが、置換セマンティクスの場合は子が書かなかったキーごと消える。ネストしたオブジェクト単位で置換する実装は珍しくないのに、ドキュメントで強調されないことが多い。
たちの悪さは、消えるのが「書いていないもの」だから diff にもレビューの目にも現れないこと。しかも「子で 1 キーだけ足す」変更は見た目最も安全に見えて、置換なら最も破壊的になる。共有面(外部へ公開されるメタ情報等)を直すつもりで、同じ共有面を別方向へ壊すことが起きる。
判断
継承させたい既定値は定数として切り出し、親・子の双方が明示的に展開する。子スコープ向けの組み立てヘルパーを 1 本作り、全子スコープをそこへ通す。「各子で忘れずに書く」では必ず漏れる。
値を二重に定義しないことも同じ系統の問題で、親側のテンプレートと子側の組み立てを別々に書くと、片方だけ変えて出力が食い違う。正本を 1 箇所に置いて両方が参照すれば、ずれる経路自体が消える。
検証方法
実装の読解だけでは検出できない。最終生成物のキー集合を親スコープと子スコープで突き合わせ、減っていないことを確かめる。レンダリング済みの出力、生成された設定ファイル、適用後のマニフェストなど、実際に出ていくものを見る。
変更前にベースラインとしてキー集合を採取しておくと差分が取れる。ユニットテストを置くなら「既定値キーが含まれること」を直接表明する(子が指定したキーだけを見るテストは、この消失を素通りさせる)。