IReaderインターフェイス、IReaderインターフェイスReaderImplementationの実装、およびリーダーからのデータを消費して処理するクラス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文が導入されます。
これを書いている間、try-finallyブロックは、アプリケーションの実行中に場所を変更するユーザーを処理するために存在するため、やや無関係であることがわかりました。
全体的に臭いが感じられますが、どうすればより良く処理できますか?
ReaderConsumer
自立することは問題外ReaderImplementation
ですか?