あなたは基本的に非常に単純なステートマシンを書いています-すべての状態を表すために関数を使用してください:(言語を指定しなかったので、ランダムな擬似コードを使用します)
get_information():
return get_record()
ask_record():
record = read_line()
return () if !record
return ask_y(record)
ask_x(record):
x = read_line()
return ask_record() if !x
return ask_y(record, x)
ask_y(record, x):
y = read_line()
return ask_x(record) if !y
return ask_continue(record, x, y)
ask_continue(record, x, y)
continue = read_line()
return ask_y(record, x) if !continue
return (record, x, y)
これは些細なアプローチです。一部の言語では、コールスタックが増加しますが、他の言語では増加しません。スタックを成長させる言語がある場合は、次のように書き直すことで、トランポリンを使用してスタックを防ぐことができますget_information
。
x = get_information
while x is function:
x=x()
return x
ask_x(record):
x = read_line()
return (lambda: ask_record()) if !x
return (lambda: ask_y(record, x))
または、結果の質問とメモリアドレスを抽象化することで、次のようquestion
な構造になります。
struct question {
question *next, *prev;
char prompt[];
char **result;
}
次に、ループで実行し、呼び出しquestion* run_question(question*)
て、答えに応じて-> next、または-> prevに移動し、結果がNULLになるまで(結果が入力されて質問が残っていない場合の停止条件として)。
直接ポインタアクセスで命令型言語を使用する場合、最後の解決策はおそらく最も「通常の解決策」です。