本資料およびLED-Campにおいては、MDD(モデル駆動開発)=モデルを作成し、それを基にソースコードを生成する開発手法、とします。
これにより、プログラミング言語よりも抽象度が高い開発を行うことができます。
もちろん何もかも自動で行ってくれる訳ではなく、自動化のための仕組みを作り、ドメインに応じたモデルを定義する必要があります。
モデル駆動開発は、絶対的な解決をもたらす魔法のツールというわけではありませんが、ドメインによっては非常に強力な武器になりえます。使いどころを見極めて導入を検討してみてください。
本稿では、モデル駆動開発の仕組みや導入方法などについて解説します。
モデルからコードを生成するという広義のモデル駆動開発には、多くの手法が含まれます。
業界によってもMDDとMBDは入り混じっていることも多いため、その人の指すモデルが何かを確かめながら話すといいように思います。本書ではUMLを用いたMDDを中心に解説します。
対象をある観点と抽象度に基づいて情報を取捨し纏めたものをモデル、モデルを図面に落としたものをモデル図、モデルを作成することをモデリングといいます。
例えばUMLのクラス図は、ソフトウェアを構造の観点でクラスという抽象度で抽出したものです。
同様にステートマシン図は状態という観点で、クラス内部の抽象度で抽出したものとなります。
このように情報の取捨を行うことで、必要な情報のみに注力して考えることができます。
また予め分析する観点を決めておくことで、設計の抜け漏れを防ぐことができます。
ソフトウェア開発では多くの場合、様々なステークホルダーが関わってきます。
各々のステークホルダーが求めるシステムのイメージは必ずしも一致しているとは限りません。
このためモデルの段階でシステムの全体構成や機能について合意を形成しておくことで、システムが完成してからの齟齬を軽減することができます。
近年のソフトウェアの規模は、人が捉えるにはあまりにも膨大すぎることが多くあります。 このような情報の取捨のために、モデル化は非常に効果的です。 現在のスコープに不要な情報を排除することで、見たいものにだけフォーカスすることができます。
ソフトウェア開発とは要求を満たすソフトウェアを作成することです。
上図に要求から実装までの自動化の度合いを示します(感覚的に描いたものなので、厳密には異なります)。
当然コンピュータでできないことは、実装のしようがありません。
要求分析の段階で、実現不可能なものは弾いておきましょう。
アセンブリ言語はコンピュータでできうる事はおおよそ実装することができますが、実装には多くの工数が掛かってしまいます。
C言語はアセンブリ言語よりも抽象度が高く、ほぼアセンブリ言語と同等の範囲を実装することができます(できないこともありますが・・)。
Java言語では、ダイレクトメモリアクセスができないなどいくつかの制約がありますが、C言語よりも抽象度が高く、より少ない工数で実装を行うことができます。
MDDではさらにできる範囲は狭まりますがさらに少ない工数で実装を行うことができます。
MDDは対象のドメインを限定することにより、自動化を行います。
簡単に言ってしまうとそのドメインでよくあるパターンをテンプレートとして、そのテンプレートにモデルをはめ込むことで、コードを生成します。
例えばWebシステムでデータベースにアクセスするコードやORマップのコードは、どのシステムでも似通っていますが、データベース構造に合わせて毎回作成する必要があります。
このようなコードをクラス図で作ったデータベース構造から自動生成するイメージです。
当然、Webアプリを生成するためのMDDの枠組みを組込みシステムに適用することはできないため、ドメインに応じたMDDの枠組みを新たに作成する必要があります。
このように自由度と自動化はトレードオフの関係にあります。
対象としているソフトウェアが今後どのようにスケールするかを考えながら、MDDの枠組みを作成する必要があります。
変換ルールの作成には、モデルからコードへ手動で実装するよりも多くの工数が掛かります。
一度きりの開発しか行わないシステムや一度しか使わないモデルでは、モデル駆動開発を採用するメリットは少ないです。
モデル駆動開発を導入する際には、この初期投資と何サイクルで投資が回収できるかのトレードオフをよく考えることが重要です。
加えて、可変性のトレードオフも重要です。なんでも生成できる変換ルールを作るには無限の工数が掛かります。
将来必要となる変更を見据えて、可変性の範囲を検討してください。