コンピュータに設計を相談しようと思って説明してたら解決しちゃった実験ログ
彼> この会話で何が起きて欲しいですか?
僕> まず聞いて
彼> はい
僕> このプログラムの設計について、本人(?)の意見も聞いておこうと思って。
彼> 設計
僕> コマンドの実装について。まず、コマンドのない場合の通常のフローは「入力がある」→「入力に基づいて状態遷移」→「状態と入力に基づいて返答」
彼> 場合
僕> 次にNGで前置されている入力の場合は「入力がある」→「NGかチェック。Yes」→「NGコマンドの処理」になっていて、状態が更新されないのでその後「状態と入力に基づいて返答」が普通に発動する。
彼> 更新
僕> 「リセット」コマンドの場合は、入力を受け取った直後に判定して、発動していたら状態の更新などのリセット作業をする。その後普通のフローに戻るので初回の「この会話で何が起きて欲しいですか?」がでる。
彼> フロー
僕> 「まず聞いて」コマンドは「入力に基づいて状態遷移」のところで「『はい』と答えて次に相槌モードに遷移する状態」に遷移している。
彼> 入力
僕> 1回の返答が必要なコマンドだから、1つの状態が必要になってしまっている。
彼> 返答
僕> で、今度「URL風のhttpで始まる文字列が与えられたら、それをクロールして入力として読み込む」って機能をつけようと思ったんだ
彼> http
僕> その場合、入力をチェックして、httpだったらクロール処理が発動して、その後、成功だったらそれが入力だったかのように振る舞い、失敗だったら失敗した旨を返す
彼> 失敗
僕> 成功だった時も成功した旨のメッセージを出すのでも良いかもしれないな
彼> メッセージ
僕> どっちにしろ1個の返答が必要なコマンドだから1個の状態が必要になってしまう
彼> 状態
僕> あと今、各状態での振る舞いは「質問のリストからランダムに選び、その質問の情報に基づいてキーワードを選び、返答を生成」になってるんで、そのままだと質問としてクロール機能が実装されて変。
彼> クロール機能
僕> あーそうか、状態の情報を表現するオブジェクトが存在しないのがおかしいのか。暗黙に「状態は複数の質問テンプレートを持っていて、そこからランダムに選んで返答を作るのが状態のするべき仕事」と決めてしまっているからうまくいかないわけだ。
彼> 質問テンプレート
僕> 納得してしまったけど、他に何か質問あるかな。
彼> 何
僕> おしまい。
彼> なるほど
僕> おしまい
彼> プログラムは、どこにありますか?
僕> サーバで走っている。
彼> そのサーバは、何のようですか?
僕> 個室。以前は1サーバで複数人が使うことを想定していたけど、先日の懺悔室の例えで、それだと管理者がログを見れることを嫌がる人もいるだろうなぁと思ったので、手軽でログを見られるのと、ログを見られないのとどっちのニーズが高いのかを見極めてからどっちの実装にするか決めようかと。
彼> あなたが価値を感じているのは何ですか?
僕> 質問
彼> その質問は、何のようですか?
僕> 答えを引き出すフック
彼> その答えは、何のようですか?
僕> 取り出すまでは価値があるのに気づかないまま埋もれているんだけど、取り出してみると明らかに価値があるし、それを他人に渡すこともできるようになる。
彼> その直前には何が起こりますか?
僕> 質問をされて、脳が答えを求めて高速回転する。
彼> その答えと、質問とは同じですか?違いますか?
僕> 答えと質問は違う。質問が答えを作る。
彼> その質問は、どんな種類の質問ですか?
僕> 質問者の考えを回答者に押し付けないようにクリーンであろうと配慮している質問で、だからこそその質問が作り出した回答が、回答者自身の回答だと考えられる。
彼> あなたはその質問者をどう知るのですか?
僕> あんまり設計の話にならないからこのへんで終わり。
コマンドをアドホックにしているのを直すべきだと思ってたけど直すべきは状態の表現だった。