我正在开发一个跨平台的 C++ 数据模型,其中包含近 1,000 种不同类型的数据项(但 < 100 种不同的数据结构/类)。为了处理模型到控制器的消息(即通知控制器某些数据项已更改),我正在考虑使用 boost:signals2。我认为这将有助于创建一个统一的观察者模式,该模式在不同的操作系统平台上保持不变。最初的实现是在 Mac OS / IOS 上,随后的 UI 是在 .net 和 unix 上开发的。
问题:
1)为了建立数据模型的观察,控制器应该连接什么类型的对象到信号2对象/插槽?对于观察到的每个数据项,控制器中是否应该有特定的功能/方法/选择器?这些函数应该是 C、C++ 还是 Objective-C/C++ 函数?
2) 信号应该具有什么级别的粒度?每个数据项都应该有自己的吗?或者模型对相关结构/记录的管理是否应该为每种类型的结构/记录维护一个信号?例如——应用程序偏好是否应该为所有偏好数据提供一个信号——传递关于哪些数据项被更改的信息?
3)发送信号(或接收信号的槽)的过程是否应该在单独的线程中执行?
4) 我知道 Cocoa 有自己的 Key-Value Observing 系统。但是这样的系统是否有利于与模型的基于信号 2 的观察者范式相结合 - 还是只是多余的?
更新:
关于实际 signal2 对象(不是观察者)的“粒度”,我认为每个文档有一个,应用程序首选项一个可能是一个不错的起点。我的文档数据已经有了一个“关键”概念,因此可以概括常见的 UI 案例,其中 UI 组件与特定的模型数据项相关联。