【问题标题】:Establishing a parent-child-relationship in object oriented design在面向对象设计中建立父子关系
【发布时间】:2014-12-25 14:04:36
【问题描述】:

假设我们要为参加课程学生建模。每个学生一次最多应参加一门课程,并且一门课程可以包含多个学生(典型的一对一关联)。进一步假设这种关联应该是双向的,即我们应该能够从学生导航到课程,反之亦然。

所以我们自然会有两个类,Student(保存对指定课程的引用)和Course(包含学生集合)。但是我们如何组成对象图呢?具体来说,我们应该在哪些类上定义哪些操作来建立学生和班级之间的联系?第一个明显的选择是在Course 类上定义一个通用的Add 方法:

class Course
{
    public void Add(Student student) { ... }
}

但您同样可以在 Student 类上定义一个操作:

class Student
{
    public void Attend(Course course) { ... }
}

(当然还有更多选择,比如将Course 类的实例传递给Student 的构造函数,但这不是重点)

比较这两种选择,我个人觉得第二种选择更有吸引力,因为student.Attend(course)course.Add(student) 传达更多信息,因为Attend 比通用Add 更有意义。但是,我还没有遇到一个 API 使用这种将元素添加到容器对象的样式,这使我得出结论,我遗漏了一些重要的东西。

那么,除了第二个选项不是很常见之外,它的缺点是什么?还是没有我想的那么罕见?

【问题讨论】:

  • 从常识来看,学生可以参加课程,课程不应该添加学生。从实践来看,会有公共属性Student.CourseSomeCollectionType<Student> Course.Students,有时使用Student.Course初始化建立关系,有时-使用Course.Students.Add(student)
  • “每个学生一次最多只能参加一门课程”意味着毕业需要很长时间,或者一个学生可以参加几门课程,但不应该承诺在两个不同的地方同时?那么审核课程的学生呢?
  • 课程可以有有意义的方法来注册学生。你在处理什么,你是在处理课程还是学生,如果你的主要观点是学生,那么把学生放在你设计的中心。
  • @hazimdikenli 没有想出RegisterCourse 类的操作...感谢您的提示。
  • 如果“出勤率”是您关心的问题,那么也许它应该是您模型中的一个实体?

标签: c# oop composition model-associations


【解决方案1】:

在大多数情况下,假设学生能够在不满足课程规定的任何要求的情况下参加课程是相当不现实的。

更完整的协议将从学生申请课程开始。然后课程将接受或拒绝申请,并采取相应的行动,注册或不注册学生并通知他们决定,无论它是什么。

如果学生收到接受回复,他们可能会选择“记录”接受申请的课程。此操作只是为了学生的方便,因为正式步骤已经完成。因此,如果我们同意由学生来跟踪他们(现在和过去)参加的课程,那么很明显,参加方法不是强制性的,因此不应该是主要方法。

【讨论】:

    猜你喜欢
    • 2011-04-21
    • 1970-01-01
    • 2013-02-20
    • 2014-02-26
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多