ฉันเห็นหลายแนะนำให้ใช้คอนเทนเนอร์ IoC ในรหัส แรงจูงใจนั้นง่าย ใช้รหัสฉีดพึ่งพาต่อไปนี้:
class UnitUnderTest
{
std::auto_ptr<Dependency> d_;
public:
UnitUnderTest(
std::auto_ptr<Dependency> d = std::auto_ptr<Dependency>(new ConcreteDependency)
) : d_(d)
{
}
};
TEST(UnitUnderTest, Example)
{
std::auto_ptr<Dependency> dep(new MockDependency);
UnitUnderTest uut(dep);
//Test here
}
เป็น:
class UnitUnderTest
{
std::auto_ptr<Dependency> d_;
public:
UnitUnderTest()
{
d_.reset(static_cast<Dependency *>(IocContainer::Get("Dependency")));
}
};
TEST(UnitUnderTest, Example)
{
UnitUnderTest uut;
//Test here
}
//Config for IOC container normally
<Dependency>ConcreteDependency</Dependency>
//Config for IOC container for testing
<Dependency>MockDependency</Dependency>
(ตัวอย่างข้างต้นเป็นตัวอย่างของซีพลัสพลัสสมมุติฐาน)
ในขณะที่ฉันยอมรับว่าสิ่งนี้ช่วยให้อินเทอร์เฟซของคลาสง่ายขึ้นโดยการลบพารามิเตอร์ตัวสร้างการพึ่งพาฉันคิดว่าการรักษานั้นแย่กว่าโรคด้วยเหตุผลสองประการ ครั้งแรกและนี่คือสิ่งที่ยิ่งใหญ่สำหรับฉันสิ่งนี้ทำให้โปรแกรมของคุณขึ้นอยู่กับไฟล์กำหนดค่าภายนอก หากคุณต้องการการปรับใช้ไบนารีเดียวคุณก็ไม่สามารถใช้คอนเทนเนอร์ประเภทนี้ได้ ปัญหาที่สองคือตอนนี้ API นั้นอ่อนแอและแย่ลงพิมพ์อย่างเข้มงวด หลักฐาน (ในตัวอย่างสมมุตินี้) คืออาร์กิวเมนต์สตริงไปยังคอนเทนเนอร์ IoC และการส่งต่อผลลัพธ์
ดังนั้น .. มีประโยชน์อื่น ๆ อีกไหมในการใช้ภาชนะประเภทนี้หรือฉันแค่ไม่เห็นด้วยกับภาชนะที่แนะนำ?