次の方法で共有


ドメイン固有言語について

C# や UML などの汎用言語とは異なり、ドメイン固有言語 (DSL) は、特定の問題領域 (ドメイン) のステートメントを表現するように設計されています。

よく知られている DSL には、正規表現と SQL があります。 各 DSL は、テキスト文字列またはデータベースに対する操作を記述するための汎用言語よりもはるかに優れていますが、その範囲外のアイデアの記述については、はるかに劣っています。 また、個々の業界には、独自の DSL があります。 たとえば、電気通信業界では、通話の一連の状態を指定するために通話記述言語が広く使用され、航空旅行業界では、航空券の予約を記述するために標準 DSL が使用されます。

お客様のビジネスとプロジェクトでも、DSL で記述できる特別な一連の概念が扱われています。 たとえば、次のいずれかのアプリケーション用の DSL を定義できます。

  • Web サイトのナビゲーション パスの計画。

  • 電子部品の配線図。

  • 空港のコンベヤ ベルトと手荷物取り扱い設備のネットワーク。

DSL を設計する際は、ドメインの重要な概念 (Web ページ、ランプ、空港チェックイン デスクなど) ごとに "ドメイン クラス" を定義します。 これらの概念を相互にリンクするために、ハイパーリンク、ワイヤー、コンベヤ ベルトなどの "ドメイン リレーションシップ" を定義します。

DSL のユーザーは "モデル" を作成します。モデルとは DSL の "インスタンス" です。 たとえば、特定の Web サイト、特定のデバイスの配線、特定の空港における手荷物取り扱いシステムなどを記述します。

ユーザーは、モデルを図または Windows フォームとみなすことができます。 モデルは、XML (どのように格納されるか) とみなすこともできます。 DSL を定義するときに、各ドメイン クラスとリレーションシップのインスタンスがユーザーの画面にどのように表示されるかを定義します。 一般的な DSL は、矢印によって接続されたアイコンまたは四角形のコレクションとして表示されます。

次の図は、図式 DSL の小さなモデルを示しています。

Tudor Family Tree Model

DSL でできること

DSL の一般的な用途は、プログラム コードやその他の成果物を生成することです。 DSL を定義するときに、DSL のモデルを読み取り、テキスト ファイルを生成する "テキスト テンプレート" を定義できます。

たとえば、空港プランを取り入れて手荷物取り扱い用のソフトウェアの一部を生成するテンプレートや、プランを説明するユーザー ドキュメントの一部を作成できます。

DSL を定義したら、それを自分のコンピューターにインストールできる他のユーザーに配布できます。 DSL のユーザーは、Visual Studio でモデルの作成と編集を行うことができます。

ユーザーが DSL を編集するのに役立つメニュー コマンドやその他のツール、DSL が適切に使用されるようにする検証制約、およびユーザーが新しいインスタンスを作成するために役立つ項目テンプレートも定義できます。 1 つ以上の DSL をツールとその他の Visual Studio 拡張機能と共に統合パッケージとしてラップできます。

通常、ドメイン固有言語は、開発チームが複数の製品向けの類似するコードを記述する必要がある場合に作成されます。 たとえば、手荷物取り扱いシステムを専門とする会社では、インストールごとにコードの一部を生成できる手荷物追跡 DSL を定義できます。 DSL の利点は、顧客が理解できること、それから生成されたコードが信頼できること、および顧客の要件が変化した場合にシステムを迅速に更新できることです。

ドメイン固有言語ツールを使用して、独自のグラフィカル デザイナーと独自のダイアグラム表記を持つドメイン固有言語を作成し、その言語を使用して、プロジェクトごとに適切なソース コードを生成できます。

ドメイン固有の開発

ドメイン固有の開発は、ドメイン固有言語を使用してモデル化できるアプリケーションの部分を識別した後、その言語を構築してアプリケーション開発者に展開するプロセスです。 開発者は、ドメイン固有言語を使用して、アプリケーション固有のモデルを構築し、モデルを使用してソース コードを生成した後、ソース コードを使用してアプリケーションを開発します。

グラフィカルなドメイン固有の開発の側面

グラフィカル ドメイン固有言語には、次の機能が含まれている必要があります。

  • Notation

  • ドメイン モデル

  • 成果物の生成

  • シリアル化

  • Visual Studio との統合

