質問
ドメイン固有言語が話題になり、それがビジネス ロジックの扱い方をどのように変えるかについて、ますます耳にするようになりました。 Ayende のブログ投稿 などなどですが、プロバイダーで使用しているメソッドや状況からビジネス ロジックを切り離す理由を正確に理解したことがありません。
これらのことを使用した経験がある場合は、それを素人の言葉で言い換えることができるでしょう。
- DSL の構築とは正確には何を意味するのでしょうか?
- どの言語を使用していますか?
- DSL を使用することに意味があるのはどのような場合ですか?
- DSL を使用する利点は何ですか?
解決
DSL は、システムの制御の一部を他の人に渡す必要がある状況に適しています。私はルール エンジンでこれらを使用しました。ルール エンジンでは、技術に詳しくない人でも、特にワークフローで表現するのに使いやすいシンプルな言語を作成します。
言い換えれば、Java を学習させる代わりに、次のようにします。
DocumentDAO myDocumentDAO = ServiceLocator.getDocumentDAO();
for (int id : documentIDS) {
Document myDoc = MyDocumentDAO.loadDoc(id);
if (myDoc.getDocumentStatus().equals(DocumentStatus.UNREAD)) {
ReminderService.sendUnreadReminder(myDoc)
}
次のような DSL を書くことができます。
for (document : documents) {
if (document is unread) {
document.sendReminder
}
他にも状況はありますが、基本的には、マクロ言語を使用する場合、ワークフローのスクリプトを作成する場合、またはアフターマーケットのカスタマイズを可能にする場合、これらはすべて DSL の候補となります。
他のヒント
DSL を意味する ドメイン固有言語 つまり特定の分野の問題を解決するために特別に設計された言語。
たとえば、Markdown (SO の投稿を編集するために使用されるマークアップ言語) は DSL として考えることができます。
個人的には、私が取り組んでいるほとんどすべての大規模プロジェクトに DSL の余地があることがわかります。ほとんどの場合、何らかの SQL に似たクエリ言語が必要になります。もう 1 つの一般的な使用法はルールベースのシステムです。ルールや条件を指定するには何らかの言語が必要です。
DSL は、従来の手段では問題を説明したり解決したりすることが難しい状況においては意味を持ちます。
Microsoft Visual Studio を使用している場合は、すでに複数の DSL (Web フォーム、winforms などのデザイン サーフェイス) を使用していることになります。DSLです。クラス デザイナーも一例です。
DSL は、(少なくとも理論的には)特定の「ドメイン」(つまり、視覚的なレイアウト)、より簡単、より直観的、より生産的になります。
DSL の構築に関して言えば、Ayende のような人々が書いたものの一部は「テキスト解析」DSL に関連しており、開発者 (またはエンド ユーザー) が「自然テキスト」をアプリケーションに入力できるようになり、アプリケーションはテキストを解析して何らかの種類のテキストを生成します。コードまたはそれに基づく出力。
任意の言語を使用して独自の DSL を構築できます。Microsoft Visual Studio には多くの拡張ポイントとパターンとプラクティスがあります。 「ガイダンス自動化ツールキット」 そして Visual Studio SDK DSL 機能を Visual Studio に追加するのに役立ちます。
DSL は単なる派手な名前であり、さまざまな意味を持ちます。
Rails (Ruby のもの) は、Web アプリケーションについて話すための特別なメソッドを追加する (一部の組み込みメソッドも上書きする) ため、DSL と呼ばれることもあります。
ANT、Makefile 構文なども DSL ですが、独自の構文を持っています。これは私が DSL と呼ぶものです。
この誇大広告の重要な側面の 1 つは次のとおりです。アプリケーションを言語の観点から考えることは理にかなっています。アプリで何を話したいですか?これらはクラスとメソッドになります。
- 問題を表現できる「言語」 (このページで他の人が提案している実際の構文、またはお気に入りの言語のクラス階層) を定義します。
- その言語に関して問題を解決してください。
DSL は基本的に、特定のドメインの問題を解決するために独自の小さなサブ言語を作成することです。これはメソッドチェーンを使用して解決されます。ドットと括弧がオプションである言語は、これらの表現をより自然に見せるのに役立ちます。ビルダー パターンに似たものにすることもできます。DSL は言語そのものではなく、呼び出しをよりわかりやすくするために API に適用するパターンです。
一例として、Guice が挙げられます。 Guice ユーザー ガイド http://docs.google.com/View?docid=dd2fhx4z_5df5hw8 インターフェースがどのように実装にバインドされるか、またどのようなコンテキストでバインドされるかについては、さらに下に説明があります。
もう 1 つの一般的な例はクエリ言語です。例えば:
NewsDAO.writtenBy("someUser").before("someDate").updateStatus("Deleted")
実装では、各メソッドが新しい Query オブジェクトを返すか、内部的にそれ自体を更新するだけであると想像してください。たとえば、 rows() を使用してすべての行を取得するか、上で行ったように updateSomeField を使用することで、いつでもチェーンを終了できます。どちらも結果オブジェクトを返します。
上記の Guice の例も参照することをお勧めします。各呼び出しでは、新しいオプションを備えた新しい型が返されます。優れた IDE を使用すると、各時点でどのオプションがあるかが明確になり、完了することができます。
編集:多くの人は、DSL を独自のパーサーを備えた新しい、シンプルな、単一目的の言語と考えているようです。私は常に DSL を、操作を表現するための慣例としてメソッド チェーンを使用するものと関連付けています。