代码之家  ›  专栏  ›  技术社区  ›  Nagaraj Tantri

聚合上泛化的用法

  •  4
  • Nagaraj Tantri  · 技术社区  · 14 年前

    我有一个班级模式,银行是一个班级,现在是计算机银行网络。这必须有ATM(自动取款机)和人工出纳。

    我使用了泛化,并且参加了一个叫做 会计人员 继承的 银行 班级。这个 会计人员 进一步拥有 自动取款机 人性化出纳 加在一起。

    现在问题是,我的朋友说我把整件事都搞错了。据他说 会计人员 必须聚合到 银行 自动取款机 人性化出纳 必须继承 会计人员 .

    我有点困惑。我怎么能做模型呢!!还是这两种方法都正确?

    4 回复  |  直到 14 年前
        1
  •  5
  •   Community Rick James    7 年前

    我会回到基础上来。

    你应该问问自己 ATM 是一个 AccountHandler ,或者如果 会计人员 有一个 自动取款机 . 对于使用继承或组合的问题,应该给出一个一般性的答案。

    两者都将是 对的 . 只有一个是 好的设计 这取决于您的应用程序试图做什么。

    一般来说,有一条经验法则(从有效Java中获取)表明,你应该偏爱合成而不是继承。用一粒盐就可以了,确保你的应用程序设计正确。(有关更多信息,请参阅 Prefer composition over inheritance? )

        2
  •  5
  •   M4N    14 年前

    通常,继承(或专门化)用于建模 IS-A 关系,而聚合/组合用于 HAS-A “关系”。

    现在你可以问自己哪一个是正确的:

    • 帐户管理员是银行 银行有一个或多个帐户处理程序
    • 人力出纳是一种(特殊的)账户处理人。 账户管理员有人出纳

    在我看来,大胆的说法是正确的。因此,您应该对银行账户处理程序使用聚合或组合,对账户处理程序使用继承,对人工出纳使用继承。

        3
  •  1
  •   James    14 年前

    如果它起作用的话,是正确的。不要被UML建模的浪费时间所困扰。写一个原型,任何设计缺陷很快就会显现出来。

        4
  •  0
  •   Unmesh Kondolikar    14 年前

    请与您的领域专家交谈,并从他们那里验证模型。我认为这是领域驱动设计的前几章的帮助。您应该尝试定义实体及其关系(有或是有),将它们画在白板上,并与您的领域专家讨论。

    不管你做什么 请围绕您的实现编写单元测试 . 因为有了这样的混乱,您可能会修改类结构,这时您的单元测试将确保您可以顺利地重新考虑代码。