連載次世代開発基盤技術“Software Factories”詳解第6回 DSLによるモデル駆動型開発マイクロソフト株式会社 萩原 正義2005/09/03 |
|
Back Issue
|
||||||||||
|
モデル駆動型開発(MDD:Model Driven Development)は、現実的には困難な課題を多く抱えていて、実用的なEoD(Ease of Development:開発容易性)に貢献できないと考えている開発者は多い。
しかし、その課題をよく分析すると、OMG(Object Management Group)のMDA(Model-Driven Architecture)が固有に持っている課題、つまり現実的アプローチとのギャップによる課題であることが多い。例えば、モデル駆動型開発のフレームワークやコンポーネント技術への適合性、各種パターンやリファクタリングの適用、テスト、ビルド環境の利用、開発プロセスの進め方や開発チームの役割、モデルを含めた開発成果物の管理などの課題があり、それぞれを解決していく必要がある。しかし、モデルがあればそれらすべてを解決できるという単純な問題ではない。
そこでまず、現在主流のEoD技術である(エンタープライズJava開発環境の)Enterprise Java Beans(以降、EJB) 3.0*1の例を中心に、モデル駆動型開発の視点で見ていこう。
*1 EJB 3.0の詳細については、Java Solutionフォーラムの「J2EE Watch [7] DIとAOPがサーバ・コンポーネント技術を変える」を参照されたい。 |
◆モデル駆動型開発によるEoD
EJB 3.0やPlain Old Java Object(POJO)*2ベースのアーキテクチャの次のような新機能がEoDに貢献する。
- Annotation(アノテーション)
- アスペクト指向(JSF、Spring、HibernateのPOJOベースのアーキテクチャ)
- Dependency Injection(ディペンデンシー・インジェクション:依存性注入)
- ジェネリック・プログラミング(JDK 5.0)
EJB 3.0やPOJOベースのアーキテクチャでは、これらの機能により開発者がビジネス・ロジックを実装するPOJOの記述に集中できるようになっている。例えば、Annotation機能を用いて、Bean Type、Callback、Object-Relational Mapping、Relationなどの定義をdeployment descriptor(DD)の記述なしに行うこと可能である。@Inject、@EJB、@ResourceといったAnnotation機能によるDependency Injection(以降、DI)を行うことで、EJBなどを見付けるためのコーディングも不要となった。
*2 POJOとはごく普通のJavaオブジェクトやJavaBeansのことである。詳しくは、Java Solutionフォーラムの「J2EE Watch [2] “誰もが書けるEJB”を実現する「EJB 3.0」」を参照してほしい。 |
さて、これらはJavaのソース・コードをベースとしたEoDである。このEoDを、Java、.NET、C/C++、そのほかの動的タイピング言語など、ドメイン、開発言語や実行環境に依存しないソフトウェア開発技術として「DSL(Domain Specific Language)*3を使うモデル駆動型開発」の観点で見ていこう。
*3 DSLの詳細な定義は後述するので、取りあえずUMLのようなモデル言語と見なしてよい。 |
●Annotation(アノテーション)
JDK 5.0で導入されたAnnotationは、ソース・コードのクラスやメソッドなど一部の言語要素に対してキーワードによる宣言(例えば「@Injection」など)を加えることで、コードの記述量を減らす技術である(=.NET言語のC#における属性:Attributeプログラミングと同じような技術)。コードの一部にインラインにメタデータを挿入し、メタデータ駆動でプログラムを実行する宣言型プログラミングである。
Annotationの実体はメタデータであるので、任意のコードやメタデータの生成が可能なDSLモデルは、Annotationのスーパーセットと見なせる。例えば、DSLとしてUMLクラス図相当のもの(=静的構造のクラス拡張モデル)を仮定しよう。このクラスには属性(Attribute)や操作による振る舞いを定義することができる。DSLをコードの任意の位置に対応付づけることができれば、キーワードという属性だけでなく、操作による振る舞いをその位置に生成、追加することができる。
●アスペクト指向(JSF、Spring、HibernateのPOJOベースのアーキテクチャ)
アスペクト指向は、横断的な関心を分離してモジュール化する技術である。JavaなどのOOP(オブジェクト指向プログラミング言語)では、一般にクラスを単位としてプログラムの構造を構築する。複数のクラスにまたがる横断的な関心は、複数個所のコードとして分断されるので、実装やテストなど開発が困難となり、保守性も悪くなる。そこで、この分断されたコードを1つのモジュールとしてまとめて、開発や保守の単位としていこうとするのがアスペクト指向である。このようなアスペクト指向の機能がPOJOベースのアーキテクチャに導入されている。
アスペクトは従来のOOPのクラスとは相補的な構造の単位であり、両者をうまく組み合わせることが今後のソフトウェア開発では主流となる。現在のアスペクト指向は、プログラミング・パラダイムとして、ソース・コードをモジュール化する技術として発展している。
しかし、アスペクトのモジュールを1つのDSLモデルとして表現し、その表現に基づく分析・設計を行い、最終的にOOPのクラス構造に複合化すれば、現在のアスペクト指向言語と同様な効果が得られる。アスペクトが表現する関心の分離に従ったDSLを開発・提供し、利用することで、ソース・コード上にモデルから生成されたコードが織り込まれる(図1)。
図1 クラスに横断的な関心の例、アスペクト指向とコードの織り込み(ウィービング) |
複数のクラスにまたがる横断的な関心は、複数個所のコードとして分断されるので、実装やテストなど開発が困難で保守性も悪くなる。そこで、この分断されたコードを1つのモジュールとしてまとめて、開発や保守の単位としていこうとするのがアスペクト指向である。アスペクト指向におけるアスペクトのモジュールを、1つのDSLモデルとして表現し、その表現に基づく分析、設計を行い、最終的にOOPのクラス構造に複合化する。アスペクトが表現する関心の分離に従ったDSLを開発・提供し、利用することで、ソース・コード上にモデルから生成されたコードが織り込まれる。 |
●Dependency Injection(DI)
DIは、OOPでのオブジェクト構造の構築をコードで作り込まず、フレームワーク/コンテナに制御を任せることで、必要に応じてオブジェクトの注入と構造化を行う技術である。DSLは、モデルからコーディング規約や制御を任されるフレームワーク/コンテナの外部構成定義ファイルを生成可能であり、構成定義ファイル編集機能のエディタとしてDSLエディタが利用可能である。また、そのほかの運用条件を表現するDSLとの連携が可能であるので、DIとの親和性は高い。
●ジェネリック・プログラミング(JDK 5.0)
これら以外に、JDK 5.0や.NET Framework 2.0で導入されるジェネリック・プログラミングは、クラスやメソッドに型パラメータを許す一種の可変性技術であり、DSLの属性設定として型パラメータを与えるモデルを作成すれば、同様な効果を得ることは可能である。(次のページへ続く)
INDEX | ||
次世代開発基盤技術“Software Factories”詳解 | ||
第6回 DSLによるモデル駆動型開発 | ||
1.モデル駆動型開発によるEoD | ||
2.DSLとは | ||
3.DSLの構造 | ||
4.Software FactoriesにおけるDSLの位置付け | ||
「次世代開発基盤技術“Software Factories”詳解」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|