ダイアログの基本 で説明したように、Dialog
クラスを使用した会話フローでは、ユーザーからメッセージを受け取るたびに DialogContext#continueDialog()
を呼び出すことで、1 ステップずつ処理を進めていきます。
ダイアログには、スタック構造で会話を管理する仕組みがあり、次のようなメソッドを使って、ダイアログの起動(スタックに積む)、ダイアログの終了(スタックから降ろす)という操作を行うことが可能です。
DialogContext#beginDialog("ID")
… ダイアログを開始する(スタックに積む)DialogContext#endDialog()
… アクティブなダイアログを終了する(スタックから降ろす)DialogContext#replaceDialog("ID")
… アクティブなダイアログを別のダイアログに置き換える(スタックの一番上を入れ替え)DialogContext#cancelAllDialog()
… すべてのダイアログを終了する(スタックをクリア)
ここでは、RootDialog
と GreetDialog
という名前の 2 つのダイアログクラス作成し、RootDialog
から GreetDialog
を起動してダイアログのスタックを積むような実装を行ってみます。
下記は、実際のチャットクライアントの表示例です。
右側のバーで示すように、 最初に RootDialog
による選択肢が表示され、次に GreetDialog
の処理に遷移し、最後に RootDialog
に戻ってくるという流れです。
下記は、最初に起動される RootDialog
クラスの実装です。
前回の説明 で使用した DialogBot
クラスを使って RootDialog
を起動することを想定しています。
ウォーターフォールダイアログの最初のステップ (_step1
) として、ユーザーに選択肢を提示し、「挨拶する」を選んだ場合に、GreetDialog
を新たに起動するようにしています。
下記は、RootDialog
から起動される(スタックに積まれる) GreetDialog
の実装です。
ユーザーに名前の入力を促し、ユーザーに対して挨拶をしたらダイアログを終了します。
2 つのダイアログクラスは、自分が担当する会話のトピックのみに集中して実装できているところがポイントです。
このようなダイアログクラスを作成し、組み合わせていくことで、柔軟な会話を表現できるようになっていきます。
関連記事