このUML Associationクラスがあります。注:水平線は実線、垂直線は破線です。
--------- ---------
| |*(a) *(b)| |
| CLASS |________________| CLASS |
|STUDENT | | | COURSE |
--------- | ---------
|*(c)
______|______
| |
| |
| CLASS |
| TRANSCRIPT |
|_____________|
この関係を理解していますが、このUMLをコードに実装するときにいくつかの問題に遭遇しました。クラスStudent
とクラスCourse
の関係をコードに実装できます。これが私のコードです:
class Student {
Vector<Course> b;
}
class Course {
Vector<Student> a;
}
しかし、クラスTranscript
では、このクラスをコードで使用する方法がよくわかりません。クラスStudent
とCourse
の両方のプロパティですか。したがって、それが当てはまる場合、コードは次のようになります。
class Student {
Vector<Course> b;
Vector<Transcript> c;
}
class Course {
Vector<Student> a;
Vector<Transcript> c;
}
本当ですか?これが間違っている場合は、このUMLの実装方法を教えてください。
ありがとう:)
まず、Vectorを使用しないでください。これは、10年以上使用されない古いクラスであるためです。 Set
またはList
を使用します。
Transcript
クラスに、学生がコースに参加する方法に関する情報(たとえば、コースへのサブスクリプションの日付)が含まれている場合は、次のように実装できます。
class Student {
Set<Transcript> transcripts;
}
class Transcript {
Student student;
Course course;
Date subscriptionDate;
}
class Course {
Set<Transcript> transcripts;
}
それはあなたが彼のすべてのコースを返すStudentでメソッドを提供することを妨げません:
public Set<Course> getCourses() {
Set<Course> result = new HashSet<Course>();
for (Transcript transcript : transcripts) {
result.add(transcript.getCourse());
}
return result;
}
Transcript
に情報が含まれていない場合、データベーステーブルでこれらのクラスがどのようにマップされるかをモデル化することがおそらくあります。2つのテーブル間で多対多の関連付けを行う唯一の方法は、 2つの関連付けられたテーブルのIDを保持する結合テーブル。
私はこの質問が非常に古いことを知っていますが、関連クラスにn..1関係を埋め込むよりも便利な方法があります。
public class Transcript {
//Transcript's properties
}
public class Course {
private Map<Student, Transcript> transcriptsByStudent;
}
public class Student {
private Map<Course, Transcript> transcriptsByCourse;
}
補足すると、モデルでは、関連クラスの多重度を示します。関連クラス[〜#〜] is [〜#〜]関連自体であり、元の2つのクラスの多重関係が満たされるため、これは不要です。