ビゞネスアプリケヌションのサブゞェクト指向蚀語-ナヌザヌむンタヌフェむス

この蚘事は、 ビゞネスアプリケヌション甚のドメむン固有蚀語の翻蚳です-ナヌザヌむンタヌフェむスのモデリング



ビゞネスアプリケヌションの開発は、デヌタストレヌゞ、ビゞネスロゞックの凊理、ナヌザヌむンタヌフェむスの蚭蚈など、さたざたな分野の問題の解決に関連しおいたす。 生産性ず品質を向䞊させるには、単䞀のドメむン固有蚀語DSLだけでは十分ではありたせん。十分に統合されおいない堎合は少数です。 重芁な改善は、さたざたな䞻題分野のモデル゜リュヌションに耇数のDSLを䞀貫しお適甚する党䜓的なアプロヌチによっおのみもたらされたす。



この蚘事では、DSLの䟋を芋おいきたす。DSLを䜿甚しお、 modellwerkstatt.orgでビゞネスアプリケヌション甚の暙準化されたナヌザヌむンタヌフェむスをモデル化したす。 DSLに固有のロゞックを䜿甚するず、オブゞェクトのグラフを完党か぀非垞に単玔な宣蚀的な方法で芖芚化できたす。 察話できる通垞のJavaコヌドを実装するのがいかに簡単かを瀺したす。これにより、特に型の安党性においお、柔軟性ずセキュリティがさらに向䞊したす。 内郚DSLず倖郚DSLの違いを指摘し、 JetBrains MPSに進み、すぐにナヌザヌむンタヌフェむスのDSLを調べたす。 最埌に、DSLの盞互䜜甚および拡匵に関する䞀般的な考慮事項をいく぀か瀺したす。



内郚および倖郚DSL



ドメむン固有の蚀語は、珟代の゜フトりェアアプリケヌション開発で広く䜿甚されおいたす。 「プログラミングの範囲を超えお抜象化のレベルを取り、特定の䞻題分野の抂念ずルヌルを盎接䜿甚する゜リュヌションを蚭定するプログラミング蚀語」ずいう定矩を䞎えるこずができたす。 ケリヌずトルバネン、2008。 JavaやKotlinなどの汎甚蚀語GPLはさたざたなサブゞェクト領域で広く䜿甚されおいたすが、サブゞェクト指向蚀語は特定のサブゞェクト領域に適合しおいるため、この領域で非垞に高い効率が埗られたす。 そのような蚀語は、解決される問題に適切な抜象化を提䟛し、゜リュヌションを簡朔か぀簡朔に衚珟するこずを可胜にし、そのような゜リュヌションの䜿甚はしばしばプログラマヌの資栌を必芁ずしたせん。



倚くの堎合、DSLの䟋はSQLク゚リ蚀語です。 SQLを䜿甚するず、プログラミングスキルがなくおもデヌタ、テヌブル、デヌタベヌスを凊理できたす。 SQLは、「行ず列のデヌタ」サブゞェクト領域の「フェッチ」や「曎新」などの特定の抂念により、高床な抜象化を提䟛したす。 SQL蚀語は明確で衚珟力豊かですが、同時にナヌザヌを特定のサブゞェクト゚リアにリベットしたす。 CSS、正芏衚珟、XPathなどのDSLも有名です。 これらの「ナニバヌサル」DSLに加えお、倚くの高床に専門化されたDSLが䜜成され、個々の組織で䞻題の知識を修正し、䞀般的な蚀語で統䞀コヌドを自動的に生成したす。



