Supponendo un'interfaccia IReader, un'implementazione dell'interfaccia IReader ReaderImplementation e una classe ReaderConsumer che consuma ed elabora i dati dal lettore.
public interface IReader
{
object Read()
}
Implementazione
public class ReaderImplementation
{
...
public object Read()
{
...
}
}
Consumatore:
public class ReaderConsumer()
{
public string location
// constructor
public ReaderConsumer()
{
...
}
// read some data
public object ReadData()
{
IReader reader = new ReaderImplementation(this.location)
data = reader.Read()
...
return processedData
}
}
Per testare ReaderConsumer e l'elaborazione uso una simulazione di IReader. Quindi ReaderConsumer diventa:
public class ReaderConsumer()
{
private IReader reader = null
public string location
// constructor
public ReaderConsumer()
{
...
}
// mock constructor
public ReaderConsumer(IReader reader)
{
this.reader = reader
}
// read some data
public object ReadData()
{
try
{
if(this.reader == null)
{
this.reader = new ReaderImplementation(this.location)
}
data = reader.Read()
...
return processedData
}
finally
{
this.reader = null
}
}
}
In questa soluzione il derisione introduce una frase if per il codice di produzione poiché solo il costruttore di simulazione fornisce un'istanza dell'interfaccia.
Durante la stesura di questo, mi rendo conto che il blocco try-finally è in qualche modo non correlato poiché è lì per gestire l'utente che modifica la posizione durante il runtime dell'applicazione.
Nel complesso sembra puzzolente, come potrebbe essere gestito meglio?
ReaderConsumer
indipendentiReaderImplementation
?