2009-03-19 2 views
6

現在、私が扱っているプロジェクトは、(外部からの影響のために)完全に固定されたモデルを持っていないので、それらを書く際に柔軟性を持たせたいと思います。現在、それらはアプリケーションの3つの異なるレイヤー(db、web apiおよびclient)に複製されており、それぞれに同様のロジックがあります(つまり、検証)。DSLを使ってC#コードを生成する

モデルファイル(ルビーなど)を作成して、そのモデルを必要なC#ファイルに変換する方法があるのだろうかと思っていました。現在のところ、どのステージでも変更できる定型コードをたくさん書いているようですが、このアプローチではもっと重要なことに集中することができます。

誰かがこれのようなものを推薦していますか、これを行うことができるDSL /言語ですか、誰もこのようなことに関する経験はありますか?

答えて

5

これは簡単にANTLRで行うことができます。出力が似ている場合は、単純にテキストテンプレートメカニズムを使用することができます。そうでなければ、トラバースする抽象構文ツリーを生成できます。

5

カスタムコードに影響を与えずにコードの再生成を可能にする部分クラスと部分メソッドを使用するシステムを見てきました。 「ルールエンジン」は、Visioの状態図から完全に生成されたものです。これは基本的にワークフローが悪いですが、変更は非常に簡単です。 Visoダイアグラムは、PowerShellとT4を使用してクラスを生成するために読み込まれたXMLにエクスポートされました。

上記の例は、外部DSLの例です。 I.アプリケーションが実行するプログラミング言語の外部にあります。一方で、プログラミング言語で実装され、使用される内部DSLを作成することができます。

これと前のコードマガジンのarticle on DSLSsはかなり良いです。

Neal Fordは、流暢なインターフェイスを使用してC#で内部DSLを作成する方法を示しています。

彼がまだ言及していないことの1つは、この属性[EditorBrowsable(EditorBrowsableState.Never)]をあなたのメソッドに配置して、インテリセンスに見えないようにすることです。これは、DSLのユーザからのクラス上の非DSL(もしそうであれば)メソッドを隠すことができ、流暢なAPIをより発見しやすくすることを意味します。

あなたはまた、それの能力に非常に強力であるOslo (CTP at the moment)のオプションを持っている外部DSLの対象にTDD

とIoCコンテナを書くことにDaniel Cazzulinoことで、このビデオシリーズでライブ書かれて流れるようなインターフェイスを見ることができますそれを考えるDSLのコードではなく、直接実行できる外部DSLを作成することができます。

+1

多くの本格的なコンパイラは、実際にはコードジェネレータです。オリジナルのC++コンパイラ、cfrontはストレートCコードを生成し、EiffelとHaskellもバイナリに進む前にCにコンパイルします。 –

+0

すべてのコンパイラはコードジェネレータであり、人にやさしいコードを生成しない可能性があります。機械コード命令でさえ、典型的には、プロセッサ内に埋め込まれたマイクロコードによって解釈されるより高レベルの命令である。 –

1

あなたは正しい軌道にいると思います。

私が通常このような状況で行うことは、私のニーズを捕らえ、そのためのLL1(再帰的降下)パーサーを作成する単純な言語を設計することです。

言語に意味のないC#構文が含まれている必要がある場合は、それを引用するか、わかりやすい括弧で囲んで出力コードに渡してください。

私はそれが構文木構造を生成し、3つの異なる種類のコードを生成することができます。あるいは、3つの値を持つモード変数を使用するか、 3つの異なる出力ファイルにコードを書く。

複数の方法があります。あなたがパーザを書くことを恐れている(一部のプログラマがそうであるように)場合は、SOの他の場所で多くの助けがあります。

関連する問題