我有这个班级模型,银行是一个现在正在进入计算机化银行网络的班级。这必须有ATM(自动柜员机)和人员收银员。
我使用了Generalization并使用了一个名为 AccountHandlers 的类,它继承了 Bank 类。此 AccountHandlers 还汇总了 ATM 和 HumanCashier 。
现在问题是,我的朋友在争辩说我把整件事弄错了。据他说, AccountHandlers 必须汇总到银行, ATM 和 HumanCashier 必须继承 AccountHandlers < /强>
我对此感到有点困惑。我该如何塑造!!或者两种方法都正确吗?
答案 0 :(得分:5)
我会回到基础。
您应该问自己,ATM
是 AccountHandler
,还是AccountHandler
ATM
}。这应该给你一个关于使用继承或组合的问题的一般答案。
两者都是正确的。只有一个是好的设计,这取决于您的应用程序尝试做什么。
通常,有一条经验法则(取自Effective Java),表明你应该支持组合而不是继承。拿一粒盐,确保你正确地设计你的应用程序。 (有关详细信息,请参阅Prefer composition over inheritance?)
答案 1 :(得分:5)
通常,继承(或专业化)用于建模“ is-a ”关系,而聚合/组合用于“ has-a ”关系。< / p>
现在你可以问自己哪一个是正确的:
在我看来,大胆的陈述是正确的。因此,您应该使用聚合或组合作为银行&gt;帐户处理程序和继承帐户处理程序 - >人员收银员。
答案 2 :(得分:1)
如果有效则是正确的。不要陷入UML建模的浪费时间。写一个原型,任何设计缺陷很快就会显现出来。
答案 3 :(得分:0)
请与您的域专家联系,并从他们那里获得验证模型。我认为这是领域驱动设计的前几章有用的地方。您应该尝试定义实体及其关系(具有或是a),将它们绘制在白板上并与您的域专家讨论。
无论你做什么,请围绕您的实施编写单元测试。因为有了这样的混淆,你可能会修改类结构,那时你的单元测试将确保你可以顺利地重新分配代码。