提问人:itsmarziparzi 提问时间:3/14/2018 更新时间:3/15/2018 访问量:55
您将如何分离课程和学生的场景?
How would you decouple a scenario of lessons and students?
问:
假设您正在制作一个管理班级和学生的软件。
我假设你会有一个管理员班级、课程班级和学生班级。
管理员类可以具有各种功能,例如“获取所有可用课程的列表”或“获取学生注册的所有课程的列表”。
这是棘手的部分。
一堂课可以有很多学生,而一个学生可以有很多课。
以下是我想到的一些实现方式:
课程班级包含学生列表,学生班级包含课程列表:
优点:直截了当,缺点:耦合
课程类包含学生列表,为了“获取学生注册的所有课程”,管理员类将首先获取所有课程,然后筛选包含该学生的课程。
优点:不耦合,缺点:计算效率低下
在管理员类中,具有以下字段:
HashMap<Lesson, [Student]>
HashMap<Student, [Lesson]>
优点:不耦合,缺点:凌乱
对我来说,他们似乎都不满意。我能得到一些关于这个困境的反馈吗?什么是通常接受的设计模式?
答:
我不会在 Lesson 对象中拥有完整的 Student 对象,反之亦然。
课程类包含订阅学生的一组 studentID
Student 类包含一组 lessonId,他们在其中订阅。
管理员班级可以使用这些 ID 来映射、过滤、检索课程、学生及其关系。
编辑:
我不得不说,在现实生活中,您的数据将持久化,例如在关系数据库中,您应该有一个表 Students、一个表 Lessons 和一个表 StudentsLessons,其中 studentId 和 lessonId 作为外键。
评论
考虑到将来我可能需要将它们持久化在数据库中,这就是我将如何去做。
学生和课程之间的关系是多对多的,因此您需要设置双向 或与这两个类的单向关系。
Bi-directional
- 课堂上的课程列表,反之亦然Student
Unidirectional
- 课程列表或课程列表 学生在课堂上Student
Lesson
例如,我正在设置单向关系
class Student {
private List<Lesson> lessions;
// other attributes
}
class Lesson {
// Lesson attributes
}
你所谈论的类实际上是服务类的一个很好的候选者,因为它正在提供服务
例如“获取所有可用课程的列表”Administrator
对于相关查询,我将创建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
存储库可以是基于内存中的简单集合,也可以表示实际的数据库。
评论