如何避免嵌套方法调用?
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)
}
我有一个 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)
}