【问题标题】:Association Class Confusion协会类混乱
【发布时间】:2015-12-08 17:55:45
【问题描述】:

在类图中,用户可以参加多项考试。考试由几个类别组成。每个类别都有很多问题。每个问题都有很多选择。

我有疑问的两个地方是用户与考试互动的地方。

我的一个朋友说我应该在用户和考试之间建立一个名为考试的关联类。我想,作为属性,它可能有 DateTime 和 Score。为什么考试不能存储分数并有完成日期? (这是否意味着当考试完成时它只是改变状态?)有了这个设计,我猜它也必须有一个用户属性。这将结合用户和考试。 (如果我需要考试来存储分数,那么我需要一个 CompletedCategory 来存储每个类别的个人分数吗?)

另一个地方是用户和问题之间的关系。还是应该是用户和选择?在计算分数之前,我需要在某个地方存储对问题的回答。这些响应也必须保存到数据库中。 Response 应该是关联类还是 Question 中的列表?

谁能给我解释一下优缺点?有没有我可以阅读的好资源?我读过很多 StackOverflow 文章。我学到了很多,但仍然不确定哪些是最好的设计。

以下文章很有帮助:http://www.codeproject.com/Articles/9900/Identifying-Object-Oriented-Classes

但我仍然不确定为什么会这样:“例如,一个 Student 类与一个 Course 类有关联。一个学生可以选修很多课程,而一个课程可以被很多学生选修。但是,谁对成绩负责?将成绩放在 Student 课程中,可以让学生在所有课程中获得相同的成绩。将成绩放在 Course 课程中,可以让所有参加同一课程的学生获得相同的成绩。"

在我的情况下,为什么每项考试都不能简单地分配一个用户。确实,正如我朋友所说,这似乎意味着考试或考试。我无法通过明确的解释来证明这一点。那么我该如何处理拥有自己的分数和响应的类别呢?

谢谢!

【问题讨论】:

  • 所有 M:N 关系都必须有一个关联类,比如关系数据库中需要连接表吗?我不明白为什么用户不能从列表中选择考试,然后在考试屏幕上显示总分和每个类别的分数。分数最初是 0 或 NULL 现在它有一个值。为什么不呢?

标签: associations uml class-diagram ooad


【解决方案1】:

以下模型包括您的所有实体类型(类别除外)。请注意,虽然测试(作为Test 的实例)是事件类型,但测试执行(作为TestExecution 的实例)是特定的 >事件(有发生时间)。这是一个通用的建模模式,事件有对象的参与,例如一个人参与测试执行。这样的参与也是一个事件。

由于参与也可以被视为事件及其参与者之间的链接(关系),我们可以模拟一个关联 Participation

在参加测试的情况下,我们希望记录参与者取得的成绩。为此,关联类的 UML 概念就派上用场了。它允许为关联定义属性(和其他类特征),并使用可视化符号清楚地指示其作为关联的性质,如下面的类图所示:

请注意,由于默认情况下关联端是唯一的,因此该模型意味着同一个人最多可以有一个特定测试执行的参与链接,这实际上是参与测试执行的一个约束。如果我们不将Participation 建模为关联类,而是将其建模为类,如下面的模型,我们必须明确地表达这个约束:

进一步说明

根据要求,以下是关于信息建模的基本类别的一些附加说明:entities,包含 objectsevents,以及 实体类型

在本体论中,这是对存在的哲学研究,有以下基本区别:

  1. 存在实体(也称为个体)和实体类型(在哲学中称为“普遍”);
  2. 实体分为三个基本类别:
    1. 对象(在哲学中称为“持久者”),
    2. 比喻,是依赖于存在的实体(例如品质、性格和物质关系),以及
    3. 事件(在哲学中称为“perdurants”)。

在 (Guizzardi and Guarino 2015) 和 (Guizzardi et al. 2013) 中讨论了这些本体论区别。

显然,对象和事件是建模信息系统和信息管理应用程序的最基本类别。

UML 链接(理解为物质关系)基于事件。例如,两个人之间的已婚联系是基于他们的婚姻(或婚礼)事件。链接基于事件这一事实意味着关联(作为链接类型)基于事件类型,并且将某些概念建模为事件类型或关联存在一定的歧义。

对象参与事件。事件是本体论上的依赖实体,因为它们在存在上依赖于它们的参与者才能存在。以凯撒被布鲁图斯刺伤的事件为例。在这次活动中,我们有凯撒本人、布鲁图斯和匕首的参与。

对象和事件之间存在一种有趣且基本的二元性:对象的所有时间属性都是根据它们参与的事件来定义的,而事件的所有空间属性都是根据参与者的空间属性来定义的.

