web-dev-qa-db-ja.com

UML:JavaでAssociationクラスを実装する方法

この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では、このクラスをコードで使用する方法がよくわかりません。クラスStudentCourseの両方のプロパティですか。したがって、それが当てはまる場合、コードは次のようになります。

class Student {
  Vector<Course> b;
  Vector<Transcript> c;
}

class Course {
  Vector<Student> a;
  Vector<Transcript> c;
}

本当ですか?これが間違っている場合は、このUMLの実装方法を教えてください。

ありがとう:)

19
hqt

まず、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を保持する結合テーブル。

31
JB Nizet

私はこの質問が非常に古いことを知っていますが、関連クラスにn..1関係を埋め込むよりも便利な方法があります。

public class Transcript {
    //Transcript's properties
} 

public class Course {

    private Map<Student, Transcript> transcriptsByStudent;
}

public class Student {

    private Map<Course, Transcript> transcriptsByCourse;
}
4
Aleks Ben Maza

補足すると、モデルでは、関連クラスの多重度を示します。関連クラス[〜#〜] is [〜#〜]関連自体であり、元の2つのクラスの多重関係が満たされるため、これは不要です。

1
Sean Dougan