【问题标题】:Does it make sense to have two classes related by a 1:1 cardinality?以 1:1 的基数关联两个类是否有意义?
【发布时间】:2011-11-23 00:59:11
【问题描述】:
我目前正在攻读计算机工程,我记得一个名为“信息系统概论”的课程的教授说,以 1:1 的基数相关的两个课程没有意义。
例如:我有Client 类和Telephone 类。假设客户只能拥有一部手机。教授说创建Telephone class 没有意义,电话应该是Client 类的属性。我完全同意他的看法。
但是现在我正在上软件工程课程,而教授(不一样)没有对这个问题做出任何贡献,现在我对此感到非常困惑。
正确的做法是什么?
【问题讨论】:
标签:
class
uml
class-diagram
【解决方案1】:
我会说您的信息系统导论教授是正确的。还有你的 SE 教授(假设他缺乏 cmets 使他成为逆势者)。根据您的要求和您正在使用的域,它们都是正确的。但是没有任何其他细节,很难为你建模,我倾向于你的 CE 教授所说的。记住您学到的所有有趣的小原则:KISS、DRY 等,并将它们应用于您的问题。
如果Client 永远不可能有多个电话号码,并且您的域中没有其他实体需要电话号码,则不需要单独的Telephone 类。在现实世界中,如果您的要求含糊不清,请从您的客户那里了解更多信息。
如果有人决定 Clients 可以使用多个电话号码,或者将另一个实体引入您的域中需要一个电话号码,这是一个相当容易完成的重构。
因此,考虑到这一点,假设您的 Client 有一个单独的 Address 类,其中包含电话号码。也许Address 类被另一个类重用,可能是Invoice 或Shipment,其中Address 可以在这两种情况下共享或应用。在此示例中,您可能希望 Address (Telephone) 成为它自己的类。
在您的示例中,Telephone 可能有点过于做作。如果它有许多属性(AreaCode、InternationalPrefix、Number 等),你会希望它成为一个单独的类以供重用,但如果 Client 只需要一个名为 @987654337 的字符串值@ 用户输入只是为了参考,那么作为自己的类可能没有意义。
【解决方案2】:
如果您希望重新使用Telephone 类,将它作为Client 类的一部分将不是很有用。这将是一个非常好的理由。如果您将其留在 Client 类中,则意味着它本质上是 Client 的一部分,即使您在其他地方使用它也是如此,我怀疑您不会是这个意思。
但有时,将具有 1:1 关系的 2 个实体建模为单独的类是有意义的。也许你有一个Client,你也有ClientBilling。您不希望所有程序员都可以访问ClientBilling,因此您将其移至可以单独控制的自己的类中。
也许你的结构很大,通常不需要运送整个东西。通过将其分解为功能块,您可以将数据的大小减少到仅用于特定功能所需的大小。
也许 1:1 不一定是数据所固有的,一个合理的猜测是它不会总是这样。 Tour Telephone 的例子我认为属于这一类。
【解决方案3】:
我想说 1:1 的关系(两端都是强制性的)是可疑的,应该仔细考虑以确保它们是必要的。通常这是图表的灵活性和简单性之间的权衡(灵活性,因为如果您保留两个类而不是维护一个类而不是两个类的简单性,那么将来更改图表并使其适应新要求会更容易)