vs RAII nesneleri tahsis etti.Stack Sık sık kod daha güvenilir hale ve kod daha fazla ölçülebilir hale getirmek için yığın onları ayırmak (ve bad_alloc önlemek için) RAII tarzı nesneleri kullanmak C++ DI ilkesine
Ancak yığın üzerinde bir beton sınıfı nesnesi oluşturmak, bağımlılık ters çevirme (DI) ilkesini ihlal eder ve bu nesnenin alay edilmesini önler.
Aşağıdaki kodu düşünün: Ben IBar::process
test edebilirsiniz
struct IInputStream
{
virtual vector<BYTE> read(size_t n) = 0;
};
class Connection : public IInputStream
{
public:
Connection(string address);
virtual vector<BYTE> read(size_t n) override;
};
struct IBar
{
virtual void process(IInputStream& stream) = 0;
};
void Some::foo(string address, IBar& bar)
{
onBeforeConnectionCreated();
{
Connection conn(address);
onConnectionCreated();
bar.process(conn);
}
onConnectionClosed();
}
, ama aynı zamanda gerçek Bağlantı nesnesi oluşturmadan, Some::foo
test etmek istiyorum.
Elbette bir fabrika kullanabilirim, ancak kodu önemli ölçüde karmaşıklaştıracak ve yığın ayırmayı başlatacaktır.
Ayrıca, Connection::open
yöntemini eklemek istemiyorum, tamamen başlatılmış ve tamamen işlevsel nesneler oluşturmayı tercih ediyorum.
Ben Some
için Connection
türü bir şablon parametresi yapmak (ya foo
için eğer bir serbest fonksiyonu olarak bunu ayıklamak), ama doğru yolu (şablonlar birçok kişiye bir kara büyü gibi görünür, bu yüzden olduğundan emin değilim ediyorum) dinamik polimorfizm kullanmayı tercih
Şablonlar kara büyü için az ya da çok yetkin C++ programcısı olmamalı, ben bunları önlemek için bir neden göremiyorum.Ayrıca, yığın tahsisinin * pahalı olduğunu sanmıyorum (bu, tabii ki, yazdığınız yazılıma bağlıdır), bu yüzden de (akıllı işaretçilerle kullanıldığında) bundan kaçınmak için bir neden göremiyorum. –
@Alex B: Onlardan sakınmak için bir neden var, ancak bunun “kara büyü” oldukları için olmadığına katılıyorum. Çünkü her şey şablon parametreleri ile enjekte edilirse, yazdığınız her şey bir şablontur, kütüphaneniz sadece başlıklıdır ve derleme veya dağıtım açısından oldukça hantal olabilir. Her ne kadar, dikkatli bir şekilde, tek başına kütüphaneyi test edebileceksiniz, ancak ondan, uygulamanın ihtiyaç duyduğu örneklemleri içeren bir TU'yu inşa edebilirsiniz. –
RAII ve DI birlikte harika çalışıyor, bu yüzden başlık yanıltıcı, senin sorunun Stack Allocation vs DI. –