首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以面向对象的方式对其进行建模

如何以面向对象的方式对其进行建模
EN

Stack Overflow用户
提问于 2011-05-23 22:49:17
回答 1查看 257关注 0票数 1

我的系统中有以下实体

代码语言:javascript
复制
public class Student
    {
        public Guid StudentId { set; get; }
        public string StudentName { set; get; }
        public virtual Course[] Courses { set; get; }
    }

 public class Teacher
    {
        public Guid TeacherId { get; set; }
        public string TeacherName { get; set; }
        public virtual Course[] Courses { get; set; }
    }


public class Course
    {
        public Guid CourseId { set; get; }
        public string CourseName { set; get; }
        public Student[] Students { set; get; }
        public Teacher Teacher { get; set; } 
        public Test[] Tests{ get; set;}
    }


public class Test
    {
        public Guid TestId { get; set; }
        public String TestName { get; set; }
        public int TotalMarks { get; set; }
        public int PassingMarks { get; set; }
    }

每个学生可以订阅许多课程,每个课程可以有多个学生

每个老师可以教授多门课程,每个课程可以有一个老师。

每门课程可以有多个测试

例如,有一门名为“数学”的课程,为期6个月,在这6个月中进行了几次测试。

如果我想要存储以下数据“考试t1的学生S1分数”“考试t1的学生s1分数”,那么正确的数据结构是什么?

我知道我可以在考试和学生之间有多对多的关系,但学生和课程之间已经有了多对多的关系,课程包含考试。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-23 22:56:32

您应该考虑设置一个类,例如“标记”,其中包含学生->标记和标记->测试之间的关系。

通常,当您进行面向对象的设计时,在这个领域级别上,您的类和关系是用例或描述中的名词和动词。在本例中,您知道您的学生有标记;这些标记是特定于该学生的。学生没有测试,因为这些测试不是由学生创建或控制的。

更新

是的,想法是你会有一个类标记,在学生和他们的标记中有一个关系;标记将与它的测试有关系。换句话说,“一个学生有考试分数”--一旦你学会正确地看待它,这些东西实际上就自然而然地出现在问题的语言中。

所以这应该是这样的

代码语言:javascript
复制
class Student { // lots of other fields
    marks : set of Marks  // any convenient structure
                          // logically a Set because you wouldn't have the
                          // same marks assigned to a student twice
}

class Marks {  // A Mark is the Student's score for a test
    Score s;
    Test t;
    Student stud; // see below
}

class Test { // other information needed here too
    marks : set of Marks
}

现在,您有了一个类结构,它允许您问“学生在考试中的分数是多少?”,然后您可以问“这些考试是什么?”反过来,你可以问“这些测试的分数是多少?”和“那些学生是谁?”这就是为什么Marks需要一个学生的回溯关系。

需要注意的两件事:

(1)这是OO分析中的一种非常常见的模式--一个多对多的关系变成了一个表示它的“助手类”。

(2)如果您打算将其放入数据库中,那么还有第二个问题:最自然的做法是使每个类都是一个单独的表;如果您能够以几乎为零的成本(例如访问时间)在表中查找项,则此方案工作得很好。在实际的数据库中,您必须多次访问磁盘才能进行此访问,并且速度会变慢。这就是所谓的“对象关系阻抗不匹配问题”。它有许多解决方案,包括反规范化数据库,创建额外的索引或视图来预计算关系,或者修改对象模型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6098853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档