Sto scrivendo una classe che legge le righe da un file, li elabora, li memorizza in un accumulatore e quando raggiunge una soglia di inserimenti di massa in un database SqlServer. In questo modo:
class FooImporterToSqlServer
{
private string ConnectionString { get;} //initilized via constuctor
private AccumulatorCollection Accumulators { get;} //initilized via constuctor
private FooProcessor Processor { get;} //initilized via constuctor
private int LastHierarchyId { get; set;} //initilized via constuctor, starts at 0
public void Import(string path)
{
var lines = File.ReadAllLines(path);
foreach(var line in lines)
{
var processedLine = Processor.Process(line, ref LastHierarchyId);
Accumulators.Add(processedLine);
if(Accumulators.HaveAnyFull())
UnloadAccumulators();
}
}
private void UnloadAccumulator()
{
var fullAccumulators = Accumulators.GetFullAccumulators();
foreach(var fullAccumulator in fullAccumulators)
{
//bulk insert black magic
}
}
}
Ma non posso fare a meno di fallire. Sto violando una singola responsabilità con la classe FooImporterToSqlServer
. Fa troppo: legge il file, usa l'accumulatore e poi inserisce nel database.
Ma anche io non so come separare queste preoccupazioni in questo caso in cui ho bisogno di smettere di elaborare a metà strada. Mantenimento speciale dello stato tra diversi inserimenti. Normalmente ci sarebbe qualcosa come FooReaderToMemory
poi FooInsertToSqlServer
ma in questo caso sono uno nella stessa cosa. Qualche idea su come posso eseguire il refact in questo modo per non rompere SRP?
EDIT: per chiarimenti, non riesco a leggere, elaborare e quindi importare il file perché le righe elaborate sono troppo da tenere in memoria tutte in una volta.
Non esitare a notare qualsiasi altra cosa che non va nell'esempio che ho fornito!