UML: как реализовать класс Association в Java
У меня есть этот класс ассоциации UML. Обратите внимание: горизонтальная линия является сплошной линией, а вертикальная линия - пунктирной линией.
--------- ---------
| |*(a) *(b)| |
| CLASS |________________| CLASS |
|STUDENT | | | COURSE |
--------- | ---------
|*(c)
______|______
| |
| |
| CLASS |
| TRANSCRIPT |
|_____________|
Я понимаю эту взаимосвязь, но я столкнулся с некоторыми проблемами при реализации этого UML для кода. Я могу реализовать отношение между классами Student
и class 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.
Спасибо:)
Ответы
Ответ 1
Прежде всего, не используйте Vector, так как это старый класс, который больше не должен использоваться больше 10 лет. Используйте либо Set
, либо List
.
Если класс Transcript
содержит информацию о том, как студент посещает курс (например, дату его подписки на курс), вы можете реализовать его следующим образом:
class Student {
Set<Transcript> transcripts;
}
class Transcript {
Student student;
Course course;
Date subscriptionDate;
}
class Course {
Set<Transcript> transcripts;
}
Это не мешает вам предоставить метод в Студенте, который возвращает все его курсы:
public Set<Course> getCourses() {
Set<Course> result = new HashSet<Course>();
for (Transcript transcript : transcripts) {
result.add(transcript.getCourse());
}
return result;
}
Если Transcript
не содержит никакой информации, то, вероятно, существует возможность моделировать, как эти классы будут отображаться в таблицах базы данных, где единственный способ иметь связь "много-ко-многим" между двумя таблицами - использовать join table, содержащую идентификаторы двух связанных таблиц.
Ответ 2
Чтобы добавить, на вашей модели вы обозначаете множественность по классу ассоциации. Это необязательно, потому что класс ассоциации IS сама ассоциация, и соотношение множественности исходных двух классов будет удовлетворять.
Ответ 3
Я знаю, что этот вопрос очень старый, но у меня есть более удобный способ, чем вложение отношений n..1 в класс ассоциации:
public class Transcript {
//Transcript properties
}
public class Course {
private Map<Student, Transcript> transcriptsByStudent;
}
public class Student {
private Map<Course, Transcript> transcriptsByCourse;
}