一个用户故事:
我们应用程序的用户创建了公路旅行。Aroadtrip
是一系列有趣的目的地。每个destination
人都有一些关于在那里看到的活动或景点的细节。通过这种方式,我们的用户定义了两次公路旅行,其中每次旅行都有一些独特的目的地和一些共同的目的地——例如,两次旅行都包括史密森尼博物馆。该应用程序在内存中维护所有更新,并且仅在用户单击保存时才提交到数据库。用户主动更新两个行程,可以随意切换。在我们的应用程序中,我们正在处理史密森尼目的地,但有时我们需要向上导航我们的对象层次结构,从目的地到其包含的公路旅行。问题是目的地参加了两次公路旅行。
RoadTrip1
|
+-Destination1
+-Destination2
+-Destination3
+-Smithsonian (A) //Navigate up to RoadTrip1
RoadTrip2
|
+-Destination4
+-Smithsonian (B) //Navigate up to RoadTrip2
+-Destination5
我们可以使用什么好的设计模式或数据结构来允许向后导航,同时确保我们只有一个目标对象的副本?
要求:
- 您的模型涉及多对多关系。
- 在内存中仅表示所有模型一次(身份映射)。
- 您的数据结构应该易于导航。您不仅可以从父级导航到子级,还可以从子级导航回到最初获取子级的父级。
- 我想避免向数据模型引入额外的模式。
到目前为止,我最好的想法是用上下文对象包装每个目标对象(类似于链表包装节点的方式)。上下文对象将维护一个指向最初从中获取它的父对象的指针。我们将始终通过其包装器处理每个目的地。我相信这将是代理模式或装饰器模式(我倾向于代理)。(这与 jQuery 对象包含许多元素并且多个 jQuery 对象共享对相同元素的引用的方式本质上不是相同的想法吗?)
我考虑维护一个“当前公路旅行”上下文变量,并将其用于从目的地导航到其包含的公路旅行。这不如实际的“获取上下文”可靠。事实上,这是一种完全不同的策略,我不确定我是否喜欢它。
我记得 ActiveRecord 也有同样的问题(尽管我已经有一段时间没有使用它了)。在 AR 中,如果我从 RoadTrip1 开始,然后获取它的目的地,我就不能很好地从目的地导航到公路旅行(通过某种获取上下文)。相反,我会考虑父母双方(公路旅行),并且没有迹象表明我是如何到达那里的。对?
其他人之前是否遇到过这个问题 - 也就是说,想要向后导航,而向后导航被许多父母混淆了?你有没有问过“我是从哪个家长那里来的?” 你是怎么回答的?