背後にある哲学
「万物は流転する」(パンタ・レイ) ——ヘラクレイトス(紀元前535-475年)
すべては存在である
Be——Being is Everything。このフレームワークは「すべては存在である」という前提のもとに作られています。
ドメインに対する問いを深めていったとき、私たちは存在の問いにたどり着きました。何が存在を可能にするのか。存在はどのように変容するのか。存在しないとはどういうことか。
2500年にわたり、東洋の思想家も西洋の哲学者も存在に対する問いを深めてきました。しかしこのフレームワークは哲学を設計原則として採用したのではありません。ドメインへの問いを深めた結果、それらの教えが証言のように感じられたのです。
1.「Tell」から「Be」へ
強調点の違い
1967年:Tell, Don’t Ask
「オブジェクトにデータを尋ねるな、何をすべきか伝えよ」
この原則は何十年もOOPを導いてきました。しかし気づいてください——私たちはまだオブジェクトに命令していたのです。
2025年:Be, Don’t Do
「オブジェクトに何をすべきか伝えるな、あるべき姿にならせよ」
// Tell, Don't Ask(命令的)
$user->validate();
$user->save();
// Be, Don't Do(宣言的)
$user = $becoming(new UserInput($data));
考えてみる価値のある問い
アラン・ケイは、オブジェクトをメッセージでコミュニケーションする自律的な細胞として構想しました。しかし実際に生まれたものは、受動的なデータ構造を操作するコントローラーに近いものでした。
Be Frameworkの一つの見方:オブジェクトが自らの変容に参加する——そのオリジナルのビジョンに近づこうとする試みです。
2.「WHETHER?」という問い
手続き型はHOW?——どうやるか。OOPはWHAT?——それは何か。存在論的プログラミングはまず、WHETHER?——そもそも存在できるか、と問います。
#[Be(ValidatedUser::class)]
final readonly class UserInput
{
public function __construct(
public string $email,
public int $age
) {}
}
条件が満たされればValidatedUserは存在します。満たされなければ、存在しません。
3. 不可能性のための設計
二つのアプローチ
防御的アプローチ:
「エラーが起きたらどうする?」
→ チェックを追加し、例外を処理する
存在アプローチ:
「無効な状態は存在できるか?」
→ 存在できないように設計する
// 防御的
function processUser(User $user) {
if (!$user->isValid()) { throw new Exception(); }
if (!$user->hasEmail()) { throw new Exception(); }
// ...
}
// 存在ベース
function processUser(ValidatedUser $user) {
// ValidatedUserが存在する以上、構造的に有効
}
アイデア:エラーを処理するのではなく、特定のエラーを表現不可能にする。
4. ヘラクレイトス:万物は流転する
時間の中のオブジェクト
ヘラクレイトスは、同じ川に二度入ることはできないと観察しました。
従来のオブジェクトは、しばしば時間の外に存在します:
$user->age = 5;
$user->age = 50; // 同じオブジェクト、違う年齢
$user->delete();
$user->getName(); // 削除後に?
時間的な順序
一つの観察:ドメイン概念にはしばしば自然な時間的順序があります。
// 型でこの順序を表現できる:
UserInput → RegisteredUser → ActiveUser → DeletedUser
各段階は区別されます。DeletedUser型はActiveUserにはなれない——型システムがこの制約を反映しています。
時間 T0: EmailInput — 初期状態
↓
時間 T1: ValidatedEmail — 検証後
↓
時間 T2: RegisteredUser — 登録後
各段階は部分的な状態ではなく、完全な状態を表します。
5. アリストテレスのデュナミス:可能態
アリストテレスはデュナミス(可能態)とエネルゲイア(現実態)を区別しました。どんぐりは樫の木になる可能性を持っています。
Union型でこのアイデアを表現できます:
#[Be([ApprovedLoan::class, RejectedLoan::class])]
final readonly class LoanApplication
{
public ApprovedLoan|RejectedLoan $being;
public function __construct(
#[Input] Money $amount,
#[Input] CreditScore $score,
#[Inject] LoanPolicy $policy
) {
$this->being = $policy->evaluate($amount, $score) > 0.7
? new ApprovedLoan($amount, $score)
: new RejectedLoan($amount, $score);
}
}
ApprovedLoan|RejectedLoanという型は、最初から可能な結果を宣言しています。オブジェクトは自らの潜在的な未来を携えています。
6. 無為:強制しない
老子は書きました:
「道は常に無為にして、而も為さざるは無し」
これは、結果を強制するのではなく、自然な流れに従って作用することを示唆しています。
// 強制する
$controller->forceUserToValidate();
$controller->forceUserToSave();
// 可能にする
#[Be(ValidatedUser::class)]
#[Be(SavedUser::class)]
$user = $becoming(new UserInput($data));
後者のアプローチは強制しません——オブジェクトが何になれるかを宣言し、変容が起こるに任せます。
7. 仏教
縁起(プラティーティヤサムトパーダ)
仏教哲学は教えます:
「これあるとき、かれあり」
これは相互依存的な生起を表しています——物事は孤立して存在しません。
final readonly class ValidatedEmail
{
public function __construct(
#[Input] string $value, // 先行する存在
#[Inject] EmailValidator $validator // 可能にする条件
) {
// ValidatedEmailはこれらの条件から生起する
}
}
何が続き、何が落ちるか
これはまた、変容を通じて何が続くか vs 何がそれを可能にするかを考えることを示唆します:
#[Be(Adult::class)]
final readonly class Child
{
public function __construct(
#[Input] string $name, // 続く:アイデンティティ
#[Input] array $memories, // 続く:経験
#[Inject] SchoolService $school // 可能にし、そして離れる
) {
$this->wisdom = $school->learn($memories);
}
}
#[Input]— 引き継がれるもの#[Inject]— 変容を可能にするが持続しないもの
刹那滅
仏教にはもうひとつ、刹那滅(クシャナ・ヴァーダ)という教えがあります。すべての存在は一瞬だけ存在し、即座に消滅する。
$final = $becoming(new OrderInput($items, $customer, $payment));
// OrderInputは生まれた瞬間に消える
// ValidOrderが生まれ、それも消える
// InStockOrderが生まれ、それも消える
// ...最終オブジェクトだけが残る
遠くから見れば変容の流れ。近くで見れば、消滅と生成の繰り返し。各オブジェクトは一瞬だけ存在し、次の存在に引き継いで消えます。変容したものは変容前に戻りません。
8. 二種類の透明性
構造的
UserInput → ValidatedUser → SavedUser → ActiveUser
変容の経路が型に見えています。
意味的
string $email // 名前がEmail検証を示唆
string $password // 名前がPassword検証を示唆
名前が意味を運びます。
構造と意味の両方で透明であることが、コードをそれ自身のドキュメントにします。
9. 共鳴
これらの哲学が、Be Frameworkと共鳴しています。
| 出典 | 概念 | Beでの表現 |
|---|---|---|
| ヘラクレイトス | 万物流転 | Input → Being → Final |
| アリストテレス | 可能態 | Success\|Failure $being |
| 老子 | 無為 | #[Be]宣言 |
| スピノザ | 必然的存在 | 意味変数 |
| フッサール | 内在における超越 | #[Input] + #[Inject] |
| 荘子 | 自己証明 | $been |
| ハイデガー | 言葉は存在の家 | クラス名が世界を構築 |
| 仏教 | 刹那滅 | 消滅と生成の繰り返し |