昔から使われている技術用語をさかのぼる: Value Object編
考えてみればソフトウェアパターンが賑やかだった時代からはすでに20年以上たっているわけで、20年も変わるといろいろ状況も変わりますし、そんな昔のことなんて知ってるわけない、というか知ったことではない、という人も少なくないと思います。
とはいえ今でも使われている用語について、その当時の使われ方を知ると、考察が深まることもあるかもしれません。
そんな感じでOOPとかパターン方面の用語とかを遡りたい! というときには、WikipediaとかではなくてC2 Wikiを見るのがおすすめです。
C2 Wikiとは
Wiki(WikiWikiWeb)の元祖みたいなやつですね。iki-ikiで紹介されています。
例えばValue Objectについて掘りたい、と思った時にはValueObject
で探すと見つかります。単語と単語をつなげるときに、単語の先頭を大文字にする感じです。
とはいえ、C2 WikiもWikiなので更新されます。過去の記述を確認したい、というときにはInternet Archiveを使って確認しておいても良いかもしれません。
ここで気をつけるのは、URLのルールが途中で変わっていることですね。昔はCGI(!)だったようで、c2.com直下の/cgi/wiki?の後ろにフレーズを書くと見つかります。
例えば2002年のValue Objectのページは以下のURLから見られます。
Value Objectのページの場合、見た目はともかく内容に関して言うと、2002年当時から今も昔もそれほど変わっていなさそうです。
1998年のValue Object
そしてこのC2 Wikiのページにあった「Values in Object Systems」は1998年に書かれたValue Objectについての論文です。1998年10月と言えばJDK 1.1の時代なので、Javaとしても相当初期になるんではないかと思います(当時のJavaとの接点はJavaHouse MLくらいしかなかったのであまり良く知らない…)。
HTMLだと以下のURLにあります。こちらの方が読みやすいかと思います。
なんとなく分散システム(CORBA!)的な雰囲気が強いのが当時の流行を感じさせますね。
「2.2 Performance consequences」等でも詳しく検討されていますが、これはプロセスを超えて同じオブジェクトを共有しようとすると、いろいろ気をつけないといけないこと(例えば分散先でオブジェクトを更新したらどうするのかとか、オブジェクトを渡すときに他のオブジェクトを参照している場合どうするかとか、場合によっては循環参照してたらまずいのでチェックしないといけないのではとか)が発生するため、値ぽい何かがあるとうまく回避できるのでは、という話になっていたようです。
Value Objectの文脈でシリアライズ・デシリアライズが盛んに議論されていたのは、こういった文脈のせいもあるようです。
この辺の温度感は、分散と言ってもマルチコアみたいな話はさておき、元々分散しやすいようなアーキテクチャを考慮した上で、役割も異なる計算を「分散」して行う現代的な分散アーキテクチャとはちょっと違うところもあります(そうでもないですが? 往年のCORBAとかEJBとかあんまり詳しくないでちょっと違ってるかも…)。
また、Value Objectが軽量(lightweight)であることを意識している点も見逃せません。これはデータベースへの格納を意識してのようで(第2章)、そのまま1カラムに突っ込むことを意図していたようでした。また、分散環境でも(おそらく当時の計算機パフォーマンスの観点からいっても)できるだけ転送量を減らすため、値そのものが小さくなるようにしたい、という思惑も感じられました。
まとめ
Value Objectは、オブジェクト指向がこれから流行るかも? という時代に、「でもオブジェクトじゃないvalueも便利だったり、オブジェクト指向プログラミングでもvalueっぽいのを使いたいよね」というところから来たものでした。当時の関心事としては、分散環境への対応、マルチスレッドプログラミング、パフォーマンスなどにあったようです。
もちろんこういった文脈は現代とは異なることもあるため、そのまま用語を現代に持ってきてもしっくりこないこともあります。とはいえ、過去の文脈を切り捨てて用語の名前だけを見て使い方を考えるよりも、ある程度は背景も理解した上でその言葉に新しい意味づけを加えつつ使うなり、あるいは新しい言葉を生み出していく方が、より豊かな概念・気持ちが表現できるようになるのではないかと思います。
次回はDomain Model編です(嘘かも)。
Discussion