2012年10月24日水曜日

トレイト・モデリング

先日行われたScala基礎勉強会はどの発表もとても刺激的でしたが、特に僕が触発されたのは:

  • Deprecating the Observer Pattern
  • JavaScript as an Embedded DSL

の2つです。

どちらも関数型言語のテクニックというより、トレイトの活用テクニックで、つまりオブジェクト指向プログラミングの最新技法ということができるでしょう。論文を見ていただければ分かりますが、その効果は驚異的です。

以前OFP(Object-Functional Programming)の三種の神器としてトレイトを取り上げましたが、恐らくScalaプログラミングという文脈では、その威力はモナドや型クラス以上でしょう。

つまり、Scalaをオブジェクトと関数のハイブリッドとしてのみの認識で見ているとScalaの実力を見誤ってしまいます。(これだけでもすごいのですが)

トレイトの導入によって、新次元のオブジェクト指向プログラミングができるという観点からの評価も必要でしょう。

モデリングにトレイトを導入

Scalaにおけるトレイトの威力は日々のScalaプログラミングで感じているわけですが、ちょっと思いついてSimpleModelerに組み込んでみたところ、モデリングの用途にもかなりいい感じになったということは「MindmapModelingと集合知(10) - トレイト」で説明しました。

この点をもう少し補足しておきましょう。



図の左上にあるのが、トレイトを用いたモデルです。A, B, Cがそれぞれトレイトで、クラスAがこの3つのトレイトをミックスインしています。

右上にあるのが、データベースのテーブルです。トレイトA, B, CとXの項目をすべて合体した表Xが定義されます。

下にあるのが、JavaやScalaといったプログラムです。データベースの表の各行は1つのオブジェクトとしてインスタンス化されます。

データベースの表の設計から開発を開始すると、表を構成する要素であるA, B, Cは他の表との共通部分であっても、共通部分ということはモデル上から陽には分かりません。設計者だけが知っている暗黙の情報ということになってしまいがちです。

このため表のメタデータから自動生成したJavaクラスではこういった共通情報をうまく抽出することはできません。このため、共通情報を操作するコンポーネントを用意するようなアプローチの適用が難しくなります。(逆に、動的言語だとこのあたりがスムーズにいきます。)

一方、モデルでトレイトを導入した場合は事情が異なります。上の例にあるようにデータベースの表ではひとつの大きな表になり、読み込んだオブジェクトもひとつの大きなオブジェクトになりますが、トレイトA, B, Cに対応する部分は、インタフェース(Javaの場合)やトレイト(Scalaの場合)としてプログラム化するので型安全にコンポーネントを適用することができます。

データベース中心設計への影響

現在は、データベースのER図と画面設計の二本立てで設計を進め、それぞれの実現であるデータベースとWeb UIを構築する開発方法が広く使われています。

このアプローチは余分なモデリングを必要としないのでプログラミング中心の開発とも相性がよくなっています。

従来のオブジェクト指向モデリングでは、オブジェクト・モデルとER図(あるいはRDBMSのデータベーススキーマ)のセマンティクス・ギャップは継承周りにとどまっています。これも大きなギャップではあるのですが、継承をできるだけ避けたり、Single Table Inheritance的なテクニックを使うことにより、オブジェクト指向モデリングをせず、直接ER図による設計から入っても十分に開発を行うことができたわけです。

別の言い方をすると、オブジェクト・モデルとER図がほとんど同じ形になるケースでは、オブジェクト指向モデリングした結果をデータベース・スキーマに変換する手間を掛けるより、直接ER図でモデリングしたほうが効率がよくなります。

そこでトレイトです。

モデリングにトレイトが入ってくると、単なる継承とは別次元のセマンティクス・ギャップが発生します。こうなってくると、直接ER図でモデリングするより、オブジェクト指向モデリングの結果をER図に変換するほうがより良い結果を得ることができるはずです。

もちろん、モデリングにトレイトを導入しても手作業でデータベース・スキーマに変換していたのでは効果は限定的です。しかし、SimpleModelerのようなモデルコンパイラによって、このあたりの変換処理が自動化されれば、トレイト導入の効果を十二分に享受することができます。

というようなことを、SimpleModelerがトレイトを処理した結果のクラス図を眺めて感じたしだいです。こういった新しいモデリング手法が浸透するまでには長い時間が必要になるので、今すぐER図中心、データモデリング中心の開発アプローチが下火になることはないでしょうが、長い目で考えると大きく動いていくところではないかと思います。

0 件のコメント:

コメントを投稿