我目前正在攻读计算机工程,我记得一位名为“信息系统简介”的班级教授说,以1:1基数相关的两个班级没有意义。
例如:我有Client
类和Telephone
类。让我们说客户端只能有一部手机。教授说创建Telephone class
没有意义,电话应该是Client
类的属性。我绝对同意他的观点。
但是现在我正在参加软件工程课,而教授(不一样)没有就这个问题发表任何评论,现在我对此感到困惑。
什么是正确的方法?
答案 0 :(得分:3)
我会说你的信息系统导论教授是正确的。而你的SE教授也是如此(假设他缺乏评论使他成为逆势)。根据您的要求和您正在使用的域名,它们都是正确的。但是没有任何其他细节,很难为你建模,我会倾向于你的CE教授所说的。记住你学到的所有有趣的小原则:KISS,DRY等,并将它们应用到你的问题中。
如果Client
永远不会有多个电话号码,并且您域中没有其他实体需要电话号码,则无需单独的Telephone
课程。在现实世界中,如果您的要求含糊不清,请从您的客户那里了解更多信息。
如果有人在路上决定Client
可能会占用多个电话号码,或者您的域中引入了需要电话号码的其他实体,则这是一个相当容易实现的重构。
因此,考虑到这一点,我们假设您的Client
有一个单独的Address
类,其中包含电话号码。也许Address
类会被另一个类重用,可能是Invoice
或Shipment
,其中Address
可以在这两种情况下共享或应用。在此示例中,您可能希望Address
(Telephone
)成为自己的类。
在您的示例中,Telephone
可能有点过于做作。如果它有许多属性(AreaCode
,InternationalPrefix
,Number
等),你希望它是一个单独的类重用,但如果只有Client
需要一个名为Telephone
的字符串值,用户只是为了参考而输入,然后它可能没有意义成为它自己的类。
答案 1 :(得分:2)
如果您希望重新使用Telephone
类,将其作为Client
类的一部分将不会非常有用。这将是一个非常好的理由。如果你将它保留在Client
类中,它意味着它本质上是Client
的一部分,即使你在其他地方使用它,我怀疑你的意思。
有时候,将具有1:1关系的2个实体建模为单独的类是有意义的。也许您有一个Client
,而且您还有ClientBilling
。您不希望所有程序员都能访问ClientBilling
,因此您可以将其移动到自己的类中,可以单独控制它。
也许你的结构很庞大,通常不需要运送整个东西。通过将其分解为功能块,您可以将数据大小减小到仅为特定功能所需的大小。
也许1:1不一定是数据固有的,合理的猜测是它并不总是这样。我认为巡回Telephone
示例属于此类别。
答案 2 :(得分:0)
我会说1:1关系(两端都是强制性的)是可疑的,应该仔细考虑以确保它们是必需的。通常,它是图表灵活性和简单性之间的权衡(灵活性,因为如果你保持这两个类不必保持一个类而不是两个类的简单性,将来更容易更改图表并使其适应新的要求)