関係性のパターン:ジェネレーター/シミュレーターパターン

ジェネレーターは「入力値に応じて適切なものを生成して欲しい」といった発想から生まれます。入力画面でユーザーが何かを入力し、その後生成ボタンを押すと結果が表示されるようなタスク指向のウィザードになりやすいので注意が必要です。

ウィザードを使用したタスク指向的なジェネレーター

この発想を整理する観点は2つあります。

1つめは、生成されるものをオブジェクトとして考え、入力画面はオブジェクトの新規作成アクションの一種だと考えることです。

具体的には、まず生成されるものに注目してみましょう。大抵は何かが生まれます。この生成されたものを振り返ることがあるでしょうか。ある場合は一覧が必要です。

この時点では生成するための画面と生成履歴画面が必要になるはずです。生成するための画面は特に変更なく、タスク指向的な画面のままです。

「生成する」タスクのためのウィザードと、その履歴を確認する「生成履歴」で構成した例

これをオブジェクト指向の考えで整理してみましょう。生まれた何かを生成物オブジェクトとして定義したとします。そうすると生成履歴画面というのは生成物オブジェクトのコレクションとして扱うことができます。そして「生成する」画面は生成物オブジェクトの新規作成アクションとしてデザインすることができるはずです。

生成物(この例では地形)オブジェクトとして再構成した例

2つめの観点は、入力値に応じて生成結果が動的に変化するように変えることで、生成のための入力と生成されるものを並列に扱うことです。

一定の手順を経た入力を元に出力を返すジェネレーターではなく、入力するごとにリアルタイムに結果が生成されるようにします。ユーザーからすればすぐに結果が生成されますのでシミュレーターのように感じることができます。(もちろんリアルタイム性がジェネレーターかシミュレーターかを区別するわけではないので、シミュレーターも「シミュレート結果をリアルタイムでジェネレートしている」と表現することも可能です)

ひとまとまりになった入力を受けてから結果を生成するジェネレーター、設定に応じて結果をリアルタイムで表示するシミュレーター

生成するための設定は生成物オブジェクトのプロパティに位置付けられます。ということは生成物オブジェクトのシングルでプロパティを設定し直すことも可能になります。入力をまとめてコンピューターに投げて少ししてから結果を受け取るような固定的な手順ではなく、ユーザーは入力値と結果を同時に見ながら何度でも調整することができるようになります。

生成のための入力項目を生成物のプロパティとして扱うことで、生成物のシングルから柔軟に調整することが可能になる

The Art of User-Interface Design