Oop 理论上不一致的多个聚合是否可以接受?
我有一个关于类的建模和底层数据库设计的问题 简而言之,情况如下:目前我们有头寸和账户对象和表格,它们之间的关系是一个头寸“有一个”账户(一个账户可以有多个头寸)。这是一个简单的聚合,在DB中由保存帐户ID作为外键的位置表处理 我们现在需要通过交易和投资组合来扩展这种“向下”。一项或多项交易构成头寸(但交易本身不是头寸),一项或多项投资组合构成账户(但投资组合本身不是账户)。交易与投资组合相关联,就像头寸与账户(“有a”)相关联一样。请注意,仍然可以有一个没有交易的头寸和一个没有投资组合的账户(即,不强制要求将所有现有对象分解为子组件) 我的第一个想法是简单地实现以下目标(前两个类已经存在): 我认为(潜在的)问题很明显:从交易开始,你可能会进入不同的账户,这取决于你是采取持仓路线还是投资组合路线。当然,这是不应该发生的,创建和存储对象的代码也不应该产生这样的不一致性。我想知道,理论上可能存在不一致的数据库这一事实是否意味着设计有缺陷Oop 理论上不一致的多个聚合是否可以接受?,oop,data-modeling,Oop,Data Modeling,我有一个关于类的建模和底层数据库设计的问题 简而言之,情况如下:目前我们有头寸和账户对象和表格,它们之间的关系是一个头寸“有一个”账户(一个账户可以有多个头寸)。这是一个简单的聚合,在DB中由保存帐户ID作为外键的位置表处理 我们现在需要通过交易和投资组合来扩展这种“向下”。一项或多项交易构成头寸(但交易本身不是头寸),一项或多项投资组合构成账户(但投资组合本身不是账户)。交易与投资组合相关联,就像头寸与账户(“有a”)相关联一样。请注意,仍然可以有一个没有交易的头寸和一个没有投资组合的账户(即
期待您的反馈。设计没有缺陷,只是因为从A类到D类有两种方式,一种是B类,另一种是C类。这种“正方形”经常出现在OOP类模型中,有时并不明显,特别是如果路径中有更多类的话。但正如Dan提到的,业务语义总是决定这样一个正方形是否必须通勤(在数学意义上) 就我个人而言,我在UML图中这样一个正方形内画了一个
=
符号,表示它必须通勤。我还注意到UML注释中的精确公式,在我的示例中是
对于类a
的每个对象a
:a.B.D=a.C.D
如果这样的谓词成立,那么您基本上有两种选择:
- 相信所有程序员在任何代码中都不会违反规则,因为它有很好的文档记录
- 实现一些错误处理(如Dan和algirdas提到的),或者,如果您不想在您的模型中包含此类代码,请创建一个Checker控制器,它检查给定模型实例中的所有条件
class Account;
class Position {
Account account;
}
class Portfolio {
Account account;
}
class Trade {
Position position;
Portfolio portfolio;
}