普及しおいるのは、ベヌスGPLに基づいた、いわゆる内郚DSLです。 「内郚DSLは、汎甚ベヌス蚀語のAPIの特別な圢匏であり、倚くの堎合、流動的むンタヌフェむスずも呌ばれたす」Fowler、2010幎。 内郚DSLは、特定のサブゞェクト゚リアにのみ存圚する抂念ず操䜜を定矩し、この゚リアでの䜜業に圹立ちたす。 Javaで構築された内郚DSLのよく知られた䟋は、JMockずJooQです。 ただし、内郚DSLには倧きな制限がありたす。 内郚DSLの構文は、汎甚ベヌス蚀語の構文に違反するこずはできたせん。 そうしないず、ベヌス蚀語コンパむラは結果のコヌドを解析しおコンパむルできたせんでした。 さらに、IDEでの構文の匷調衚瀺、オヌトコンプリヌト、およびタむプチェックのサポヌトもDSLに限定され、基瀎ずなるGPLに䟝存したす。 その結果、第1に、内郚DSLはGPLを所有する開発者にのみ有甚であり、第2に、構文ず芖芚的衚珟に厳しい制限が課せられたす。



SQLは他のGPLに組み蟌たれおおらず、それに基づいおいないため、倖郚DSLず芋なすこずができたす。 SQLは、独自のキヌワヌド、操䜜、および構文を提䟛したす。 汎甚蚀語ずの構文的な接続なしで構想されたした-完党に独立しおいたす。 倖郚DSLは最適化可胜で、読みやすさや理解床の制限なしに、䞻題領域の情報を完党に網矅し、最倧限の衚珟力を保蚌したす。 倖郚DSLの芖芚的衚珟、矎孊、人間工孊は、開発者だけでなく、堎合によっおは察象分野の専門家自身の芁件を考慮しお開発するこずができたす。 この堎合にのみ、特定の䞻題分野での意思決定の策定、䌝達、および理解に関しお改善が可胜です。 最初にドメむン固有の蚀語が䜜成されたのは、これらの考慮事項でした。



ただし、倖郚DSLには倚くの欠点がありたす。 たず、このような蚀語は汎甚蚀語に基づいおいないため、最初はIDEがありたせん。 これは、DSLが非垞に狭いサブゞェクト゚リアを察象ずしおいる堎合、぀たり、蚀語ナヌザヌの朜圚的な数が蚀語ツヌルキットたたは本栌的なIDEを䜜成する人件費を正圓化しない堎合に特に圓おはたりたす。 同時に、DSLナヌザヌには、仕事をしお生産性を向䞊させるためのスマヌトツヌルが必芁です。 第二に、さらに重芁なこずずしお、倖郚DSLは、汎甚コヌドやXMLに保存された宣蚀などの倖郚成果物にアクセスする簡単な方法を提䟛したせん。 ある意味で倖郚DSLは、远加のむンポヌトおよび゚クスポヌト手段䞀般的な蚀語で実行可胜コヌドを生成するゞェネレヌタが開発されるたで隔離されたたたです。 実際には、DSLだけでは゜フトりェア゜リュヌションのすべおの偎面が網矅されおいるわけではないため、完党な開発環境ずの察話は非垞に重芁です。 これは、蚀語開発ツヌルが圹立぀堎所です。



JetBrains MPS



JetBrains MPSは、ドメむン固有の蚀語を定矩、再利甚、および構成できる蚀語開発ツヌルであり、これらの蚀語甚の远加ツヌルを提䟛したす。



他の開発環境ずは異なり、MPSはパヌサヌに䟝存するこずなく、ツヌルの幅広いサポヌトを提䟛したす。 通垞、ツヌルずコンパむラは抜象構文ツリヌASDを取埗し、かなり具䜓的な文法でコヌドのテキスト衚珟を解析したす。 その埌、この構造化ツリヌを䜿甚しお、送信された情報が実行可胜なコヌドに倉換されたす。



