DCI Meetupに参加
・・・してません。
してないけど、想像で思いの丈を書くよ。
まず、DCIについてはちょっと前にモノ思ったんだけど、togetter見る限り、疑問の一つに関してDCI Meetupで一応の回答が得られた模様。
その疑問というのは「ロールはextend Moduleではなくて、Adapterで実装してはいかんのか?」ということなんだけど、回答としては要するに「ロールが異なっても同じオブジェクトなんだからアイデンティティを同一に保ちたい」ということらしい。
ただ、言わんとすることは分かったけど、実はあんまり納得できてなくて、とあるコンテキストで何かしらのロールを果たしているオブジェクトのアイデンティティってそんなに重要なんだろうか?
ミッキーマウスがステージで踊ってるのを見るときに中の人が誰かなんてどうでもいいというか、むしろ中の人なんていないことにして見るのが正解であるように、ロールを果たしているオブジェクトが実際には何か、なんてむしろ考えずに済むのが理想だし、そのためのコンテキストじゃないかと思うんだけど。
あと例えば、とあるコンテキストにロールが二つ登場するとして、実際にはそれらの実体が同じオブジェクトになるということもあり得ると思う。そうした場合に、アイデンティティが同じということは「オブジェクト自身」はコンテキスト内で自分がどのロールを果たしているかを知らないということになる。
もちろんプログラマはそのオブジェクトを参照している変数名でロールを知ることができるんだろうけど、オブジェクト自身は普通自分がどういう変数名で参照されているかなんてわからないわけだから、自分のロールを知る術がない*1。このことは「リフレクション重要」っていうCoplien自身の言葉とずれがあるように思う。
*1:extendによる実装ではobj.my_role みたいなメソッドを実現する手段がないということです
DCIは人間讃歌
ただここまで書いといてアレだけど、DCIについては実装方法とかは瑣末な話で、もともと アレグザンダーとかその辺が大本にあって、目指すところはもうちょっと電波な思想的な話みたい。DCI Meetupでは「DCIは世界を変える方法」とか言ったみたいだけど、まぁ要するに世界の見方を変えようって話なのかな。
これ(DCI)は単なるソフトウェアフレームワークではないし、メンタルモデルをとらえるためのパターンランゲージに留まるものでもない。コンピュータソフトウェアにおける人間的要素を賛美するような世界観をとらえるパラダイムなのである。
(http://dl.dropbox.com/u/15791171/sa10-JimCoplien_Patterns_ja.pdf)
これまでのOO設計は静的な構造を捉えることばかりに囚われていて、ユーザーがそのシステムをどのように捉えているのかと視点に欠けている部分があった。アーキテクチャからメンタルモデルへ、つまり「世界がどういう形であるか」から「世界がどういう形であるとユーザーは考えているのか」へ設計の目指すところを変えたのがDCIだと思う。
ユーザーのメンタルモデルという視点にたてば、それは固定されたものではなく、ユースケースごとに変化するものであるはず。と言っても完全に不定では何が何だか分からない。システムにはこれまで同様静的な部分も当然ある。この一時的な構造と、永続的な構造を分かりやすく分離するために導入されたのが、ロールでありコンテキストだろう。
つまり、実際のシステムのコアになる部分は静的・永続的なものであって、オブジェクト(データ)はそこに属する。ここまではこれまでと変わらない。一方ユースケースごとにユーザーの中に構築されるメンタルモデルは動的・一時的で、そこではオブジェクトがコンテキストに応じて様々なロールに射影されている。この部分がこれまでのMVCには欠けていたもので、DCIによって新しく導入されるもの。
敢えて視線をイデアから人間の住む世界である洞窟の影へ。これがDCIは「コンピュータソフトウェアにおける人間的要素を賛美するような世界観をとらえるパラダイム」という言葉の意味じゃないだろうか。
要するにDCIは人間讃歌で勇気の讃歌。