
シェア:
シナはVonageのJavaデベロッパー・アドボケイト。アカデミックなバックグラウンドを持ち、自動車、コンピューター、プログラミング、テクノロジー、人間性など、あらゆることに好奇心旺盛。余暇には散歩をしたり、対戦型ビデオゲームをしたりしている。
モデル駆動エンジニアリングで生産性を高める(前編)
所要時間:1 分
はじめに
職業について尋ねられたとき、私たち開発者は言葉の選択肢に事欠かない。ソフトウェア開発者」、「コンピュータ・プログラマー」、「コンピュータ・サイエンティスト」、「コーダー」、「ソフトウェア・エンジニア」、あるいは「ソフトウェア・アーキテクト」、「DevOpsエンジニア」、「デベロッパー・アドボケイト」など、より専門的な役割などです。私たちは、これらの用語を互換的に使用したり、最も心に響くものを選んだりすることがあります。しかし、よく考えてみると、「コンピューター・プログラマー」と「ソフトウェア・エンジニア」は本当に同じなのだろうか?多くの場合、そうかもしれない。私は、開発者の多くと同様、プログラミングを心から楽しんでいる。それは間違いなく私たちの職業の礎であり、私たちの多くがこの仕事に魅了された理由でもある。
しかし、この分野が抽象化の上に成り立っていることを認めることは重要である。表面的には、コンピューター・プログラマーの仕事は、パンチカードが使われていた初期から大きく変わった。私たちのほとんどは、アセンブリや、当時(そして今も)「高級」プログラミング言語と考えられていたC言語さえ知らない。プログラマー(あるいは "コーダー")の仕事は、結局のところ、ハードウェアに命令を伝え、何らかの処理を実行させることである。しかし、これは私たちの多くが日々考えている仕事ではない。その代わりに、私たちはより抽象度の高いレベルで、つまり次のような観点から考える。 ソリューション.したがって、プログラミングは、楽しくてやりがいのあるものであっても、目的を達成するための手段なのである。したがって、「ソフトウェア・エンジニア」という用語は、開発プロセス全体を包括するキャッチオールなのです。ソフトウェア・エンジニアリングが家を建てるようなものだとすれば、プログラミングはそのレンガを積む部分である。
残念ながら、プログラミングは必ずしも楽しいものでも、問題解決に役立つものでもない。特にJavaのような冗長な言語の場合、面倒なことが多い。これはボイラープレート(定型文)の結果であり、手作業で書くには繰り返しで面倒だが、それでも必要で役に立つコードである。これは往々にして、プログラミングの最も生産性の低い側面であり、偶然にも、最も自動化可能な側面でもある。IDEは、ゲッターやセッターのような一般的な定型文を生成するのに長けている、 toString(), equalsそして hashCode()IDEは、ゲッターやセッターのような一般的な定型文を生成するのは得意だが、それはその言語の一般的なニーズに応えることができるだけであって、ドメインのニーズに応えることはできない。ドメイン固有の定型文を手書きする面倒なプロセスを省く方法があればいいのだが......。
モデル駆動エンジニアリングとは何か?
モデル駆動エンジニアリング(MDE)は、モデル駆動エンジニアリングを推進する学問分野である。 モデルをエンジニアリング・プロセスにおける第一級の成果物とすることを推進する学問分野であり、そうすることで抽象度を高める。ソフトウェアエンジニアリングに適用する場合、これは、ソースコードの代わりに ソースコードが主要な成果物である代わりに、ドメインモデルをより重視することを意味する。
MDEは学術用語であり、学問分野であることが多いが、「ローコード」という言葉を通じて、より広く注目されるようになった。 学術界も認識している.MDEの方がローコード・ムーブメントよりも範囲が広いと主張する人もいるかもしれないが、実際には、このような意味論の違いは、しばしば学術的な関心事である!
モデルとは何か?それは、ドメインを宣言的に記述するものです。モデルはドメイン固有のデータと考えることができる。重要なのは、このデータが予測可能な方法で構造化されていることです。MDE用語では、この構造を メタモデル.メタモデルはそれ自体、ドメインの「設計図」を記述するモデルであり、建築家の設計図が建物の建設ガイドを提供するのと似ています。これをより明確にするために、いくつかの例を考えてみましょう。
メタモデル
メタモデルの考え方は、汎用のツールや言語を使用する際に表現できるものを制限することである。メタモデリング技術の例には以下が含まれます。 XML スキーマ(XSD)や JSON スキーマ、あらゆるデータベース スキーマが含まれます。リレーショナル データベース、XML ドキュメント、または何らかの構成ファイルで作業したことがある人なら、このような用語で考えたことはなくても、この概念にはすでになじみがあるでしょう。
例はたくさんあるが、簡潔に説明するため、ここでは直接紹介しない。しかし スキーマをメタモデルとして、スキーマに準拠した構造化データを モデル直感的に理解できるかもしれない。例えば "CustomersOrders.xsd "ファイルを考えてみましょう。.このファイルは、ドメインの概念と、それらが互いにどのように関係するかを効果的にモデル化しています。この "CustomersOrder.xml "ファイルはこの モデルのインスタンスである。 メタモデル.オブジェクト指向プログラミングに慣れていれば、メタモデルをクラス、モデルをオブジェクト(つまり、それらのクラスのインスタンス)と考えることができます。オブジェクト指向プログラミングでは、クラスが具体的なインスタンス(オブジェクト)のスキーマを定義します。別の例として この最小限のJSONスキーマ.これは、3つのプロパティを持つPersonを定義している: firstName, lastNameおよび age.
これらのケースでは、メタモデル自体がモデルと同じ言語で記述されていることにお気づきでしょうか。つまり、XSD ファイルは XML と同じ構文を使用し、JSON スキーマはそれ自体が JSON で記述されています!このことの帰結は、メタモデル自体が メタモデル.びっくりでしょう?言い換えれば、メタモデルにはスキーマがあるということです。ありがたいことに、たいていの場合、このトップレベルのメタモデルはそこで止まってしまいます。メタモデルは通常、自分自身に適合します。冗談ではありません。 XSD のメタモデルを定義した XSD ファイルが文字通り存在します。!
Eclipseモデリング・フレームワーク
モデル駆動エンジニアリングの主なコンセプトを定義したところで、次にツールについて説明しよう。スキーマとモデルは、従来のツールやJSONやXMLのようなシリアライゼーション形式を使用して定義することができます(そして多くの場合、定義されています)が、MDEを真に受け入れるには、MDEの専門家が使用する専用ツールに精通していることが有益です。MDE の歴史は、学術的かつ企業的なルーツが多いため Eclipse Foundationは、最も確立された MDE ツールのホームプラットフォームであると広く考えられています。その中心となるのが Eclipse Modelling Framework (EMF).このプロジェクトの中核は、メタモデルを定義するためのフレームワークと、Javaでメタモデルをプログラム的に操作するためのツールを定義することです。お察しの通り、これには メタモデル- が含まれています。以下は、Ecore の主な概念と階層の簡略図です:

