假设您正在制作管理课程和学生的软件。
我假设您将拥有管理员课程,课程课程和学生课程。
管理员课程可以具有各种功能,例如“获取所有可用课程列表”或“获取学生注册的所有课程列表”。
这是棘手的部分。
课程可以有很多学生,而学生可以上很多课程。
以下是我想到的一些实现:
课程类包含学生列表,学生课包含课程列表:
Pro:直截了当,Con:耦合
课程类包含学生列表,为了“获得学生注册的所有课程”,管理员课程将首先获得所有课程,然后过滤包含该学生的课程。
Pro:未耦合,Con:低效计算
在管理员类中,包含以下字段:
HashMap<Lesson, [Student]>
HashMap<Student, [Lesson]>
Pro:没有耦合,Con:凌乱
他们似乎都不满意我。我可以就这个困境得到一些反馈吗?什么是通常接受的设计模式?
答案 0 :(得分:1)
我不会在Lesson对象中有完整的Student对象,反之亦然。
课程类包含一组订阅学生的学生ID
Student class包含一组在其中订阅的lessonIds。
您的管理员课程可以使用这些ID来映射,过滤,检索课程,学生及其关系。
编辑:
我必须说,在现实生活中,您的数据将保留在关系数据库中,您应该有一个表学生,一个表课程和表 StudentsLessons ,其中 studentId和lessonId作为外键。
答案 1 :(得分:0)
考虑到将来我可能需要将它们保存在数据库中这一事实,我会这样做。
学生和课程之间的关系多对多,因此您需要设置双向 或与这两个类的单向关系。
Bi-directional
- Student
课程中的课程列表,反之亦然Unidirectional
- Student
中的课程列表或列表
Lesson
班的学生例如,我正在设置单向关系
class Student {
private List<Lesson> lessions;
// other attributes
}
class Lesson {
// Lesson attributes
}
您正在谈论的Administrator
课程实际上是服务课程的理想候选人,因为它提供服务
例如&#34;获取所有可用课程的列表&#34;
对于Lesson
相关查询,我将创建LessonService
class LessonService {
// Get the list of all available lessons
List<Lesson> findAllLessons() {...}
// Get all lessons a student is enrolled in
List<Lession> findAllLessons(Student student) {...}
}
最后,会有一个repository/dao
层来抽象底层数据库。
您的存储库可以是基于内存的简单集合,也可以代表实际的数据库。