問題は単純です。データベースから行をフェッチし、それらをインターフェイスに渡します。このインターフェースの 1 つの実装は、このデータを XML ファイルに書き込みます。
私はパターンを探しているので:
- インターフェイスには 3 つではなく 1 つのメソッドしかありません:
beginWrite
/write
/endWrite
- 一度にすべての行をフェッチするのではなく、行ごとにインターフェイスを「フィード」する必要があります。
- インターフェイスの実装は特定のデータベース ドライバーに依存すべきではないため、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) {};
考え
私が思いついたのは、関数を 1 つだけ定義することでした。
IBackend.prototype.writeAll = function(callback) {};
次に、このインターフェイスの実装は、callback
渡された awriteOne
およびend
callback を引数として呼び出すため、次のように使用できます。
backend.writeAll(function(writeOneCallback, endCallback) {
collection.find().each(function(err, doc){
if (err) throw new Error(err);
writeOneCallback(doc);
});
endCallback();
});
ただし、writeOne
andend
コールバックの受け渡しは実装に依存し、インターフェイスでは指定されません。誰かがこれに対するエレガントな解決策を知っているなら、私はそれを聞きたいです:)