事件流中存储事件是否应与事件流中事件的读取分开实现?
例如,以下抽象基类提供了一种持久化事件的方法,以便以后可以重放它们。
class event_store_t {
public:
virtual void store(const event_t& event) = 0;
virtual ~event_store_t() {}
};
用于测试的具体派生类的接口如下:
class ostream_event_store_t : public event_store_t {
public:
virtual void store(const event_t& event);
};
现在,在稍后重播事件时,是否应该有一个单独的类来读取事件。例如,抽象基类显示为:
class event_stream_t {
public:
virtual boost::shared_ptr<event_t> read() = 0;
};
具体派生类出现为:
class istream_event_stream_t : public event_stream_t {
public:
istream_event_stream_t(std::istream& input) : input_(input) {}
virtual boost::shared_ptr<event_t> read() {
// Read the event.
}
};
答案 0 :(得分:1)
事件流中事件的存储是否应与事件流中事件的读取分开实现?
可能不是吗?
将加载实现与商店实现分开的主要动机是,您可以单独交换实现。
如果您已经没有发生过这种情况,那么您在前面将成本加载到您的设计中,假设现在将成本分开比以后更有效,请记住在这个假设中“以后”你将比现在更了解变革的要求。
这似乎不是一个好赌注。
也就是说,您可能已经注意到需要读取功能的消费者并不总是需要写入功能,反之亦然。因此,有一个与write接口分开的read 接口可能是有意义的,只有一个模块可以实现这两个接口。