このアプロヌチずは察照的に、MPSでは、ASDの操䜜は投圱゚ディタヌを䜿甚しお盎接実行されたす。 プロゞェクション゚ディタヌはテキスト゚ディタヌのように芋えたすが、ナヌザヌはリアルタむムでツリヌの構造を線集したす。 コヌドの保存にテキストは䜿甚されたせん-ASD自䜓が保存されるため、解析の必芁がなくなりたす。 したがっお、構文のあいたいさは排陀され、抂念を区別するためにセミコロンや括匧は必芁ありたせん。 プロゞェクション゚ディタは、䞻題領域の芖芚的衚珟の簡朔さず適切さを提䟛したす。 コヌド補完ず゚ラヌ制埡は、ASDの調査ずバむパスを通じお簡単に実装できたす。これらはすべお、IDE MPSで簡単にサポヌトされおいたす。 芁するに、MPSは䞀般的な方法でドメむン固有の蚀語のむンストルメンタルサポヌトを提䟛するため、蚀語ごずに個別に実装する必芁はありたせん。



ASDをMPSの基瀎ずしお䜿甚するず、重芁な利点が埗られたす。 文法のあいたいさが解消されるため、蚀語は任意の方法で組み合わせるこずができたす。 既存の蚀語は、新しい抂念で拡匵および匷化できたす。 蚀語は互いに補完し合い、機胜ず機胜を継承できたす。 これにより、既存の蚀語の抂念を簡単に再利甚できるため、開発が迅速化され、統䞀されたアプロヌチが促進されたす。



これらの考慮事項を実甚的な芳点から説明するために、䟋に戻りたす。



DataUx-Javaベヌスのナヌザヌむンタヌフェむス蚀語



DataUxは、蚀語を組み合わせるずいうアむデアをうたく​​実蚌しおいたす。 この蚀語は、集䞭的なデヌタ凊理甚に蚭蚈されたJavaアプリケヌションのナヌザヌむンタヌフェむス仕様専甚に䜜成されたした。通垞、これらは、支払いの請求曞管理や圚庫管理などのビゞネスアプリケヌションです。 DataUxは、デヌタ入力フォヌム、コレクションを芖芚化するためのテヌブル、およびレむアりトを定矩できるさたざたな蚀語の抂念を提䟛したす。 DataUxでは、拡匵プロパティバむンディングを介しお実際のデヌタ倀がナヌザヌむンタヌフェむス芁玠に提䟛されたす。 コンポヌネントプロパティ特定の識別子の受信者ずむンストヌラヌを持぀Javaオブゞェクトは、オブゞェクトグラフに線成されたす。 それから-そしおこれは、私たちの意芋では、非垞に珍しいです-このグラフ党䜓がナヌザヌむンタヌフェヌスに添付されおいたす。 この簡単な䟋では、さたざたなプロパティを持぀泚文オブゞェクトOrderに泚文アむテムのリストOrderPositionも含たれおいたす。 次のスクリヌンショットは、プロパティず泚文項目を含むOrderオブゞェクトのナヌザヌむンタヌフェむスを瀺しおいたす。 2番目のスクリヌンショットは、DataUxを䜿甚したこのナヌザヌむンタヌフェむスの仕様を瀺しおいたす。



デモアプリを泚文する

スクリヌンショット1耇数のOrderPositionオブゞェクトを含む1぀のOrderオブゞェクトを䜿甚したデモアプリケヌションのナヌザヌむンタヌフェむス



DSLを泚文する

スクリヌンショット2MPSのDataUxデモアプリケヌションのナヌザヌむンタヌフェむス仕様を泚文する



䞊蚘のスクリヌンショット2では、「メむン泚文ペヌゞ」が衚瀺され、泚文オブゞェクトのリストに関連付けられおいたす。 単䞀の列で構成されるグリッドレむアりト1 * =重み係数1の最倧化では、2぀のナヌザヌむンタヌフェむス芁玠を2行に配眮し、最初の芁玠を可胜な限り最小化-1し、2番目の芁玠を再び最倧化1 *しおいたす。 デリゲヌトフォヌムでは、Orderオブゞェクトの6぀のプロパティの倀が2列に衚瀺されたす。 テヌブルには、この泚文のアむテムのリストが衚瀺されたす。 DISABLEDキヌワヌドは、フォヌム党䜓を読み取り専甚モヌドにしたす。 テヌブルは远加蚭定なしでデフォルトで読み取り専甚です。



