存在クラス
「道常無為而無不為」
—道は常に無為にして、而も為さざることなし(老子『道徳経』第三十七章 紀元前6世紀)
内在と超越
入力クラスが「始まり」なら、存在クラスは「変容した存在」を表現します。
入力クラスのpublicプロパティは、存在クラスのコンストラクタに引き継がれます。この引き継がれた値を内在(Immanence)と呼びます。内在はオブジェクトのアイデンティティであり、変容を経ても保たれます。
コンストラクタには外部から超越(Transcendence)もインジェクトされます。超越は内在と出会い、新しい内在へと変容させます。
基本構造
final readonly class ValidatedUser
{
public string $displayName;
public bool $isValid;
public function __construct(
#[Input] string $name, // 内在
#[Input] string $email, // 内在
#[Inject] NameFormatter $formatter, // 超越
#[Inject] EmailValidator $validator // 超越
) {
$this->displayName = $formatter->format($name); // 新しい内在
$this->isValid = $validator->validate($email); // 新しい内在
}
}
#[Input]パラメータには、前のクラスのpublicプロパティが名前の一致により自動的に渡されます。UserInputのpublic string $nameはValidatedUserの#[Input] string $nameに対応します。#[Inject]パラメータにはDIコンテナから外部の依存が注入されます。この自動マッチングの詳細なルールは5章 変容で説明します。
時間的存在としてのオブジェクト
Be Frameworkでは、オブジェクトを静的なデータ構造ではなく、特定の時間の中でのみ存在する時間的な存在として捉えます。
誕生
コンストラクタは、オブジェクトが生まれる場所です。すべての存在クラスは同じ変容の流れに従います:
内在 (#[Input]) + 超越 (#[Inject]) → 新しい内在
内在が超越と出会い、変容のロジックが働き、プロパティの代入によって新しい内在が生まれます。生まれた瞬間、そのオブジェクトのアイデンティティと状態は確定し、不変(Immutable)となります。
生
オブジェクトは public readonly プロパティとして、その「あるべき姿」を世界に晒します。フレームワークがこのプロパティを読み取り、次のクラスの #[Input] として引き渡します。その後、オブジェクトは消滅し、次の存在に道を譲ります。
なりたい自分になる
すべての変容は、最終的な「なりたい自分、なるべき自分(Final Object)」になるための旅です。
出会った超越は、新しい内在に影響を与えて消滅します。幼少期の友人のように、オブジェクトを形作りその一部となりますが、その時だけの存在として、やがて消えていきます。
変容の例
final readonly class OrderCalculation
{
public Money $subtotal;
public Money $tax;
public Money $total;
public function __construct(
#[Input] array $items, // 内在
#[Input] string $currency, // 内在
#[Inject] PriceCalculator $calculator, // 超越
#[Inject] TaxService $taxService // 超越
) {
$this->subtotal = $calculator->calculateSubtotal($items, $currency);
$this->tax = $taxService->calculateTax($this->subtotal);
$this->total = $this->subtotal->add($this->tax); // 新しい内在
}
}
OrderCalculationは計算された注文になりたい。ValidatedUserは検証済みユーザーになりたい。各クラスがコンストラクタで「なりたい自分」になるのです。Be Frameworkでは、動作(DOING)ではなく、存在(BEING)を中心に考えます。
変容についての考察
内在だけでは変われません。データがどれほど豊かでも、それ自身の力で新しい存在にはなれないのです。変容には必ず超越—自分の外にある力—との出会いが必要です。そして出会った超越は内在を変え、自らは消えていきます。この「出会い、変わり、消える」というパターンは、コードに限った話ではありません。小麦粉はイーストと熱に出会ってパンになります。ぶどうは酵母と時間に出会ってワインになります。種は土と水と光に出会って花になります。あらゆるドメインの変容がこのパターンに従います。
自然な流れ
存在クラスは何かを「する」わけではありません。自分が持つもの(内在)と、外部から与えられる力(超越)が出会うことで、自然にあるべき姿へと変容します。この流れを指揮するものはいません。各オブジェクトはただ次の存在に渡されるだけです。
変容の行き着く先、最終オブジェクトへ ➡️