<< Value Objects パターン あれこれ | main | Value Object : シンプルで小型のオブジェクトに目覚めた経緯 >>

ファウラーも、ケントベックも、 Value Object

ドメイン駆動設計(DDD)の Value Object パターンは、マーチン・ファウラーも、ケント・ベックをパターンとして推奨している。

ファウラーのエンタープライラズ・アプリケーション・アーキテクチャ・パターン(PoEAA) の 基本パターンの中の Value Object パターン。
ベックの実装パターンの クラスのパターンの中の Value Object パターン。

エバンス、ファウラー、ベックは、仕事仲間(?)なので、三人で昔、Value Object について、いろいろ語り合ったことがあるんだろうなあ。

ファウラーの Value Object パターン


Money や DateRnage などのシンプルな小型のオブジェクト。

オブジェクト生成時に、コンストラクタで、フィールドを設定し、以降はフィールドを設定しない。
つまり「不変オブジェクト」にすべし。

ファウラーは、アナリシスパターンの付録A.1.5でも、シンプルな小型のオブジェクトである基本型(Fundamental Types)を説明している。

システム開発は、こういうシンプルで小型なオブジェクトを使え、と言い切っている。

int, String, Date をラッピングしたり、それらを、用途別にちょっぴり賢くした小型のオブジェクトがとって良い設計スタイルなんだと。

ファウラーの所属する、Thought Works 社のコンサルタントたちが書いた ThoughtWorks アンソロジーの第5章「オブジェクト指向エクササイズ」でも、この小さなオブジェクトを強制するようにしている。

・一つのクラスに、インスタンス変数は、一つか、二つだけにする

このルールで、設計・実装する練習を繰り返すと、オブジェクト指向設計のスキルが格段にアップするよ、と。

ベックの Value Object パターン


ベックは、Class を、

"This data goes together and this logic goes with it."

と説明している。

・data ( this だけど複数形 ) をいっしょに
・そのdataに関連するロジックもいっしょに

そして、プログラミングスタイルとして、

・オブジェクト
・関数
・手続き

の三つを上げている。

関数は、値を渡すと、値を戻す。 ( 例えば、2つの int を足して、一つの int を返す add 関数 )。

ケントベックは、この関数スタイルの「値」を、int とかの原始型ではなく、オブジェクトで扱うのが、Value Object だと言っている。
値オブジェクト( Value Object ) の名前は、これが由来らしい。

もちろん、Value Object は、不変にする。(コンストラクタで、フィールドセットしたら、後は読み取り専用。別の値が必要なら、別の値オブジェクトを造っちゃう)

こういう小さな不変(imutable)オブジェクトを使うと、ソフトウェアが堅牢で安全になる。

フィールドが変更できる(状態のある)オブジェクトが、状態を表すために、小さな不変の Value Object を使う、というのが、良い実装スタイルなんだ。

int を ラッピングした小さな値オブジェクトは、大量になると、メモリ効率とか、CPU性能への影響が大きいことは問題。
でも、多くの場合は、そんな問題より、「小さな不変オブジェクト」を使うことのメリットのほうが、大きい。

Value Object は、

・コードが読みやすく
・再利用ができ
・変更が簡単
・変更が安全

な、実装の良いやり方、習慣なんだといっている。

理屈はわかったけど


ようするに、シンプルで不変型のオブジェクトをいろいろ作れば良い。
こういう知識は前からあったけど、私たちのチームで、普通に Value Object パターンを使うようになったの最近のことです。

最初は、どんなコードを書いていて、それが、どういう経緯で、Value Object スタイルに変わってきたかは、次の記事で書きます。

コメント
コメントする









この記事のトラックバックURL
トラックバック
calendar
      1
2345678
9101112131415
16171819202122
23242526272829
30      
<< September 2018 >>
システム設計日記を検索
プロフィール
リンク
システム開発日記(実装編)
有限会社 システム設計
twitter @masuda220
selected entries
recent comment
  • 番号より名前。 ニーモニックコードより名前。 【パターン】
    師子乃 (03/10)
  • Smart UI が優れている?
    masuda220 (03/10)
  • Smart UI が優れている?
    kagehiens (03/09)
  • オブジェクト指向プログラミングの教え方?
    masuda220 (12/05)
  • オブジェクト指向プログラミングの教え方?
    ZACKY (12/04)
  • 「オブジェクトの設計力」 スキルアップ講座やります
    masuda220 (08/14)
  • 「オブジェクトの設計力」 スキルアップ講座やります
    kompiro (08/14)
  • 「オブジェクトの設計力」 スキルアップ講座やります
    masuda220 (06/13)
  • 「オブジェクトの設計力」 スキルアップ講座やります
    JHashimoto (06/13)
  • 「オブジェクトの設計力」 スキルアップ講座やります
    masuda220 (02/28)
recent trackback
categories
archives
others
mobile
qrcode
powered
無料ブログ作成サービス JUGEM