Language agnostic 恰当的面向对象通信建模

Language agnostic 恰当的面向对象通信建模,language-agnostic,oop,smalltalk,Language Agnostic,Oop,Smalltalk,在我的编程中不断出现一些东西,从某种角度来看,这两件事是相同的,但又不同于另一件。例如,假设您构建了一个铁路车站的图形,通过火车连接,那么Vertex和RailStation的类有时是相同的,有时不是 想象一下,我有一个图表,非常代表火车站和火车。然后我把这个图交给另一个对象,它删除了一些顶点,然后我希望相应的火车站消失 我不想让火车站成为顶点的“属性”,它们不是。此外,问题是对称的:如果我擦除一个铁路站,我希望相应的顶点消失。建模或通信的正确OO方式是什么。如果最终总体使用简单易行,我愿意通过

在我的编程中不断出现一些东西,从某种角度来看,这两件事是相同的,但又不同于另一件。例如,假设您构建了一个铁路车站的图形,通过火车连接,那么Vertex和RailStation的类有时是相同的,有时不是

想象一下,我有一个图表,非常代表火车站和火车。然后我把这个图交给另一个对象,它删除了一些顶点,然后我希望相应的火车站消失

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

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

更新: 嗯,火车站不是顶点!是吗

< >好,让我们考虑答案中的真实代码。让我来模拟一个有孩子的人。这是最简单的事,对吗?孩子们也应该认识他们的父母,所以我们就像一棵双树。为了更容易地将父对象从子对象中分离,我将父对象和子对象之间的链接建模为一种关系,并使用属性parent和child

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

removeChild: aChild
    (parent relationshipWith: aChild) disband.
因此,父母有关系的集合,而不是孩子的集合。但每种关系都对应一个孩子。现在我想做这样的事情:

parent children removeAllSuchThat: [:e | e age < 12]
父母子女删除以下所有内容:[:e | e年龄<12]
这将删除关系和子对象


在这里,关系和孩子在某种意义上是对应的。那么,我现在该怎么办?别误会我的意思,我完全知道我可以在不引入关系类的情况下解决这个问题。但事实上,父母和孩子确实有着共同的关系,所以为什么不建立这种关系的模型,并用它来帮助不那么迫切地取消双链接呢?

在你的问题领域,站点不是一种顶点吗?在这种情况下,为什么不从顶点导出桩号

注意短语“在你的问题领域”的用法。您的问题似乎与图形中显示的用作火车站有关。是的,在这个领域,站是顶点。如果这是一个不同的问题领域,比如一个关于火车站建筑的数据库,它们很可能不是。大多数现代语言都支持一些名称空间的概念,允许您在不同的域中使用相同名称的不同类型的实体


关于你的父母/孩子问题,你又一次太笼统了。如果我对数学表达式和子表达式进行建模,如果我删除父表达式,我希望删除并删除/释放所有子表达式。OTOH,ff我在模拟英国人口中的法律责任关系,然后当责任isis解除时(比如因为离婚),我只想解除关系,而不是删除/释放孩子,因为孩子有自己独立的存在。

似乎你只是想让RailStation从Vertex继承(is-a关系)。在继承上看这个。这样,如果你有一个铁路车站图,一个用于处理(一般)顶点图的对象自然会处理正确的事情


如果此方法不起作用,请更具体一些(最好使用真实代码)。

根据您对问题的描述,桩号与顶点之间存在一对一的对应关系,删除桩号应自动删除相应的顶点(反之亦然)。您还提到了建筑“一个由火车连接的火车站图”,你显然是指一个火车站是顶点而火车是边的图

那么,站以什么方式不是顶点呢?如果站除了作为顶点之外不存在,如果顶点除了作为站之外不存在,那么将它们保持为两个不同但链接的实体有什么好处


据我所知,站点是顶点,继承是建模的方法。

拥有关系对象是个好主意

我认为这里的恰当问题是“应该利用它的哪些用途?”

可能父类和子类扩展了同一个人超类,因此它们有一些共同的属性,例如年龄

在我的想法中,我可以看到以下几点:父对象和子对象必须相互了解,因此两个类必须保持指向相同关系的链接。 Relationship对象在单个父对象和一定数量的子对象之间保持一对多关系,并且它将保持对每个Person对象的引用

通过这种方式,您可以在Relationshp对象中实现整个解散逻辑,可以根据您的需要进行更多或更少的复杂操作。您可以查询Relationship对象以了解家庭中哪些成员符合您的要求来执行某些操作。您可以使关系解散(并销毁)安全地说,因为它将了解所有成员,并要求他们打破引用,然后它将准备销毁,或要求某些成员离开家庭,保持关系对象的活力

但这还不是全部。关系应该是一个超类,由层次关系和对等关系(或朋友关系)扩展

这种专门化使您可以让父(s)和子(ren)以完全遍历的方式在其他层次结构之间链接

这背后的真正概念是,您的关系对象是以可伸缩和结构化的方式查询和组织所有Person对象(或Vertex对象)的关键,因此