OOP:A类和B类依赖于一起。这个设计得好吗?

时间:2012-11-12 08:25:27

标签: oop uml

我已经阅读了一些UML类图。我用这种方式看到了一些UML设计:

例如:有两个类:class Student和class Transcript。每个学生都有成绩单,每个成绩单都与学生一起。所以,班级学生和班级成绩单一起依赖。那么,这是一个设计良好的课程吗?

如果没有,我们如何解决这个问题。如果可以的话,我怎样才能很好地实现这种关系呢?

谢谢:)

2 个答案:

答案 0 :(得分: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世界中,您可能会在StudentTranscriptDispatcher内部使用List<Pair<Student, Transcript>>,以及将Student转换为Transcript并返回的方法。

然而,这种双向关系......不寻常。它基本上有一个大的物体切成两半 - 但仍然保持那些一半非常紧紧地绑在一起。你为什么要这样做?相反,它并没有消除任何复杂性:它引入了以前没有的新的人为复杂性。

答案 1 :(得分:0)

这里你应该考虑的是导航性。听起来这种关系是完全合适的,但是,您是否必须从Transcript导航到Student?如果没有,则您的关系不是双向的,Transcript不再依赖Student。您是否始终首先找到Student,然后找到Transcript

说实话,我不会太担心。如果它对你有用 - 那就去吧!