Notation

ドメイン固有言語には、ドメイン固有の構成体を表すための簡単に定義して拡張できる要素の小さなセットが必要です。 表記は、グラフィカルな図サーフェイス上で要素を表す図形と、要素間の関係を表すコネクタで構成されます。 ドメイン固有言語ツールで、ドメイン固有言語の要素を表すように図形を拡張、調整できます。

ドメイン モデル

ドメイン固有言語では、一連の要素と、それらの要素間のリレーションシップを組み合わせて、一貫した文法にする必要があります。 また、要素とリレーションシップの組み合わせが有効かどうかも定義する必要があります。 たとえば、プログラミング言語では、通常、1 番目のクラスが 2 番目のクラスから派生し、2 番目のクラスが 1 番目のクラスから派生する循環継承は禁止されています。 また、制約を使用して、たとえばユーザーを自身に依存させることはできないというビジネス ロジックを表現できます。 ドメイン固有言語ツールでは、制約を使用して、ほとんどのドメイン固有言語で必要とされる制限の種類を表します。

成果物の生成

ドメイン固有言語の主な目的の 1 つは、ソース コード、XML ファイル、その他の使用可能なデータなどの成果物を生成することです。 通常、モデルの変更は、成果物の変更を意味します。 ドメイン固有言語ツールを使って成果物を生成し、モデルを変更したときに成果物を再生成することができます。

シリアル化

ドメイン固有言語は、編集、保存、終了、および再読み込みが可能な何らかの形式で保存する必要があります。 ドメイン固有言語ツールでは、ドメイン固有言語をシリアル化または保存する方法を定義およびカスタマイズできる XML 形式を使用します。

Visual Studio との統合

ドメイン固有言語ツールは Visual Studio でホストされているので、多くの Visual Studio ウィンドウとコントロールを拡張できます。 メニュー コマンド、ツールボックス項目、およびユーザー インターフェイスのその他の要素の動作をカスタマイズすることもできます。

さらに、ドメイン固有言語用のモデル バス アダプターを作成できます。 このアダプターを使用すると、モデルとモデル内の要素を参照でき、DSL のインスタンスにアクセスして更新できるコードを記述できます。 強力なモデル バス メカニズムを使用することにより、複数のモデルで動作する Visual Studio 拡張機能を記述できます。 モデルを操作するスタンドアロン アプリケーションを記述することもできます。 詳細については、「Visual Studio Modelbus を使用してモデルを統合する」を参照してください。

ドメイン固有の開発の利点

ドメイン固有言語には、次のような利点があります。

  • 問題領域にぴったりと適合する構成体が含まれています。

    汎用言語とは異なり、ドメイン固有言語は、問題領域のロジックを直接表す要素とリレーションシップで構成されます。 たとえば、保険証券アプリケーションには、証券と請求の要素を含める必要があります。 ドメイン固有言語を使用すると、アプリケーションの設計と、ロジックのエラーの検出と修正が容易になります。

  • 開発者以外のユーザーや、ドメインを知らない人が、全体的な設計を理解できます。

    グラフィカルなドメイン固有言語を使用することで、開発者以外のユーザーがアプリケーションの設計を簡単に理解できるように、ドメインの視覚的表現を作成できます。

  • 最終的なアプリケーションのプロトタイプを簡単に作成できます。

    開発者は、モデルによって生成されたコードを使用して、クライアントに見せることができるプロトタイプ アプリケーションを作成できます。

ドメイン固有の開発のプロセス

ドメイン固有言語を使用するほとんどのソフトウェア開発チームは、次の手順に従って、モデルを作成して使用します。

  • チームは、ドメインの変化する部分と変わることがない部分を区別します。

  • 開発者は、固定部分のコードを記述し、可変部分の拡張ポイントを残します。

  • ソフトウェア開発リーダーまたはアーキテクトは、ドメインの固定部分の設計パターンと可変部分の拡張ポイントを組み込んだドメイン固有言語を作成します。

  • ソフトウェア開発リーダーまたはアーキテクトは、チームが制作するさまざまなアプリケーションの開発者にドメイン固有言語を展開します。

  • すべての開発者は、特定のアプリケーションに適用されるモデルを作成します。