もちろん、それ以外にもたくさんある。 より詳細なUMLディグラムはこちらです。.しかし心配しないでください。これらは、Ecore を使ってメタモデルを定義するときに直感的に理解できるようになる概念です。もちろん チュートリアルがあります。のチュートリアルがあります。 中にはかなり古いものもありますが.EMFは長い間安定しているので、それらはまだ適切です。
Ecoreのメタモデルは、組み込みのツリーエディタ、UMLのようなビジュアル言語、または以下のようなテキスト言語を使って定義することができます。 Emfaticのようなテキスト言語を使って定義することができます。エンタープライズグレードのツール パピルスや Siriusのようなエンタープライズグレードのツールは EMF 上に構築されており、モデルを扱うためのより強力な機能を提供します。を使用して、メタモデルをドメイン固有言語の文法として定義することもできます。 Xtext.
これだけではとても理解しきれません!ここでは、利用可能なツールや技術の概要を説明します。お分かりのように、MDEツールとその原理は非常に豊富で、確立されており、比較的成熟しています。モデルやメタモデルをグラフィカルまたはテキストで定義することができ、多くのツールが EMF 上に構築されているため、メタモデルを定義した後は、必要に応じてそこから Java コードを生成し、プログラムで作業することができます。
モデル・マネージメント
メタモデリングと、(メタ)モデルを定義するために使用できるツールについてよくご存知のことと思う。だから何? これらのモデルでこれらのモデルで何ができるのか?一般的な言語を使って表現できることを最終的に制限してしまうスキーマの定義に、なぜこれほど時間と労力を費やすのでしょうか?MDEの真価はそこにある。メタモデルは、抽象的なレベルでモデルを扱えるようにするために必要です。 モデル管理モデル管理とは、モデルに作用するプロセスです。これらの作業には以下のようなものがあります:
ビジュアライゼーション:様々な目的や聴衆のために、モデルの様々なビューやグラフィカルな表現を提示すること。
問い合わせ:モデルからデータを取得し、計算集約的な式を含むことが多い。
バリデーション:メタモデルはしばしば、ドメインモデルに関連するすべての制約を表現するのに十分強力ではないため、モデルが適切に形成されていることを保証するために、追加のプログラムロジックが必要になる。
比較:モデルを比較し、プログラム上の違いに基づいて行動する。
マージ:複数の入力モデルを取り込み、1つの出力モデルを作成する。
マイグレーション:モデルをメタモデルの進化したバージョンにマッピングすること。
変身:モデルを修正したり、別の出力モデル(別のメタモデルに準拠する場合もある)を生成したりすること。
テキスト生成:モデルを使用して、ソースコードやドキュメントなどのテキスト出力を生成します。
お察しの通り、これらすべてのタスクのためのツールもあります。Ecoreの機能を超えるモデルの検証に使われる事実上の言語は オブジェクト制約言語 (OCL).これについては 入門チュートリアルで詳しく学ぶことができます。を参照してください。このセクションでは、OCL の概要について説明します。モデルからモデルへの変換に関する文献は膨大で、しばしば非常に複雑です。もちろん、次のようなモデル変換のための言語もあります。 ATLや QVTなどがありますが、ここではそれらに触れません。
開発者として、私たちは何をすべきなのか。 開発者としてを気にするでしょうか?生産性だろう?それがこの議論の前提だ。私たちの日々の多くは、ドキュメントや定型的なコードを書くことで占められているため、私たちが望むのは、楽しいことや、より多くの注意やエンジニアリングの専門知識が必要な部分に集中できるように、これらの部分をできる限り自動生成することです。そこで役立つのが、モデルからテキストへの変換だ。以下のような標準がある MOF M2Tなどの標準と、それに準拠したツールがある。 Acceleoのような標準規格や、それに準拠したツールがある。 ジャカルタ・サーバー・ページ(JSP).ウェブ上のJavaは2000年代初頭の遺物のように聞こえるが、その背後にある原理はまだ有効である。結局のところ PHP言語は文字通り「ハイパーテキスト・プリプロセッサー」の略で、今でも広く使われている。しかし、JSPやPHPがコード生成やモデル駆動エンジニアリングとどのような関係があるのでしょうか?それは、このブログ記事のパート2で取り上げることにしよう。その前に、これを実証するために実際に使われるツールを見てみましょう。
エプシロン
MDEの主なコンセプトといくつかのツールについて簡単に説明しましたが、これらはどのように結びついているのでしょうか?私たちには異なるメタモデリングテクノロジーがあるので、モデルは様々なフォーマットであり得ますが、これまで述べてきたツールのほとんどはEMFをベースにしています。さらに、各モデル管理タスクには独自のツールがあり、クエリ/変換ロジックを定義するための構文やセマンティクスもさまざまであるため、学習曲線が急であることを考えると、MDEは複雑で重量級であると思われるかもしれません。しかし、様々なモデリング技術とモデル管理タスクの統一を目指すプロジェクト(当然Eclipseベース)がある: Epsilon.完全な情報開示:私は博士課程の間、イプシロンに広範囲に貢献した!
イプシロンとそのアーキテクチャーについての説明は長くなるので割愛する。 ドキュメントに任せますが、簡単な紹介はします。基本的に、Epsilonは、共通のコアクエリ言語である EOL.これは、OCLの構文に触発されたものですが、Javaで実装され、Javaのリフレクション機能を多用しているため、よりJavaに近い振る舞いをします。EOLからネイティブのJavaコードを呼び出すこともできるので、基本的にEOLは、コレクションを扱うための宣言的な操作だけでなく、通常の命令型プログラミング構文をすべて備えた完全なプログラミング言語です。
重要なことは、Epsilonは複数のモデリング技術をサポートし、EMFに縛られないということです。EMFモデルを非常に強力にサポートし、他のEMFツールと統合していますが、その モデル接続レイヤにより、言語とモデルの永続化フォーマットが切り離されているため、XML、CSV、その他のスプレッドシートフォーマット、JDBC準拠のデータベースなど、さまざまな種類のモデルを使用することができます。Simulinkなどです。このように、Epsilonはモデル管理のためのオールインワンのソリューションを提供します。異なるタイプの複数のモデルを同じプログラム内で組み合わせ、統一された方法で作業することもできます。
今はここまで...。
ふぅ、大変だったね!しかし、次のパートでは、実用的な例を通して、そのすべてを説明します。具体的には、Vonage Java SDK用の膨大なボイラープレート・コードを効率的に自動化するために、Epsilonをどのように使用したかを紹介します。
ご意見、ご感想がありましたら、お気軽にX(旧名 ツイッターまたは コミュニティ・スラック.この記事がお役に立てば幸いです。もしこの記事を楽しんでいただけたなら、私の他の Java記事.