DataUx蚀語の䞻なアむデアは、コンポヌネントバむンディングず「マスタヌデヌタ-詳现デヌタ」テンプレヌトに基づいおいたす。 各PagePaneは、オブゞェクトの皮類ごずに「遞択されたオブゞェクト」が存圚するオブゞェクトで構成されるグラフを芖芚化できたす。 この䟋では、OrderずOrderPositionの2぀のタむプのオブゞェクトがありたす。 したがっお、2぀の珟圚の遞択が重芁です。遞択された泚文ず遞択された泚文アむテムです。 特定のタむプの珟圚遞択されおいるオブゞェクトをナヌザヌむンタヌフェむス芁玠にロヌドするには、各むンタヌフェむス芁玠を察応するオブゞェクトタむプにバむンドする必芁がありたす。 個々のナヌザヌむンタヌフェむス芁玠では、オブゞェクトのプロパティにアクセスしおバむンドできたす。



デリゲヌトフォヌムは珟圚遞択されおいる泚文に添付され、テヌブルは遞択された泚文Order.posずしお蚘述されおいるのアむテムのリストに添付されたす。 したがっお、デリゲヌトフォヌムはOrderオブゞェクトのプロパティを芖芚化でき、テヌブルは列内のOrderPositionオブゞェクトのプロパティを芖芚化できたす。 OrderPositionに察しお5぀のプロパティが宣蚀され、察応する列の幅が蚭定されたす。



「遞択されたオブゞェクト」のロゞックのフレヌムワヌクでは、テヌブルはオブゞェクトのリストを衚瀺するだけでなく、遞択されたオブゞェクトを決定するためにも䜿甚されたす。 テヌブルの遞択された行は、このタむプの「遞択されたオブゞェクト」に盎接察応したす。 この䟋では、テヌブル内の別の行を遞択するず、OrderPosition型のオブゞェクトが遞択および定矩されたす。 したがっお、ナヌザヌむンタヌフェむスは、OrderPositionオブゞェクトに盎接接続された異なるフォヌムで泚文䜍眮そのプロパティの詳现を芖芚化するこずにより改善されたした。



タむプ別の2番目のスクリヌンショットの「泚文メむンペヌゞ」は泚文オブゞェクトのリストですが、1぀の泚文のみが転送される堎合、このタむプの遞択オブゞェクトに自動的になりたす。 これは、PagePaneコンセプトの機胜です。 耇数の泚文がペヌゞに転送された堎合、遞択した泚文を決定するために远加のテヌブルが必芁になりたす。 これにより、遞択したオヌダヌを実装できたす。これは、詳现フォヌムずOrderPositionテヌブルに必芁です。 3番目のスクリヌンショットは、耇数の泚文を含むより耇雑なケヌスを瀺しおいたす。 既に述べたように、遞択した泚文䜍眮OrderPositionオブゞェクトのプロパティを衚瀺するために、詳现フォヌムを远加したした。



泚文ペヌゞ

スクリヌンショット3「マスタヌデヌタ-詳现デヌタ」ずいう関係を持぀デモアプリケヌションのより掗緎されたナヌザヌむンタヌフェむス



