オブジェクトの分類 2

オブジェクトの分類 - emeitch ダイアリにて書いたことを、もう少し調べたところ、マーチン・ファウラー氏がちゃんと適切な名前をつけておられたようです。さすが御大。なので、定義しなおし。

アイデンティティを観点とした、オブジェクトの分類と設計方法

  • 分類:「値オブジェクト(Value Object)」
    • 特性:その内容にアイデンティティを持つオブジェクト
    • 設計:Mutableな設計も可能だが、Immutableに設計した方がお得。
  • 分類:「参照オブジェクト(Reference Object)」
    • 特性:その存在にアイデンティティを持つオブジェクト
    • 設計:Mutableな設計しかできない。

ちなみに、ファウラー氏は、自分の著書にて再三に渡り、「値オブジェクト/参照オブジェクト」の違いの重要性を説かれてるようです。(「Java | VOとDTOの違い(http://blog.ozacc.com/archives/000006.html)」のかくたにさんのコメントより。「アナリシスパターン」以外にも、「リファクタリング」にも記されている。「エンタープライズ アプリケーションアーキテクチャパターン*1や「UMLモデリングエッセンス」*2にも記されているらしい。)

この「値オブジェクト/参照オブジェクト」で注意すべき点は、関数の引数や戻り値の渡し方である「値渡し/参照渡し」とは直接的には結びつかないことということです。「値オブジェクト/参照オブジェクト」は言語処理系の実装概念よりも、もっと抽象的な概念になります。実際に、「値オブジェクトを参照渡し」というのも実用的かつ可能です。(C++ クラス設計に関するノート | オブジェクトの広場をご参照のこと。C++による「値オブジェクト/参照オブジェクト」の実装の違いや、実装上の注意点がが書かれており、非常に有益なページです。追記:今ページの値オブジェクトの実装は、Immutableではなく、Mutableな実装になっていますその点には注意。)

また、「値オブジェクト/参照オブジェクト」の分類方法について、上記では「アイデンティティの所在」の違いで示していますが、これは、shiroさんのコメント(Matzにっき(2003-08-08))、及び結城先生の日記(アイデンティティとImmutable)より教えていただいた知識です。よく、「値オブジェクト/参照オブジェクト」の振り分けの議論は「アイデンティティの有無」で語られているようですが、正確には、「アイデンティティの所在」で語るべき内容でしょう。

「値オブジェクト」という概念をわざわざ導入するメリットは、

  • 並列処理のしやすさ
  • コード保守のしやすさ

など、実用的側面も含まれますが、私の直感ではもっと、「計算機科学」にも即した重要な要素が含まれる気がしてなりません。まぁ、勝手な想像ですけど。

たとえ、「計算機科学」的裏付けが無かったとしても、実用的側面からだけでも「値オブジェクト/参照オブジェクト」の概念を理解することの重要性は変わりないでしょう。プログラミング技術の基礎に位置付けるに値すると概念だと思います。「命令型言語」を使うにしても、「オブジェクト指向言語」を使うにしても、「関数型言語」を使うにしても必要な素養だと思いますから。

そんな大切なことを、今まで理解してなかった自分...orz。

そして、教えていただいた、檜山(id:m-hiyama)さんに感謝です。