2011-12-07 277 views
2

我有一個類Form,其中包含Question項目的散列。避免循環參考

class Form 
{ 
    Dictionary < int , Answer> listOfQuestions; 
} 

class Question 
{ 
    int questionId = 2; 
    int dependsOnQuestion = 1; 
    string answer; 
    public bool IsDependancyMet() {/*problem*/} 
} 

我想一個問題依賴於另一個問題,比方說一個答案,如果答案問題1是「已婚」,顯示問題2,否則,不顯示它。

什麼是正確的實施方式?

是否會將表單實例的引用添加到問題實例中,以便讓後面的一個訪問問題的散列。雖然我不喜歡它。

另一種方法是向Form類中添加一個方法,該方法接收問題ID並檢查是否符合所有依賴關係,但問題應該再次注意表單實例。

關於底線: 誰應該檢查依賴關係以及如何讓系統模塊化,並且每個類都儘可能少地意識到它的環境?或者至少避免週期參考。

在此先感謝。

回答

0

什麼沿着

class Form 
{ 
    Dictionary < int , Answer> listOfQuestions; 
    int firstQuestion; 

    public void NextQuestion() { 
     // ... cycle through `listOfQuestions` looking for a question 
     // whose dependencies are fullfilled and ask it. 
    } 
} 

class Question 
{ 
    // ... 
    public List<int> GetDependencies(); 
    public void Ask(); 
    // ... 
} 

Form東西線跟蹤全球「質疑」狀態,而個別問題,只有他們的直接依賴的知識。對我來說,這似乎是一個相對乾淨的方法。

+0

感謝您的回答。 在任何情況下,我有一個Form.Display()遍歷問題列表,並在每個問題上調用.Ask()或.Render()。問題是這個問題不一定以相同的順序出現。問題12可能取決於問題4的答案; 無論哪種情況,您的解決方案都意味着表單的Render方法將負責決定是否顯示問題,因爲它可以訪問每個問題答案和依賴關係。 我明白你的答案。謝謝。 – Alex