如何避免嵌套方法调用?

How to avoid nesting method calls?

我有一个 Question 对象。每个 Question 包含后续问题的实例,应该在之后显示。在问题显示期间,传递了一个 string 参数。

如果我有Question的:Q1、Q2、Q3、Q4,Q1可能包含以下数据:

Q1:
    questions: {
        "abc": Q2,
        "def": Q3,
        "xyz": Q2
    }

选择"abc"时,Q2实例传递"abc"字符串显示。

我的实现方式:

class Question {
     public void Show(string option){
         // ... display
         var selectedOption = GetSelected();
         // questions["abc"] = Q2
         questions[selectedOption].Show(selectedOption);
}

我立刻觉得我在某个地方转错了方向。它不会发生,但如果问题数量足够多,我会溢出调用堆栈。即使在现实世界中,它也会使堆栈跟踪变得可怕且不可读。

我想把它改成:

class Question {
     public Question Show(string option){
         // ... display
         var selectedOption = GetSelected();
         // questions["abc"] = Q2
         var next = questions[selectedOption];
         next.SetValue(selectedOption);
         return next;
}

从外面调用,一个一个。但我担心整个想法是有缺陷的,所以我的问题是:我修改后的想法至少是半正经的,还是有更好的方法来实现这种基于用户输入的链接对象执行?

我将问题链的生成与显示问题分开。生成链可能如下所示:

for (Question q = initialQuestion; q.Next != null; q = q.Next)
 yield return q;

和"showing"他们:

foreach (var q in GetQuestionChain(initialQuestion))
 q.Show(); //No recursion.

现在我选择了以下内容:

class Question {
 private Dictionary<string, Question> questions = ...
 public Question Show(){
     // ... display
     var selectedOption = GetSelected();
     // questions["abc"] = Q2
     var next = questions[selectedOption];

     if(next != null)
         next.SetValue(selectedOption);

     return next;
}

然后

{ \ in some method
  Question q = Q1;
  do{
    q = q.Show();
  } while( q != null)
}