DataUxを䜿甚しお、オブゞェクトバむンディングのこのロゞックを匕き続き䜿甚するず、耇雑なオブゞェクトグラフのナヌザヌむンタヌフェむスを簡単に定矩できたす。 ナヌザヌは、特定のオブゞェクトの特定のプロパティにアクセスするために、ナヌザヌむンタヌフェむス芁玠をオブゞェクトタむプにバむンドしたす。 実行時に、察応するタむプの珟圚遞択されおいるオブゞェクトがナヌザヌむンタヌフェむス芁玠にロヌドされたす。 これはおそらくDataUx蚀語で理解するのが最も難しい瞬間です。 ただし、オブゞェクトバむンディングのこのロゞックは、DataUx型システムず䞀連の䞀貫性チェックによっおチェックされたす。 むンテリゞェントな線集は、状況䟝存の自動補完、さらには「ナヌザヌむンタヌフェむス芁玠の自動補完」を提䟛したす。



ドメむン固有の蚀語の議論では、DataUxずJavaの関係は泚目に倀したす。 明らかに、DataUxはJava構文ず互換性がありたせんが、プロパティやクラスなどのJavaの抂念に䟝存しおいたす。 Javaベヌスのタむプチェックルヌルもありたす。 さらに、ナヌザヌむンタヌフェむス芁玠の䞭には、倖郚Javaアヌティファクトが蚘茉されおいたす。 これはどのように達成されたすか



JetBrains MPSには完党なJava実装が付属しおいたす。 MPSでのこのGPLの実装は、特殊なDSLの実装ず倉わりたせん。 むンテリゞェントなテキスト゚ディタヌJavaを䜿甚する通垞のモデルを再珟する優れたプロゞェクション゚ディタヌがありたす。クラスずむンタヌフェむス、そのメンバヌ、そしおもちろん匏の定矩がサポヌトされおいたす。 MPSにはjarむンポヌトツヌルもあるため、スタンドアロンのフル機胜のJava IDEずしお䜿甚できたす。 このJava実装を拡匵し、DataUx蚀語で補完したした。 その結果、匷力なJavaの抂念、特に匏ず型を䜿甚できるようになりたした。 したがっお、DataUxは基本的なプログラミングサポヌトを远加の努力なしで受けたした。



DataUx蚀語でナヌザヌむンタヌフェむス芁玠を蚭定するこずにより、ナヌザヌは、宣蚀されたJavaオブゞェクトずそのプロパティがIDEにロヌドされお利甚可胜な堎合、それらを参照できたす。 クラス参照、プロパティ、および遞択のむンテリゞェントアクセス領域は、線集䞭に蚈算されたす。 スクリヌンショット2でわかるように、DataUxパラメヌタヌの「Table Summary Line」は、倉数「allObjects」タむプ-リストを持぀クロヌゞャヌに䌌た抂念を提䟛したす。 右偎では、Java匏は文字列を返すこずが期埅されおいたすタむプはJava.lang.Stringです。 この䟋では、クラスMyUtilの静的メ゜ッドsumを呌び出したす。 このパラメヌタのコンテキストでは、メ゜ッド呌び出しから文字列の連結やJava倉数ぞの参照たで、有効なJava匏が衚瀺されるこずに泚意しおください。 すべおのリンクのむンテリゞェントアクセス゚リアは、パラメヌタヌのコンテキストで正確に蚈算されたす。 すべおの匏に察しお型チェックが実行されたす。



DataUx蚀語は、Java MPS蚀語の既存のすべおの抂念、特に匏ず型システム凊理を最倧限に掻甚したす。通垞、これらの蚀語の芁玠は非垞に耇雑です。 DataUxでのJava匏の䜿甚は、その単玔さにもかかわらず、蚀語ナヌザヌに远加の利点を提䟛したす。 匏を䜿甚するず、統合されおいない倖郚のプログラムコヌドに頌るこずなく、特定のケヌスの芁件に柔軟に適応できたす。 䞻な利点は、他の蚀語を拡匵する可胜性によっおも提䟛されたすMPS Java蚀語の構文からの独立性を維持しながら、この蚀語で宣蚀された抂念、たずえば、Table Summary Lineテヌブルのパラメヌタヌで呌び出される静的メ゜ッドを簡単に参照できたす。



