DSL / Migrating DSLs


DSL

DSLのマイグレーション

一言要約

DSLの進化に対応するため、マイグレーションツールを提供しましょう。

要約

DSLはソフトウェアと同様に進化していくため、古いバージョンで書かれたDSLで新しいバージョンを実行すると失敗することがある。

本質的にDSLは変更することは何もなく、DSLの定義は基本的に公開されたインタフェースであり、同じ結果になるよう対応しなければならない。

内部DSLはリファクタリングツールを使えるが外部DSLには対応できない(ただし、それほど問題にはならない)。

DSLの進化に対処するテクニックの一つは、DSLをあるバージョンから別のバージョンに自動移行するツールを提供することだ。

マイグレーションには大きく分けて2つの方法がある。

  • 増分マイグレーション
  • モデルベースのマイグレーション

増分マイグレーションは、DSLを旧から新へ自動的に移行するプログラムを生成するアプローチ。

増分マイグレーションは、変更をできるだけ小さくするようにすることが重要である。変更が小さく、複数を連結する方が簡単にマイグレーションを行える。

モデルベースのマイグレーションはSemantic Modelを使用している場合に使えるアプローチであり、リリースごとに専用のパーサを用意する。スクリプトのマイグレーションは行わない。

問題は、Semantic Modelにとって重要でないけれどもスクリプト作成者にとって残しておきたいもの(例:コメント)がマイグレーションによって失われてしまうことだ。

私が2つの選択肢についてどっちを勧めるということはない。

ファウラーへのフィードバック

  • Semantic ModelInternal DSL?External DSL?にリンク張っといてほしい

担当者のつぶやき

  • 増分マイグレーションはRailsのrake db:migrateでなじみがある(DSLじゃないけどね)けど、モデルベースはなじみがない。実装例としては何があるだろう?

みんなの突っ込み

  • 最後の段落、古いバージョンのDSLで新しいバージョンのモデルを作るアプローチもある、って言ってます?そんなうまくいくのかなぁ。 -- kentaro714? 2009-10-31 (土) 04:38:28
  • モデルベース思いつかない…DDL→DBスキーマ→ORMマッピングファイルとか近い物を感じますが、バージョンアップでもなければ(少なくとも片方は)DSLでもないですね。 -- kentaro714? 2009-10-31 (土) 04:40:02