สมมติว่ามีอินเทอร์เฟซ 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 สำหรับรหัสการผลิตเนื่องจากตัวสร้างการจำลองเท่านั้นที่ให้อินสแตนซ์ของอินเทอร์เฟซ
ในระหว่างการเขียนสิ่งนี้ฉันรู้ว่าการทดลองในที่สุดบล็อกนั้นค่อนข้างไม่เกี่ยวข้องกันเนื่องจากมีการจัดการผู้ใช้ในการเปลี่ยนตำแหน่งในช่วงที่แอพพลิเคชั่นทำงาน
โดยรวมแล้วรู้สึกเหม็นวิธีการจัดการที่ดีขึ้น
ReaderConsumer
เป็นไปReaderImplementation
ไม่ได้หรือไม่ที่จะทำให้เป็นอิสระ?