在第一步中对所有相关对象类型进行建模后,我们在第二步中对相关事件类型进行建模。事件和对象之间的主要关联类型是参与。在我们的(概念)信息模型中向对象类型添加事件类型时,我们也因此对它们之间的参与类型进行建模。

【讨论】:

  • “事件有对象参与的一般建模模式,例如人参与测试(执行)。”这是非常有趣和有见地的。您能否向我提供有关此模式的更多信息。此外,有关如何识别事件的信息或文章也会很好。事件对我来说仍然是一个很大的迷雾。谢谢!
  • 我喜欢这个设计。再次,它非常有见地。你能多解释一下参与的作用吗?例如,TestExecution 可以有多个参与是什么意思?还是一个人多次参与?再次感谢。
  • 我已经添加了进一步的解释和指向我的答案的链接。 TestExecution 是在特定日期进行的特定测试/考试,由于参加考试的人很多,因此有许多参与事件,每个事件都与特定测试和特定人员相关联。一个人可能有很多次参与,但每次都参与不同的测试。
  • 在了解了关联类的UML2语义之后,我现在觉得它们很有用,并且改变了我的模型并添加了一些关于关联类使用的解释。我希望这也能帮助您克服关联类的困惑。
【解决方案2】:

Examination 类将关联StudentExamStudent 是一个实体,并且(希望)独立生活。 Exam 也是一个单独的实体(它是所有相互关联的问题和答案)。现在Examination 进来并关联了两者。因为Student 可以有很多Exams,反之亦然,你需要一些东西来耦合两者。

现在,您是否参加简单课程或关联课程(在我看来)更多的是品味问题。您将使用一个简单的关联,例如 如果你只是组合两个对象并添加一些属性(如scorecompletionDate)。

关联类的使用 如果您还添加了可增强 StudentExam 之间关联的操作(例如,提供一组具有特定成绩的学生),则应该使用它。

但是,我想说这两种表示法是可以互换的。

关于问题/答案,我只需添加一个问题/答案类并进行由它们组成的考试:

虽然这很简单,但我会从这里开始详细介绍。

【讨论】:

  • 感谢您回答我的问题。我知道关联以及关联类的形成方式和原因。我不确定为什么我需要一个关联类。如果我不使用关联类会发生什么。我正在尝试探索拥有一个关联类的理由。我希望你能关注我。上面的粗体文本试图解释没有关联类会发生什么,但它确实做到了没有详细说明满意,所以我可以检查优点和缺点。谢谢!
  • 我试图解决这个问题。如果这不能说清楚,我无能为力。
  • 谢谢!我会考虑更多。
  • @gwag 是的。谢谢你指点我。问题。我会纠正的。关于“品味”:如果您有 A 1-* C *-1 B 关系,则两种表示都是可交换的。 assoc.-class 符号只是一个捷径。
  • 请注意我的答案中修改后的模型,它现在使用关联类。我还解释了Participation(或模型中的Examination)是普通类的模型变体,需要有一个额外的约束来防止重复参与/检查,这在关联类变体中被阻止,因为关联结束是默认情况下是唯一的。因此,如果您将此约束添加到您的第一个模型,则您的两个变体只能交换。
【解决方案3】:

为什么 Exam 不能存储分数和完成日期?

你是对的。 “数学/代数第二学期考试”可以有几个考试,如果我们把考试当作完成课程,考试作为完成的尝试。但是在这里,由于您在考试中提出了问题,因此日期和时间也属于它。你的考试已经是考试了。

毫无疑问,通过将大类划分为更小更方便的类,可以大大改进您的模型。但是你的模型也可以工作。

【讨论】:

  • "但是这里,既然你已经在考试中放了题,日期和时间也属于它。你的考试已经是考试了。"你能进一步解释一下吗?我想过这个,但我不是很清楚。我想知道只是编码是否会让设计变得更清晰。现在对于像我这样的新手来说它可能太抽象了。虽然我不确定它是否完全像考试,因为它确实有一个名字并且它可以考试是时间的一个例子。(我认为)
  • “毫无疑问,你的模型可以通过将你的大类分成更小更方便的类来大大改进。但你的模型也可以工作。”你可以把它分成哪些小班?我从我的用例图和序列图对此进行了建模。我确实看到 gwag 如何能够看到并提取更多课程,但他的知识是由于我目前不知道的一种模式的知识。再次感谢
  • @JacobPressures 我认为 gwag 模型可能是一个不错的开始。我看到的唯一错误是 TestExecution 和 Participation 实际上是 1:1,我认为没有必要将它们分开。第二个 - 您的源模型中有类别,但它们不在这里......除了“分析和分离”原则之外,没有使用任何模式。但正如我所说,你的模型是一个有效的模型。尝试对其进行编码,然后进行一些改进 - 你会发现需要将大类划分为小类。
猜你喜欢
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
相关资源
最近更新 更多