0

问题很简单:从数据库中获取行并将它们传递给接口。这个接口的一个实现会将此数据写入 XML 文件。

我正在寻找一种模式,所以:

  • 接口只有一个方法而不是3个:beginWrite//writeendWrite
  • 它不应该一次获取所有行,而是逐行“馈送”界面。
  • 我不想将 mongodb 游标传递给接口,因为接口实现不应该依赖特定的数据库驱动程序。

界面

function IBackend(implementation){
    // removed code that merges implementation with this interface
    // because it is irrelevant to this question.
}

IBackend.prototype.beginWrite = function(callback) {};

IBackend.prototype.write = function(row, callback) {};

IBackend.prototype.endWrite = function(callback) {};

主意

我想出的办法是只定义一个函数:

IBackend.prototype.writeAll = function(callback) {};

然后此接口的实现将callback传递的 awriteOneend回调作为参数调用,因此它可以用作:

backend.writeAll(function(writeOneCallback, endCallback) {
    collection.find().each(function(err, doc){
        if (err) throw new Error(err);
        writeOneCallback(doc);
    });
    endCallback();
});

但是,writeOneandend回调的传递取决于实现,并没有在接口中指定。所以如果有人知道一个优雅的解决方案,我很想听听:)

4

1 回答 1

1

首先想到的是流。虽然它不仅仅是方法,因此不能回答你的问题,它是:

  1. 久经考验
  2. 似乎合适
  3. 与 node.js 生态系统的许多其他部分配合得很好
  4. 一次不需要所有行,例如

还有许多可用的流将减少您的开发时间,并且您可以将流的输出传输到的许多其他流也将减少开发时间(xml、zip、通过 http 发送等)。

请参阅优秀的 Streams 手册 ( https://github.com/substack/stream-handbook ) 了解更多信息,以及此类“其他流”的示例。

如果您仍然不服气,我只能想到两种情况:

  1. 您的接口还保证实现不需要“刷新”(即:在调用之间不维护write()最终需要汇总、刷新、输出等的状态。此类状态的示例:缓冲区、统计信息将被附加/附加到输出中,...)。

  2. 您的界面不保证这一点。

如果上面的 #1 是正确的,那么只需 have write(),它接受单行的行数组,并立即进行处理。上面#1 的保证意味着在任何给定时刻,你的接口的输出都构成一个有效的、连贯的状态。

write()如果上面的 #2 是正确的(就像输出 XML 文件的示例一样) ,那么我至少看不到end().

于 2013-11-05T10:12:49.153 回答