2012-11-12 22 views
0

我讀過一些UML類圖。我看到這樣的一些UML設計:面向對象:A類和B類依靠在一起。這是很好的設計嗎?

例如:有兩個class:class Student和class Transcript。每個學生都有一份成績單,每份成績單都與一名學生一起。所以,班級學生和班級成績單是依靠在一起的。那麼,這是一個很好的設計課程嗎?

如果不是,我們該如何解決這個問題。如果這是好的,我該如何實現這種關係?

謝謝:)

回答

1

我不會說這是一個非常好的設計:顯然,你想要student.transcript.student == studenttranscript.student.transcript == transcript在任何時候都是真的,對吧?但是沒有成績單的學生呢?沒有學生的成績單?如果這些被禁止,您可能會以一種有趣的情況結束:您必須同時創建相應的StudentTranscript

那麼,在數據庫領域,這通常是用三個表(這可能會或可能不會直接對應到實際的物理表)建模:

TABLE Student (studentId ID PRIMARY KEY, ...) 

TABLE Transcript (transcriptId ID PRIMARY KEY, ...) 

TABLE StudentTranscriptLink (
    studentId ID NOT NULL UNIQUE REFERENCES Student(studentId), 
    transcriptID Id NOT NULL UNIQUE REFERENCES Transcript(transcriptId) 
) PRIMARY KEY (studentId, transcriptId) 

UNIQUE約束保證,如果你把學生,獲得其成績單,並獲得該成績單的學生,你回到你剛開始的原始學生; Transcript->Student->Transcript導航也是如此。

在OOP世界裏,你將可能有某種StudentTranscriptDispatcherList<Pair<Student, Transcript>>內,並用於車削StudentTranscript和背部的方法。

但是,這種雙向關係是......不尋常的。它基本上有一個大的物體分成兩半 - 但仍然保持這兩個緊密結合在一起非常。你爲什麼要這樣做?它並沒有消除任何複雜性,相反:它引入了新的,人爲的複雜性,這在之前沒有。

+0

是的,當談到數據庫設計時你是對的。然而,與OO設計不同的是,我會說有一個獨特的學生和成績單對象可能是一個有效的設計。 –

+0

是的,但通常你不會有指向學生的成績單:我懷疑是否有任何依賴於學生的成績單特定的方法。不引入依賴關係只是爲了將程序與雙針縫合在一起。 –

0

什麼你應該想想這裏是通航。聽起來這種關係是完全合適的,但是,你有沒有必要從Transcript導航到Student?如果不是,你的關係不是雙向的,Transcript不再依賴於Student。你總是首先找到Student,然後是Transcript

說實話,我不會太擔心它。如果它適合你 - 隨它吧!

相關問題