Припускаючи інтерфейс IReader, реалізацію інтерфейсу ReaderImplementation IReader та клас ReaderConsumer, який споживає та обробляє дані з читача.
public interface IReader
{
object Read()
}
Впровадження
public class ReaderImplementation
{
...
public object Read()
{
...
}
}
Споживач:
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
}
}
Для тестування ReaderConsumer та обробки я використовую макет IReader. Тож ReaderConsumer стає:
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
}
}
}
У цьому рішенні глузування вводить фразу if для виробничого коду, оскільки лише макетний конструктор постачає екземпляри інтерфейсу.
Під час написання цього повідомлення я усвідомлюю, що блок "спроб нарешті" дещо не пов'язаний, оскільки він може управляти користувачем, що змінює місце розташування під час виконання програми.
В цілому він смердючий, як з цим можна впоратися краще?
ReaderConsumer
незалежним питанняReaderImplementation
?