プログラムでさまざまなデータ サポート (H2、SQLite、NEO4J、テキストなど) に関する情報を保存/書き込みする必要があります。エクスポーターを 1 つずつ作成するため、インターフェイスは簡単に拡張できる必要があります。
シミュレーション プログラムを作成するので、各ステップで情報を保存する必要があります (db オブジェクトと、保存するさまざまなデータが必要です)。
私の最初のアイデアは、次のように、ジェネリックメソッドinitializeWriter()
で依存性注入パターンを使用することです:stepWriter()
closeWriter()
trait OutputWriter { Simulation =>
def path:String
def initializeWriter()
def stepWriter()
def closeWriter()
}
ライターを実装する必要があるユーザーは、このトレイトを拡張し、メソッドをオーバーライドします。通常、'database val' には、initializeWriter による初期化後の DB オブジェクトが含まれます。データオブジェクトには、書き込みたいすべての可能なデータが含まれています。
実際には、シミュレーションからオブジェクトと関数にアクセスして最終結果を書き込む必要があるため、OutputWriter とシミュレーションの間に依存関係があります。それは本当に良い解決策ではないと思います.@x3roの答えを考えると、これらの依存関係を削除して、より良い汎用DATAオブジェクトをライターに与える方が良い解決策です。
この場合、この DATA をデータベースに正しく書き込むために複雑な情報を追加する必要がある場合、sqlquery やその他の特定のライター コマンドなどを含むこの特定のコードをどこに置くことができますか?
したがって、この時点で私の問題は次のとおりです。
1 - シミュレーションの各ステップで書き込むデータを含むデータ オブジェクトを作成します。このデータ オブジェクトの構造は同じで、結果の値のみが移動します。
2 - 出力に正しく書き込むためのすべてのメソッドを含む任意の出力または複数の出力ライター: TextWriter、SQLITEWriter など。
3 - (1) -> (2) の関係を作るコードの特定の部分。double の indexedSeq をテキスト ファイルに書き込むのは問題ありませんが、SQL データベースに書き込むには、テーブルの構造、データを挿入するためのクエリなどをライターに渡す必要があります。
私の最初のアイデアは、このコードをライターのメソッドの stepWriter() に設定することですが、ここでライターの汎用性を壊していると思うので、おそらくこれにはより良い解決策があります
object DB
object MyData
trait DBWriter extends OutputWriter {
val database:DB = DB
def initializeWriter() = { ... }
def stepWriter(dataToWrite:MyData) = { ... }
}
その後、シミュレーションをエクスポートする必要がある場合は、次のような優れたライターを追加します。
new Simulation (...) with DBWriter {
override def path = "my-path-for-db"
initializeWriter()
// computation loop
(0 until 50){ var result:MyData= computeData() ; stepWriter(result) }
closeWriter()
}
それを行うために、より堅牢またはより柔軟な定期的に使用する他のパターン(文献または経験に基づく)がありますか?
SR 様、ご利用いただきありがとうございます。