Class 在类之间有多个关联是错误的吗?

Class 在类之间有多个关联是错误的吗?,class,oop,language-agnostic,dependencies,model-associations,Class,Oop,Language Agnostic,Dependencies,Model Associations,我正在模拟一个大学过程,其中我有三个班:学生,学科和学位 学位有自己的科目,学生有自己通过的科目列表,学生也应该属于单一的学位计划 从编程的角度来看,我应该如何将学生与其学位联系起来?我是否应该将度作为其对象的引用传递,是否应该将ID设置为度?有更好的选择吗 从编程的角度来看,我应该如何将学生与 他/她的学位?我是否应该通过学位作为其目标的参考, 我应该将ID设置为度吗?有更好的选择吗 我认为这一切都是毫无意义的 ID、索引、指针/引用——通常都是一样的:资源的轻量级句柄 一件可能相关的事情是这

我正在模拟一个大学过程,其中我有三个班:学生学科学位

学位有自己的科目,学生有自己通过的科目列表,学生也应该属于单一的学位计划

从编程的角度来看,我应该如何将学生与其学位联系起来?我是否应该将度作为其对象的引用传递,是否应该将ID设置为度?有更好的选择吗

从编程的角度来看,我应该如何将学生与 他/她的学位?我是否应该通过学位作为其目标的参考, 我应该将ID设置为度吗?有更好的选择吗

我认为这一切都是毫无意义的

ID、索引、指针/引用——通常都是一样的:资源的轻量级句柄

一件可能相关的事情是这些句柄是否不透明。例如,ID或索引绝对是不透明的。您不能直接使用它们做任何事情,除非将它们传递给另一个接口,该接口可以执行某些操作。如果您的目标是隐藏信息和解耦实体,那么这可能是一个好处,尽管指针/引用也可能是不透明的(取决于语言)。指针/引用也可能以ID和索引所没有的方式失效,但仅在C/C++之类的低级语言中如此

值得注意的是,让您的外向依赖项从更容易更改的代码流向更难更改的代码是有益的。这是因为如果您需要对接口进行突破性的更改,那么具有易于适应的传入依赖项意味着进行更改的成本很低。相反,如果传入的依赖项同样很难更改(例如:响应接口更改比接口更改本身更难适应),那么您将看到一个非常不愉快的场景

当然,另外,您希望依赖关系流向稳定的接口。如果您非常确定一个接口不需要更改,那么您可以更自信地拥有许多/复杂的传出依赖项。稳定性和易更改性因素都值得考虑

因此,例如,如果
学生
很难改变和/或在界面方面还不是很稳定,而
学位
也是如此,那么您可能不想将两者直接耦合到另一个。相反,您可能需要引入一个比两者都简单的实体,这两个实体都依赖于这两个变量,因此,如果改变了一个,则只需在中间响应这个简单的对象。这个对象甚至可以将从学生到学位的关联变成一个外部关联,这样您的学生甚至不必存储任何东西

我建议与其说是类之间的多重关联,不如说是你希望依赖关系如何流动,你希望它们从容易改变到难以改变,从不稳定到稳定。使代码库更容易更改/维护的不是最漂亮的图形,而是连接的性质。一件简单的事情依赖于三件复杂的事情可能比三件复杂的事情相互依赖要好

我不太确定性能是否是您问题的一部分,或者仅仅是设计/可维护性


如果涉及性能,那么您自然不希望复制任何昂贵的数据。然而,上面描述的这些轻量级句柄都不能做到这一点,因为它们不涉及任何深度副本。尽管如此,如果一个
学位
存储了一些状态,使得每个学生不可避免地不同(这意味着我们需要尽可能多的实例),但是有一些庞大的部分不是每个学生唯一的,那么我们可能想将其分为两个独立的实体,每个学生的学位与其他人共享公共数据,以避免重复。也就是说,除非您有充分的理由进行复制,如空间局部性或并发性。

您应该使用代理,该代理基本上保留student对象上的学位ID,并在Demand上构建学位对象。我同意rodrigo的学位。创建一个包含学生Id、学位Id及其自身Id的中间对象。对于学生科目对象,我将使用新的学生学位中间对象,并创建另一个包含科目Id和学生学位Id的中间对象-如上所述,如果我没有误解你的话,那么每个学生的学位都可以有自己的一套学科,而不是一个学位有一套学科。这个问题征求意见。它并不完全适合堆栈溢出。