聚合与组合 [已关闭]
我很难理解UML中组合和聚合之间的区别。有人可以给我一个很好的比较和对比吗?我也想学会在代码中识别它们之间的区别和/或看到一个简短的软件/代码示例。
编辑:我问这个问题的部分原因是因为我们在工作中正在做的反向文档活动。我们已经编写了代码,但我们需要返回并为代码创建类图。我们只想正确捕获关联。
我很难理解UML中组合和聚合之间的区别。有人可以给我一个很好的比较和对比吗?我也想学会在代码中识别它们之间的区别和/或看到一个简短的软件/代码示例。
编辑:我问这个问题的部分原因是因为我们在工作中正在做的反向文档活动。我们已经编写了代码,但我们需要返回并为代码创建类图。我们只想正确捕获关联。
根据经验:
class Person {
private Heart heart;
private List<Hand> hands;
}
class City {
private List<Tree> trees;
private List<Car> cars
}
在构图(人,心,手)中,“子对象”(心,手)将在人被摧毁后立即被摧毁。
在聚合(城市,树,汽车)中,当城市被摧毁时,“子对象”(树,汽车)不会被摧毁。
底线是,组合强调相互存在,并且在聚合中,此属性不是必需的。
聚合和组合之间的区别取决于上下文。
以另一个答案中提到的汽车为例 - 是的,汽车尾气确实可以“独立”站立,因此可能与汽车无关 - 但这取决于应用。如果您构建的应用程序实际上必须处理独立的汽车尾气(汽车商店管理应用程序?),那么聚合将是您的选择。但是,如果这是一个简单的赛车游戏,并且汽车尾气仅作为汽车的一部分 - 那么,构图会很好。
棋盘?同样的问题。棋子没有棋盘就不存在,只有在某些应用程序中。在其他情况下(如玩具制造商),棋子肯定不能组成棋盘。
当尝试将组合/聚合映射到您喜欢的编程语言时,情况会变得更糟。在某些语言中,这种差异可能更容易注意到(当事情很简单时,“通过引用”与“按价值”),但在其他语言中可能根本不存在。
最后一点建议?不要在这个问题上浪费太多时间。这是不值得的。这种区别在实践中几乎没有用处(即使你有一个完全清晰的“组合”,由于技术原因,你可能仍然希望将其实现为聚合 - 例如,缓存)。