How to Generate †
要約 †
- どんな種類のコードを生成するかを考えたら、その次に決めることはどのように生成プロセスに取り掛かるかということ。
- テキストの出力を生成するのに、2つの方法に従うことができる。
- Transformer Generation
- セマンティックモデルを読んでターゲットのソースコードの命令文を生成するコードを書く。
- 状態の例ではイベントを見つけ、それぞれのイベントを宣言するための出力コードを生成し、同様にコマンドも状態も生成する。
- 状態が遷移を持つので、コード生成はそれぞれの状態が遷移先とそれぞれのコード生成も含む。
- Templated Generation
- サンプルの出力ファイルを書くことから始める。
- この出力ファイルでは、特定の状態マシンになにか特有なものがあるところではどこでも、適切なコードを生成するためにセマンティックモデルを呼び出せるよう、特殊なテンプレートマーカーを配置する。
- ASPやJSPのようなツールでWebページをテンプレート化しことがあれば、このメカニズムにはなじんでるはず。
- テンプレートを処理するときは、テンプレートの参照を生成したコードで置き換える。
- Templated Generationでは、出力の構造によって駆動する。
- Transformer Generationでは、入力か出力あるいはその両方で駆動する。
- どちらのアプローチもよく機能し、どちらを選ぶのにも、それぞれを試してよさそうなのを選べばよい。
- Templated Generationは出力に静的コードが多くて動的なのがちょっとしたものである時はよく機能し、特にテンプレートファイルを見れて生成されるものの感触をよくつかめる。
- 結論として、Model Ignorant Generationを使う場合はTemplated Generationを使うことになると思われる。
- Fowler自身はTransformer Generationが好き。
- これらを正反対の手法として論じたが、一緒に使えないというわけではないし、実際一緒に使ってる。
- Transformer Generationを使うと、小さなコードの塊を出力するのに文字列フォーマット宣言を使うだろうが、それはTemplated Generationのミニチュア版である。
- にもかかわらず、全体的な戦略がどんなものかの明確な考えを持つことと切り替え時を意識することは有用だと考える。
- 何をしているかについての熟慮を止めたときが、メンテ不可能なめちゃくちゃなものを作り始めるときなのである。(なんで突然こんなことを?)
- Templated Generationを使うのに最も大きな問題の一つは、変数出力を生成するのにつかわれるホストコードがおそらく静的なテンプレートコードを圧倒し始めるであろうことである。
- Cを生成するJavaを生成しているなら、ほとんどCでテンプレートのJavaを最小限にしたテンプレートがほしい。
- Embedment Helperはここではなくてはならないパターン。
- テンプレートの変数要素の生成の複雑さは、テンプレートの単純なメソッド呼出によって呼び出されるクラスに隠される。
- この方法でCの中に最小限のJavaを持つことになる。
- これはテンプレートをクリアに保つだけでなく、生成コードを使用した作業をより簡単にする。
- Embedment HelperはJavaのツールでエディットされる通常のクラスになれる。(意味不明)
- 洗練されたIDEでは、これは大きく異なる。
- Cファイルに多くのJavaを埋め込むならば、IDEは通常助けとならない。
- シンタックスのハイライトすらできない。
- テンプレートのそれぞれの呼び出しは単一のメソッドコールであるべき。
- 他のものはEmbedment Helperの中に含まれるものになる。
- これが重要となる良い例が、Syntax-Directed Translationの文法ファイルである。
- しばしば長いコード実行で満たされた文法ファイルに出くわすが、基本的にForegin Codeのブロックである。
- このブロックは生成されたパーサの中に編みこまれるが、それらのサイズが大きくなると文法の構造をわかりにくくしてしまう。
- Embedment Helperがコード実行を小さく保つことでだいぶ助けとなる。
ファウラーへのフィードバック †
担当者のつぶやき †
みんなの突っ込み †