24

ドメイン固有言語が飛び交い、ビジネス ロジックの扱い方がどのように変化するかについて、ますます耳にします。また、Ayende のブログ投稿やその他のことも見てきましたが、なぜ自分のビジネスを引き継ぐのかを正確に把握したことはありません。プロバイダーで使用しているメソッドや状況から離れたロジック。

これらのものを使用した背景がある場合は、本当の素人の言葉でそれを置くことができます:

  • DSL の構築とは正確には何を意味するのでしょうか?
  • どの言語を使用していますか?
  • DSL を使用する意味があるのはどこですか?
  • DSL を使用する利点は何ですか?
4

7 に答える 7

18

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の候補です。

于 2008-09-03T14:09:36.113 に答える
11

DSLはドメイン固有言語の略で、特定の分野の問題を解決するために特別に設計された言語です。
たとえば、Markdown(SOの投稿を編集するために使用されるマークアップ言語)はDSLと見なすことができます。

個人的には、私が取り組んでいるほとんどすべての大規模プロジェクトでDSLの場所を見つけています。ほとんどの場合、SQLのようなクエリ言語が必要です。もう1つの一般的な使用法は、ルールベースのシステムです。ルール/条件を指定するには、ある種の言語が必要です。

DSLは、従来の方法で問題を説明/解決することが難しい状況では意味があります。

于 2008-09-03T14:06:29.800 に答える
5

Microsoft Visual Studioを使用している場合は、すでに複数のDSLを使用しています。WebフォームやWinFormなどのデザインサーフェスはDSLです。クラスデザイナは別の例です。

DSLは、(少なくとも理論的には)特定の「ドメイン」(つまり、視覚的なレイアウト)での開発をより簡単に、より直感的に、より生産的にするためのツールのセットにすぎません。

DSLの構築に関しては、Ayendeのような人々が書いたもののいくつかは、「テキスト解析」DSLに関連しており、開発者(またはエンドユーザー)がアプリケーションに「自然なテキスト」を入力できるようにします。コードまたはそれに基づく出力の。

任意の言語を使用して、独自のDSLを構築できます。Microsoft Visual Studioには多くの拡張ポイントがあり、「ガイダンス自動化ツールキット」Visual Studio SDKのパターンと実践は、VisualStudioにDSL機能を追加するのに役立ちます。

于 2008-09-03T14:16:06.657 に答える
3

DSLは単なる派手な名前であり、さまざまな意味を持つ可能性があります。

  • Rails(Rubyのもの)は、Webアプリケーションについて話すための特別なメソッドを追加する(そしていくつかの組み込みメソッドも上書きする)ため、DSLと呼ばれることもあります。

  • ANT、Makefile構文などもDSLですが、独自の構文があります。これは私がDSLと呼ぶものです。

この誇大宣伝の重要な側面の1つは、アプリケーションを言語の観点から考えることは理にかなっています。アプリで何について話したいですか?これらは、クラスとメソッドになります。

  1. 問題を表現できる「言語」(このページで他の人が提案した実際の構文またはお気に入りの言語のクラス階層)を定義します。
  2. その言語の観点からあなたの問題を解決してください。
于 2008-09-03T14:13:24.730 に答える
3

DSLは、カスタム言語の基本的なコンパイラです。それらを開発するための優れた「無料でオープンな」ツールがANTLRで利用可能です。最近、私は新しいプロジェクトでステートマシン言語を使用するためにこのDSLを検討しています。上記のTimHowlandに同意します。これは、他の誰かにアプリケーションをカスタマイズさせるための良い方法になる可能性があるということです。

于 2008-09-03T14:20:52.217 に答える
3

参考までに、DSL に関する本は、Martin Fowler の署名シリーズの一部としてパイプラインにあります。

シリーズの他の本と同じ基準であれば、良い読み物になるはずです。

詳細はこちら

于 2008-09-03T14:59:10.097 に答える
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を、操作を表現するための規則としてメソッドチェーンを使用するものとして関連付けています。

于 2008-09-03T14:09:14.693 に答える