概要

真の航海とは、新しい風景を探すことではなく、新しい目を持つことである。

  —マルセル・プルースト『囚われの女』(À la recherche du temps perdu 第5巻)1923年

DoingからBeingへ

まず、これを見てください

// 従来のユーザー削除方法
$user = User::find($id);
$user->delete();

// 異なるユーザー削除方法
$activeUser = User::find($id);
$deletedUser = new DeletedUser($activeUser);

DeletedUserって何?と思うかもしれません。 これまで考えてもみなかった方法で、プログラミングを考えてみましょう。

『何をするか』から『何であるか』へ

従来のプログラミングはDOING(何をするか)に着目します:

$user->validate();
$user->save();
$user->notify();

Be FrameworkはBEING(何であるか)に着目します:

$userInput = new UserInput($name, $email);
$validatedUser = new ValidatedUser($userInput);
$savedUser = new SavedUser($validatedUser);

前者はオブジェクトに対して「何をしろ」と指示します。 後者はオブジェクトが「どのような状態になるか」を表現します。

なぜこれが重要なのか

DOINGに着目すると:

  • 実行前に「このアクションは可能か?」を毎回チェックする必要があります
  • 様々なエラーケースに対処しなければなりません
  • 不正な状態を防ぐための処理が常に必要です

BEINGに着目すると:

  • 不正な状態のオブジェクトは最初から存在しません
  • オブジェクトが存在すること自体が「正しい状態」の証明になります
  • その時にできることだけに集中できます。できないことはそもそも実行できません

違いは型そのものにあります:

// 従来型:汎用的な型
function processUser(User $user) { }

// Be Framework:特定の存在状態
function processUser(ValidatedUser $user) { }
function saveUser(SavedUser $user) { }
function archiveUser(DeletedUser $user) { }

各型はただのデータではなく、オブジェクトの特定の状態を表しています。時間的な変化が型で表されるので、その時点で可能な操作だけが行えます。たとえば、削除済みのオブジェクトにさらに削除を命じることはできません。

なぜ「コントローラー」ではないのか?

従来のMVCフレームワークでは、コントローラーがアプリケーション全体の流れを制御します。しかし、システムが複雑になるにつれて、この「全てを制御しようとするアプローチ」は困難になります。

コントローラーは全てのモデルやコンポーネントに無制限にアクセスできる「全能の自由」を持っています。しかし制約がないということは、システム内のあらゆる手続きの整合性を自分で保つという「無限の責任」を負うことを意味します。

Be Frameworkは異なるアプローチを採ります。操作が目的のデータをつくり出すのではなく、種子のような単純な入力オブジェクトが他のオブジェクトと出会い、自然に成長し、最終オブジェクトへと自ら変容していきます。

Commander (司令官) から Gardener (庭師) へ:

  • 司令官は部下(オブジェクト)に「動け」と命令します。しかし、システムが複雑になるほど、すべてを命令で制御し続けるのは困難です。
  • 庭師は、植物に命令しません。ただ、水や光という環境を整えるだけです。

植物は他者を変えようとせず、環境を受け入れて自らを変容させ、あるべき姿に成ります。Be Frameworkも同じです。入力を与えると、自らが最終オブジェクトになるような環境を整えます。制御を手放し、自律的な変容に委ねる。これがBe Frameworkのコアコンセプトです。

このマニュアルで学べること

以下の新しいプログラミング手法を身につけることができます:

  1. 「何をするか」ではなく「何であるか」を設計する
  2. 不正な状態をチェックするのではなく、最初から作れないようにする
  3. オブジェクトを無理に変更するのではなく、自然な変容(自己変容)を表現する
  4. エラーを防ぐのではなく、正しい状態を信頼する

なぜ「DeletedUser」なのか?

冒頭の問いに戻りましょう。new DeletedUser($activeUser) は操作ではなく、変容です。ユーザーが「削除される」のではなく、$activeUserからDeletedUserという新しい存在が生まれるのです。型そのものが削除済みであることを証明しています。$statusフラグを確認する必要も、削除済みのユーザーに誤ってメソッドを呼ぶ危険もありません。これがBe Frameworkの本質です:状態遷移を既存オブジェクトへの操作ではなく、新しい型として表現する。

さあ、始めましょう

まず動かしてみたい方は? Getting StartedでHello Worldを体験するか、チュートリアルで実践的な例に挑戦できます。

概念から理解したい方は? 入力クラスに進んで、基礎からステップバイステップで学びましょう →