DataUxは、オヌストラリアの䞻芁な顧客である小売業者向けに開発されたした。 顧客偎では、8人の開発者が必芁なすべおのナヌザヌむンタヌフェむスをDataUxに実装したす。プレヌンJavaコヌドのナヌザヌむンタヌフェむスの远加の偎面に圱響を䞎えるこずはありたせん。 蚀語の抂念ず構造をうたく定矩した埌、蚀語自䜓は数日で開発されたした。 ただし、いく぀かの異なるテクノロゞの実装が耇雑であるため、ナヌザヌむンタヌフェむスランタむムの開発には時間がかかりたした。



DataUxはGitHubで入手できたす。



おわりに



DataUxは、プログラミングスキルのないナヌザヌにナヌザヌむンタヌフェむスの開発を委任できる、非垞にシンプルで論理的なドメむン指向の蚀語です。 孊習曲線の急峻さは非垞に小さいため、説明はほずんど必芁ありたせん。 たた、この蚀語は、既存のナヌザヌむンタヌフェむスの理解ず保守を倧幅に簡玠化したす。 さらに、DataUxを䜿甚しお定矩されたナヌザヌむンタヌフェむスは、実装テクノロゞに䟝存したせん。 これは非垞に重芁な利点です。最近のナヌザヌむンタヌフェむステクノロゞヌは急速に倉化しおいるためです。 Apache Pivot、JavaFX、vaadin、およびHTML5甚のDataUxランタむムを既に提䟛しおいるこずに泚意しおください。 ナヌザヌが必芁なプラットフォヌムを遞択するだけで十分であり、MPSはDataUx蚀語のナヌザヌむンタヌフェむス蚘述から必芁なコヌドを生成したす。



DataUxは、倖郚DSLを結合するJetBrains MPSの機胜を実蚌したす-この堎合、DataUxは内郚Java実装を拡匵したす。 DataUxは、匏などの重芁なJavaの抂念を䜿甚しながら、魅力的な芖芚的衚珟を提䟛したす。 DataUxがJava広告ず察話できるようにするのは、この蚀語拡匵機胜です。 通垞、MPSの蚀語は他の蚀語の抂念を参照できるため、他の蚀語でモデル化された仕様を参照できたす。 プロゞェクション゚ディタはASDず連携し、蚀語の䜜成者が蚀語を䜜成、再利甚、および倉曎できるようにしたすが、最も重芁なこずは、異なる䞻題指向蚀語が盞互にやり取りできるようにするこずです。 MPSは、異なるサブゞェクト゚リア間のアクティブな察話を促進したす。



MPテヌブル

図1ビゞネスアプリケヌションをモデル化するためのさたざたなドメむン固有蚀語が盞互に補完し合う



実際、DataUxを䜿甚しおビゞネスアプリケヌションのナヌザヌむンタヌフェむスを定矩するだけではありたせん。 兞型的なビゞネスアプリケヌションは、デヌタストレヌゞク゚リやSQL倉換など、ビゞネスロゞック、ナヌザヌむンタヌフェむスなど、さたざたなサブゞェクト領域ず亀差したす。 JetBrains MPSはDSL間の盞互運甚性を提䟛するため、ビゞネスアプリケヌションの特殊な郚分ごずに個別の蚀語を開発したした図1を参照。 開発ツヌルの完党なセットを圢成する3぀の高床に専門化された䞻題指向蚀語が䜜成されたした。 したがっお、特定のタスクごずに、単䞀の開発環境内でビゞネスアプリケヌション党䜓を䜜成するこずを拒吊するこずなく、最も衚珟力のある蚀語を提䟛したす。 ビゞネスアプリケヌションのサブゞェクト゚リアごずに、高レベルの抜象化が提䟛されたす。統合に支障はなく、定匏化ず理解の簡玠化が維持されたす。぀たり、長期的なメンテナンスず高品質が容易になりたす。



参考文献ず文献






All Articles