UML を語るなら・・・

英会話とか習おうとすると必ず言われることがあります.「日本語で考えちゃダメ」って.日本語で考えて,それを英語に直訳しようとしていてはいつまで経っても英語が喋れるようにならないそうで.そりゃそうだよなぁと思いはするものの,実際に英語で考えるなんて簡単にはできません.日本語で考えるのをやめようとすると思考停止しちゃいます.心より恥じる.


同じことはプログラミング言語でもいえますよね.例えばこれから Ruby でもやってみようなんて思ったとしても,頭の中で Java のコードを思い浮かべてそれに対応する Ruby の表現を調べるとかやっていては,おそらく Ruby な人にはなれないのではないかと.まぁ JavaC# なんかだとそれも近道の一つかもしれませんが,Prolog とか ML とか毛色の違うものだとそんなやり方は通用しそうもありません.


つ・ま・り
ある言語を習得するということは,表面的な字句を憶えるということではなくて,その言語の背後にある思想でものを考えられるようにならないとダメだよねってことです.
それはまた,ある言語を語るならその言語の背後にある思想も理解した上で語って欲しいよねってことです.Java な発想に凝り固まった人がそれをベースに Ruby を批判してもちゃんちゃらおかしいでしょ?


それはモデルの表記法でも同じこと.
UML の L が言語であることが示しているように,モデルの表記法とはモデリング言語なのです.
本来,表記法とモデリングという活動あるいは行為・プロセスといったものは別のものです.モデリングとその成果物であるモデルも別物だし,モデルとその表記法も別のものです.
とはいえ,モデリング言語 (表記法) はモデリングという行為を妨げることなく支援するために考案されることが多いと思われます.このような場合,モデリング言語をモデリングやその基礎となる考え方から切り離して語ることは難しいと思います.


で,本題♪
簡単に言ってしまうと,頭の中に E-R 図を思い浮かべて,それを UML に置き換えていった時に問題があったとしても,それは UML 自身の問題とは限らないってことです.えぇ,あの人の話です (謎なし).
タイトルが関連クラスになってるけど,実は主題は多対多の関連の扱いなんですよね.
基本的にデータモデリングの人達は多対多の関連を避けて,「関連エンティティ」などと呼ばれるエンティティを導入し,1対多と多対1の二つの関連に分割します.意識的にせよ無意識にせよ,まずこれが「前提」になってます.メンタルモデルですな.
このような「関連エンティティ」を含んだ E-R 図を頭の中に浮かべて,次にそれを UML に変換します.そして「関連エンティティ」に対応する UML のモデル要素を探します.どうやら「関連クラス」を見つけたらしい.
そのようなクラス図を描きます.しかし,その関連クラスは関連に対して何も拡張していないため,そこに描くことができないと気づいて...
「なんだこれは! 俺の描いた関連エンティティはどこへ行ったんだ!!」
ってことになってるんだと思うわけですよ.


結局の所,頭の中にある考え方がデータモデリングで,E-R 図で描かれたモデルを思い浮かべていて,それで UML を語ってもしょうがないってことです.E-R 図というモデリング言語に思考が規定されている,囚われてしまっているのです.それで UML がどうとか語るって,日本語で考えたことを英語で表現しようとしたら全然言い回しが違うって英語に文句付けてるのと同じ話.まぁ,英語に文句付けることは自分もよくやりますけどね,頭の中が日本語だから (苦笑).


っていうか,タイトルと本文と合ってないよね.あのタイトルだと,関連クラスという UML におけるメタモデルの一要素の本質に迫る手段としてデータモデルを使うみたいなイメージじゃないですか.でも全然メタモデルな話じゃないんですよね.所詮表記法の話.
そういえば昔 Nifty で議論した時も方法論の話をしているつもりでいたら実は表記法で,結局主キーには下線を引かなきゃダメだそれ以外は許さんみたいなことを言われて超ガッカリして議論やめたような記憶が (苦笑).


あと蛇足ですが,OOPL (オブジェクト指向プログラミング言語) でそのまま実装できないのは関連クラスというより関連自体でしょう.多対多で双方向の関連が first class object であるような OOPL って聞いたことないっす.多くの OOPL は「参照」を提供しますが,それって単方向の対 1 関連しか表現できません.いわゆる関連よりも遥かに低水準なメカニズムに過ぎないのです.言い換えると関連は OOPL で直接サポートするには高水準すぎる,重量級の概念なのです.でもでも,それゆえに関連の記法を使いたがらないモデラーがいたら笑っちゃいますが.
ちなみに ODBMS (オブジェクトデータベース管理システム) であれば多対多で双方向の関連やそれを拡張した関連クラスをそのまま実装できるものが存在します.例えば MATISSE とか.


蛇足ついでにもう一つ.方法論あるいは表記法と顧客が気の毒かどうかは別問題だよね.データモデリングかオブジェクトモデリングかと,顧客が気の毒かそうでないかは 2×2 の 4 象限でしょう.
もしかしたら,データモデリングさえ使えば顧客は気の毒じゃなくなるとでも主張しているのだろうか? まぁ,その手の主張をするのはベンダーとかコンサルにとっては日常的なことだったりするし,こっちが真に受けなければいいだけの話ですが.