gpt4 book ai didi

language-agnostic - 对应的正确 OO 建模

转载 作者:行者123 更新时间:2023-12-04 08:36:53 24 4
gpt4 key购买 nike

在我的编程中不断出现一些东西,那就是从某些角度来看,两件事是相同的,但从另一个角度来看是不同的。就像,假设您构建了一个由火车连接的火车站图,那么 Vertex 和 RailStation 类有时是相同的,有时则不是。

所以,假设我有一个非常代表火车站和火车的图表。然后我将此图交给另一个对象,该对象删除了一些顶点,然后我希望相应的火车站消失。

我不想让火车站成为顶点的“属性”,事实并非如此。此外,问题是对称的:如果我删除一个火车站,我希望相应的顶点消失。什么是建模或对应的正确OO方式。如果最终整体使用简单易行,我愿意通过编写一些支持方法或类来多走几英里。

我目前正在使用 Smalltalk 编程语言,但我认为这个问题并不是 smalltalk 特定的。我之所以提到它,是因为在 Smalltalk 中,您可以做一些很酷的技巧,例如检查调用堆栈,这在这种情况下可能会有所帮助。

更新:好吧,RailStations 不是顶点!是吗?

好的,让我们按照答案中的要求考虑实际代码。让我模拟一个有 child 的人。这是最简单的事情,对吧? child 也应该知道他们的 parent ,所以我们就像一棵双环树。为了更容易从 child 中解散 parent ,我将 parent 和 child 之间的联系建模为关系,具有 parent 和 child 的属性。

所以,我可以实现 parent>>removeChild: 也许像这样

removeChild: aChild
(parent relationshipWith: aChild) disband.

所以, parent 有一系列关系,而不是 child 。但是每个关系对应一个 child 。现在我想做这样的事情:

parent children removeAllSuchThat: [:e | e age < 12]

这应该删除关系 child 。

在这里,关系和 child 在某种意义上是对应的。那么,我现在该怎么办?不要误会我的意思,我完全知道我可以在不引入关系类的情况下解决问题。但事实上, parent 和 child 确实有共同的关系,那么为什么不对其进行建模并使用它来帮助解散双链接呢?

最佳答案

在您的问题域中,站不是一种顶点吗?在这种情况下,为什么不从 Vertex 派生 Station?

请注意“在您的问题域中”这一短语的使用。您的问题似乎与图表中出现的火车站有关。所以是的,在那个领域,站是顶点。如果它是一个不同的问题域,比如火车站架构的数据库,它们很可能不是。大多数现代语言都支持一些命名空间的概念,以允许您在不同的域中拥有具有相同名称的不同类型的实体。

关于您的 parent / child 问题,您再次过于笼统。如果我正在对数学表达式和子表达式进行建模,如果我删除一个父项,我会想要删除并删除/释放所有子表达式。 OTOH,ff我在英国人口中模拟法律责任关系,然后当责任解除(比如因为离婚)时,我只想删除这种关系,而不是删除/释放有自己独立存在的 child .

关于language-agnostic - 对应的正确 OO 建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/896685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com