Skip to content

コンセプト

値オブジェクトパターン

値オブジェクト (Value Object) は、ドメイン駆動設計 (DDD) における重要な設計パターンの 1 つです。

エンティティとの違い

特性エンティティ値オブジェクト
識別子持つ (ID)持たない
等価性ID で判断値で判断
可変性可変不変
ライフサイクル長い短い

値オブジェクトの例

日常的に扱う概念の多くは値オブジェクトとして表現できます。

  • 金額 (100 円)
  • メールアドレス (example@example.com)
  • 日付 (2025-05-14)
  • 住所 (東京都渋谷区...)
  • 色 (#FF0000)

このライブラリの設計原則

1. 不変性 (Immutability)

すべての値オブジェクトは readonly クラスとして実装されています。一度作成されたインスタンスは変更できません。

php
// ❌ これはできない
$date->year = 2026;

// ✅ 新しいインスタンスを作成する
$nextYear = $date->addYears(1);

2. ファクトリメソッドによる生成

コンストラクタは private で、ファクトリメソッドを通じてのみインスタンスを作成できます。

php
// from: 信頼できる値から作成 (検証失敗時は例外)
$email = EmailAddress::from("test@example.com");

// tryFrom: 信頼できない値から作成 (Result 型を返す)
$result = EmailAddress::tryFrom($userInput);

3. Result 型によるエラーハンドリング

tryFrom メソッドは Result 型を返します。これにより、例外を使わずにエラーを扱えます。

php
$result = EmailAddress::tryFrom($userInput);

if ($result->isOk()) {
    $email = $result->unwrap();
    // 成功時の処理
} else {
    $error = $result->unwrapErr();
    // エラー時の処理
}

4. Option 型による null 安全性

fromNullable メソッドは Option 型を返します。null を安全に扱えます。

php
$option = EmailAddress::fromNullable($maybeNull);

if ($option->isSome()) {
    $email = $option->unwrap();
}

// または
$email = $option->unwrapOr(EmailAddress::from("default@example.com"));

ファクトリメソッドの使い分け

メソッド入力戻り値用途
from非 nullインスタンス信頼できる値から作成
tryFrom非 nullResult検証が必要な値から作成
fromNullablenullableOptionnull 許容の値から作成
tryFromNullablenullableResult<Option>検証 + null 許容

使い分けの例

php
// データベースから取得した値 (信頼できる)
$email = EmailAddress::from($row['email']);

// ユーザー入力 (信頼できない)
$result = EmailAddress::tryFrom($request->input('email'));

// 任意入力フィールド (null の可能性がある)
$option = EmailAddress::fromNullable($request->input('secondary_email'));

// 任意入力 + 検証が必要
$result = EmailAddress::tryFromNullable($request->input('secondary_email'));

次のステップ

MIT ライセンスの下で公開されています。