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

ウィザード

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

ウィザードを使用したタスク指向的なジェネレーター。「生成する」というタイトルの画面には海、山、川、池、砂漠、荒地のオン/オフを切り替えるスイッチがあり、「生成」というラベルのサブミットボタンがある。それを押すと「生成完了」というタイトルの画面になり、生成された地形が表示される。画面下部には「閉じる」ボタンがある。

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

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

ウィザードと履歴

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

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

「生成する」タスクのためのウィザードと、その履歴を確認する「生成履歴」で構成した例。画面上部に「生成する」と「生成履歴」を切り替えるナビゲーションがあり「生成する」が選択されている。地形ごとのスイッチがあり「生成」ボタンが下部にある。ボタンを押すと「生成完了」画面へ。一方、ナビゲーションで「生成履歴」が選択されている画面では過去の生成のコレクションが並んでいる。

コレクションと新規作成

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

生成物(この例では地形)オブジェクトとして再構成した例。「地形」というタイトルの画面には地形のコレクションが表示され、新規作成ボタンから「地形の新規作成」画面が表示される。この画面では地形のオフ/オフを切り替えるスイッチがあり、画面下部に「キャンセル」と「生成」ボタンがある。「生成」ボタンを押下すると生成された地形が表示される。

ジェネレーターとシミュレーター

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

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

ひとまとまりになった入力内容を元に結果を生成するジェネレーター、設定に応じて結果をリアルタイムで表示するシミュレーター。ジェネレーターはスイッチのオフ/オフで地形を指定し「生成」ボタンを押して地形を表示する。シミュレーターは画面左に地形の選択のためのスイッチがあり、設定に応じて右側に生成された地形が表示される。

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

生成のための入力項目を生成物のプロパティとして扱うことで、生成物のシングルから柔軟に調整することが可能になる。「地形」というタイトルの画面には地形のコレクションが表示される。一つの地形を選択すると地形のシングルが表示される。地形のシングルは、左側に地形の設定をするスイッチ、右側には地形が表示される。設定内容に応じて地形が更新される。