【发布时间】:2012-10-12 11:02:08
【问题描述】:
假设我有 Bird 类和 BirdMorph 类。小鸟有一个位置,我希望 BirdMorphs 改变它们在屏幕上的位置,只要相应的小鸟改变它的位置。
将 Morph 连接到它应该在 Morphic 中可视化的对象的预期方式是什么?
【问题讨论】:
标签: smalltalk squeak pharo morphic
假设我有 Bird 类和 BirdMorph 类。小鸟有一个位置,我希望 BirdMorphs 改变它们在屏幕上的位置,只要相应的小鸟改变它的位置。
将 Morph 连接到它应该在 Morphic 中可视化的对象的预期方式是什么?
【问题讨论】:
标签: smalltalk squeak pharo morphic
通常,BirdMorph 会将 Bird 保存在实例变量中,并在其 step 方法中更新自己的位置。
这样想:每个对象都需要“固定”在某个地方。如果没有对它的引用,它会自动被垃圾收集。在 Morphic 中,该引用通常植根于 World,每个变形都通过其容器的 submorphs 集合进行引用。
因此,您的变形坚持“域模型”是有道理的。例如。你可能有一个对象 BirdSimulation 来保存所有的 Birds,以及屏幕上的一个窗口保存 BirdSimulation。然后当你关闭窗口时,模拟对象也会消失。
如果您的程序主要是可视化的,您甚至可能不需要单独的 Bird 类。相反,变形可能只是是“一只鸟”。这可以大大简化设计。
【讨论】:
恕我直言,您的第一个想法是正确的:MVC 是要走的路。 持有从 BirdMorph 对其 Bird 模型的引用似乎是最简单的方法,但使用 Observer pattern 您的 BirdMorph 是您的 Bird 的“观察者”:BirdMorph 在创建时将自己注册到 Bird 以收到通知每个事件。每当鸟移动时,它都会通知所有观察者他的移动。 因此,您可以为鸟设置多个观察者,例如,一个 Morph 用于显示(位置和其他),一个用于记录(例如,网络对等方)等... 代码中的“硬”引用更少,spagethi 更少。
很多框架都是基于这种模式构建的,因为它打破了对象之间的依赖关系并简化了很多。
另外,Pharo 有一个包 Announcements: an Object Dependency Framework
【讨论】: