Ruby 中可观察到的模式冗余

Observable pattern redundancy in Ruby

Observable 模块使用 change 方法来切换观察者何时应该获取主题中任何状态变化的更新。但是,这对我来说似乎是多余的,因为 notify_observers(self) 它将被故意调用。 change 有什么不同吗?

它允许在时间上进行拆分,并且可以在没有副作用的情况下进行多次更改。

  • 对象的状态在应用程序的子进程中可能会改变,也可能不会改变。如果它发生变化,则可以调用 .change 而不会产生任何副作用。也可以调用多次

  • 稍后可以发送通知。只要它们在采取任何依赖操作之前发送,那么任何依赖于由于原始更改而更新的东西都应该能够正确地进行更新

例如,如果更改后的处理成本很高(I/O、CPU 时间、网络带宽),但只需要在 之前完成 第二段代码,不只是每次发生更改。

如果并非所有代码路径都绝对需要更新,您也可以这样做。 IE。有时您会因为更改而关心更新,但其他时候则没有必要,并且可以忽略任何更改。

例如,如果每次 XML 创建代码使用的内容对象发生 属性 更改时,您都需要重新生成 XML 文档。您可以在内容对象的重要 属性 setter 中放置对 .change 的调用,对外部调用者隐藏它们。您不希望每次调用 content.property= 时都生成一个新的 XML 文档(这可能会很慢),而是等到完成更新并调用一次 content.notify_observers 在所有可能的更改之后。