在我的编程中不断出现一些东西,那就是从某些角度来看,两件事是相同的,但从另一个角度来看是不同的。就像,假设您构建了一个由火车连接的火车站图,那么 Vertex 和 RailStation 类有时是相同的,有时则不是。
所以,想象一下我有一个非常代表火车站和火车的图表。然后我将此图交给另一个对象,该对象删除了一些顶点,然后我希望相应的火车站消失。
我不想让火车站成为顶点的“属性”,他们不是。此外,问题是对称的:如果我删除一个火车站,我希望相应的顶点消失。什么是建模或对应的正确OO方式。如果最终整体使用简单易行,我愿意通过编写一些支持方法或类来多走几英里。
我目前正在使用 Smalltalk 编程语言,但我认为这个问题并不是 smalltalk 特定的。我之所以提到它,是因为在 Smalltalk 中,您可以做一些很酷的技巧,例如检查调用堆栈,这在这种情况下可能会有所帮助。
更新:嗯,RailStations 不是顶点!他们是吗?
好的,让我们按照答案的要求考虑真实的代码。让我模拟一个有孩子的人。这是最简单的事情,对吧?孩子也应该知道他们的父母,所以我们就像一棵双环树。为了更容易从孩子中解散父母,我将父母和孩子之间的联系建模为关系,具有父母和孩子的属性。
所以,我可以实现 parent>>removeChild: 也许像这样
removeChild: aChild
(parent relationshipWith: aChild) disband.
因此,父母有一系列关系,而不是孩子。但每一种关系都对应一个孩子。现在我想做这样的事情:
parent children removeAllSuchThat: [:e | e age < 12]
这应该删除关系和孩子。
在这里,关系和孩子在某种意义上是对应的。那么,我现在该怎么办?不要误会我的意思,我完全知道我可以在不引入关系类的情况下解决问题。但事实上,父母和孩子确实有共同的关系,那么为什么不建模并使用它来帮助解散双链接呢?