Birkaç kod IoC kapları kullanmanızı tavsiye gördüm. Motivasyon basit. Aşağıdaki bağımlılık enjekte edilen kodu alın:
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
}
İçine:
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>
(Yukarıdaki varsayım elbette varsayımsal C ++ örneğidir)
Bunun bağımlılık yapıcı parametresini kaldırarak sınıfın arayüzünü basitleştirdiğini kabul etsem de, tedavinin birkaç nedenden dolayı hastalıktan daha kötü olduğunu düşünüyorum. İlk olarak, bu benim için büyük bir program, bu da programınızı harici bir yapılandırma dosyasına bağımlı kılıyor. Tek bir ikili konuşlandırmaya ihtiyacınız varsa, bu tür kapsayıcılar kullanamazsınız. İkinci sorun, API'nin artık zayıf ve daha kötü, dize olarak yazılmış olmasıdır. Kanıt (bu varsayımsal örnekte), IoC kapsayıcısına ve sonuçtaki oyuncuya yönelik dize argümanıdır.
Yani .. bu tür kapları kullanmanın başka yararları var mı ya da sadece kapları önerenlere katılmıyorum mu?