有两个与1:1基数相关的课程是否有意义?

时间:2011-11-23 00:59:11

标签: class uml class-diagram

我目前正在攻读计算机工程,我记得一位名为“信息系统简介”的班级教授说,以1:1基数相关的两个班级没有意义。

例如:我有Client类和Telephone类。让我们说客户端只能有一部手机。教授说创建Telephone class没有意义,电话应该是Client类的属性。我绝对同意他的观点。

但是现在我正在参加软件工程课,而教授(不一样)没有就这个问题发表任何评论,现在我对此感到困惑。

什么是正确的方法?

3 个答案:

答案 0 :(得分:3)

我会说你的信息系统导论教授是正确的。而你的SE教授也是如此(假设他缺乏评论使他成为逆势)。根据您的要求和您正在使用的域名,它们都是正确的。但是没有任何其他细节,很难为你建模,我会倾向于你的CE教授所说的。记住你学到的所有有趣的小原则:KISS,DRY等,并将它们应用到你的问题中。

如果Client永远不会有多个电话号码,并且您域中没有其他实体需要电话号码,则无需单独的Telephone课程。在现实世界中,如果您的要求含糊不清,请从您的客户那里了解更多信息。

如果有人在路上决定Client可能会占用多个电话号码,或者您的域中引入了需要电话号码的其他实体,则这是一个相当容易实现的重构。

因此,考虑到这一点,我们假设您的Client有一个单独的Address类,其中包含电话号码。也许Address类会被另一个类重用,可能是InvoiceShipment,其中Address可以在这两种情况下共享或应用。在此示例中,您可能希望AddressTelephone)成为自己的类。

在您的示例中,Telephone可能有点过于做作。如果它有许多属性(AreaCodeInternationalPrefixNumber等),你希望它是一个单独的类重用,但如果只有Client需要一个名为Telephone的字符串值,用户只是为了参考而输入,然后它可能没有意义成为它自己的类。

答案 1 :(得分:2)

如果您希望重新使用Telephone类,将其作为Client类的一部分将不会非常有用。这将是一个非常好的理由。如果你将它保留在Client类中,它意味着它本质上是Client的一部分,即使你在其他地方使用它,我怀疑你的意思。

有时候,将具有1:1关系的2个实体建模为单独的类是有意义的。也许您有一个Client,而且您还有ClientBilling。您不希望所有程序员都能访问ClientBilling,因此您可以将其移动到自己的类中,可以单独控制它。

也许你的结构很庞大,通常不需要运送整个东西。通过将其分解为功能块,您可以将数据大小减小到仅为特定功能所需的大小。

也许1:1不一定是数据固有的,合理的猜测是它并不总是这样。我认为巡回Telephone示例属于此类别。

答案 2 :(得分:0)

我会说1:1关系(两端都是强制性的)是可疑的,应该仔细考虑以确保它们是必需的。通常,它是图表灵活性和简单性之间的权衡(灵活性,因为如果你保持这两个类不必保持一个类而不是两个类的简单性,将来更容易更改图表并使其适应新的要求)