您将如何分离课程和学生的场景?

How would you decouple a scenario of lessons and students?

提问人:itsmarziparzi 提问时间:3/14/2018 更新时间:3/15/2018 访问量:55

问:

假设您正在制作一个管理班级和学生的软件。

我假设你会有一个管理员班级、课程班级和学生班级。

管理员类可以具有各种功能,例如“获取所有可用课程的列表”或“获取学生注册的所有课程的列表”。

这是棘手的部分。

一堂课可以有很多学生,而一个学生可以有很多课。

以下是我想到的一些实现方式:

  1. 课程班级包含学生列表,学生班级包含课程列表:

    优点:直截了当,缺点:耦合

  2. 课程类包含学生列表,为了“获取学生注册的所有课程”,管理员类将首先获取所有课程,然后筛选包含该学生的课程。

    优点:不耦合,缺点:计算效率低下

  3. 在管理员类中,具有以下字段:

    • HashMap<Lesson, [Student]>
    • HashMap<Student, [Lesson]>

    优点:不耦合,缺点:凌乱

对我来说,他们似乎都不满意。我能得到一些关于这个困境的反馈吗?什么是通常接受的设计模式?

OOP 设计模式 与语言无关

评论


答:

1赞 martidis 3/14/2018 #1

我不会在 Lesson 对象中拥有完整的 Student 对象,反之亦然。

课程类包含订阅学生的一组 studentID

Student 类包含一组 lessonId,他们在其中订阅。

管理员班级可以使用这些 ID 来映射、过滤、检索课程、学生及其关系。

编辑:

我不得不说,在现实生活中,您的数据将持久化,例如在关系数据库中,您应该有一个表 Students、一个表 Lessons 和一个表 StudentsLessons,其中 studentId 和 lessonId 作为外键

评论

0赞 itsmarziparzi 3/15/2018
从表面上看,这在我看来是最合理的。
0赞 Yogesh Badke 3/14/2018 #2

考虑到将来我可能需要将它们持久化在数据库中,这就是我将如何去做。

学生和课程之间的关系是多对多的,因此您需要设置双向 或与这两个类的单向关系。

  • Bi-directional- 课堂上的课程列表,反之亦然Student
  • Unidirectional- 课程列表或课程列表 学生在课堂上StudentLesson

例如,我正在设置单向关系

class Student {
    private List<Lesson> lessions;
    // other attributes
}

class Lesson {
    // Lesson attributes
}

你所谈论的类实际上是服务类的一个很好的候选者,因为它正在提供服务 例如“获取所有可用课程的列表”Administrator

对于相关查询,我将创建LessonLessonService

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

存储库可以是基于内存中的简单集合,也可以表示实际的数据库。

评论

0赞 itsmarziparzi 3/15/2018
是的,我已经提到了双向或单向设计。但我想要的是关于这些设计选择的一些反馈。比如,在某些场景中,什么是好的设计?
0赞 Yogesh Badke 3/15/2018
无论您选择哪种设计,都要根据以下问题进行评估:1)以最少的更改添加新功能是多么容易 2)您是否能够重用您的代码 3)根据 SOLID 原则评估设计