【发布时间】: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.Course和SomeCollectionType<Student> Course.Students,有时使用Student.Course初始化建立关系,有时-使用Course.Students.Add(student)。 -
“每个学生一次最多只能参加一门课程”意味着毕业需要很长时间,或者一个学生可以参加几门课程,但不应该承诺在两个不同的地方同时?那么审核课程的学生呢?
-
课程可以有有意义的方法来注册学生。你在处理什么,你是在处理课程还是学生,如果你的主要观点是学生,那么把学生放在你设计的中心。
-
@hazimdikenli 没有想出
Register对Course类的操作...感谢您的提示。 -
如果“出勤率”是您关心的问题,那么也许它应该是您模型中的一个实体?
标签: c# oop composition model-associations