2015-12-21 68 views
0

我已經多次面對這個非常基本的東西,但我從不知道如何以最有效的方式解決它。如何最有效地更新2個相互依賴的類中的數據

我有一堂課'學生'和一堂課'課程'。學生應該通過一系列課程知道他所有的課程,課程應該通過一系列學生知道所有正在訪問的學生。

現在讓我們說,我想學生參觀新的課程,所以我創建一個「addCourse(課程學習)」的方法,以新課程加入課程的學生的名單 - 沒問題。但我也想讓課程知道學生現在正在訪問它。所以我爲課程課程創建了一個'addStudent(Student student)'方法,並在學生的'addCourse'方法中調用它。

問題是:我想讓這些數據更新可能來自雙方 - 學生和課程,但是如果我要將相應的其他方法添加到自己的方法中,我最終會遇到堆棧溢出。那麼我怎樣才能最有效地防止這種情況?

另外,如果我存儲在這兩個類的對象這個數據,我想我會淹沒我的記憶中有更多的數據比我更需要。有沒有辦法來防止這種情況,而不會失去對數據的訪問?

回答

0

您有一個Student類,該類具有AddCourse方法,該方法更新學生訪問的課程列表。

你有一個Course類,它有一個AddStudent方法,該方法更新訪問該課程的學生列表。

其他地方在您的課程中,您決定讓學生去參加課程。例如,如果學生想加入課程,可能會有學生與之交互的用戶界面。該用戶的操作應觸發對某些業務邏輯的調用,該業務邏輯完成將學生添加到課程中所需的一切。例如:

function AddStudentToCourse(studentId, courseId) 
{ 
    student = GetStudentById(studentId); 
    student.AddCourse(courseId); 
    course = GetCourseById(courseId); 
    course.AddStudent(studentId); 
} 

的這裏的一點是,只要Student而言,它只是維持課程ID號的列表。 Student類實際上並不是做的任何與課程有關的東西;它只是維護列表,以便其他一段代碼可以在以後引用它。

同爲Course;它只是維護一個學生證號碼列表。

這種設計的美妙之處在於StudentCourse是彼此獨立的,除了那些id列表;而那些實際上只是數字。

我不會說這是「最有效」的方式來做到這一點。不過,它確實運行良好。

+0

我完全同意你的解決方案的第一部分,即最好有兩個add ...方法和一個單獨的to方法來創建雙向關係。不過,我建議使用引用而不是ID。它們不太容易出錯,需要更少的空間(假設Java中使用「Integer」),並且它們更容易遍歷。我不會擔心你的記憶會「氾濫」,這些雙向引用應該不是問題。 – TilmannZ

+0

@TilmannZ:無論你喜歡什麼。但是,請注意,「整數」是32位。在32位系統上,參考值爲32位,但在64位系統上爲64位。但是,可能無關緊要,除非你正在談論數千億記錄。 –

+0

我大多同意。如果你編譯爲64位,你會得到64位指針。如果你編譯的是32位(限於4GB左右,你可以獲得32位引用,即使是在64位系統上(我認爲).Java有點不同,因爲Java壓縮參考文獻,只要你選擇少於32位32GB的內存,即使在64位的JVM上也是如此 – TilmannZ