如何避免嵌套方法调用?

时间:2015-01-05 11:24:51

标签: c# .net

我有一个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;
}

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

2 个答案:

答案 0 :(得分:0)

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

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

n#34;显示"它们:

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

答案 1 :(得分:0)

现在我跟着以下:

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)
}