你会如何解决课程和学生的情景?

时间:2018-03-14 08:02:46

标签: oop design-patterns language-agnostic

假设您正在制作管理课程和学生的软件。

我假设您将拥有管理员课程,课程课程和学生课程。

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

这是棘手的部分。

课程可以有很多学生,而学生可以上很多课程。

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

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

    Pro:直截了当,Con:耦合

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

    Pro:未耦合,Con:低效计算

  3. 在管理员类中,包含以下字段:

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

    Pro:没有耦合,Con:凌乱

  4. 他们似乎都不满意我。我可以就这个困境得到一些反馈吗?什么是通常接受的设计模式?

2 个答案:

答案 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层来抽象底层数据库。

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