C bağımlılık enjeksiyon ++

oy
23

Bu aynı zamanda ben Miško Hevery en birinde bir yorumda sorulan bir sorudur google görüşmelerin bağımlılık enjeksiyon ile uğraşan ama o yorumlarda gömülürler.

Ben birlikte bağımlılıkları kablolama fabrika / oluşturucu adım C ++ çalışabilir nasıl merak ediyorum.

Ie yığın B tahsis edecek yapıcı, aynı zamanda bir yığın ayrılırken A yapıcısında B için bir işaretçi geçmek ve A için bir işaretçi döndürür B. bağlı olarak bir A sınıfı vardır

Kim sonradan temizler? o bitmiştir sonra oluşturucu temizlemek izin iyi midir? Bu konuşma o oluşturucu beklenen kurulum nesneleri bağımlılıkları uzun kullanım ömrüne sahiptir aynı ömrünü ya da en azından olması gerektiğini söylüyor çünkü doğru bir yöntem olarak görünmektedir (Ben de bu konuda bir sorum var). Ne kodunda demek:

class builder {
public:
    builder() :
        m_ClassA(NULL),m_ClassB(NULL) {
    }
    ~builder() {
        if (m_ClassB) {
            delete m_ClassB;
        }
        if (m_ClassA) {
            delete m_ClassA;
        }
    }
    ClassA *build() {
        m_ClassB = new class B;
        m_ClassA = new class A(m_ClassB);
        return m_ClassA;
    }
};

Biz enjekte edilir nesnenin ömrü daha uzun sürmesi beklenen bir bağımlılık varsa Şimdi biz böyle bir şey için inşa yöntemini değiştirmek gerektiğini anlıyorum (diyelim ClassC o bağımlılık değildir):

ClassA *builder::build(ClassC *classC) {
    m_ClassB = new class B;
    m_ClassA = new class A(m_ClassB, classC);
    return m_ClassA;
}

Tercih yaklaşımı nedir?

Oluştur 09/12/2008 saat 15:26
kaynak kullanıcı
Diğer dillerde...                            


8 cevaplar

oy
2

Eğer ilk ve son kez mülkiyet soru üzerine yerleşmek yoksa şeyler karmaşık hale geldiğini. Sadece bu bağımlılıkları onlar içine enjekte edilir nesneler daha uzun yaşaması olasıdır eğer uygulanmasında karar vermek zorunda kalacak.

bağımlılık sonradan temizler enjekte edildiği nesneyi: Şahsen hayır derim. oluşturucu üzerinden yapmaya çalışıyor oluşturucu bağımlılık ve enjekte edildiği nesne hem daha uzun yaşamak zorunda olacağı anlamına gelir. Bu bağımlılık enjeksiyonu ile inşaat tamamlandıktan sonra oluşturucu bir daha yararlı bir amaca hizmet etmez, çünkü benim görüşüme göre, çözer daha fazla sorunlara neden olur.

Cevap 09/12/2008 saat 15:33
kaynak kullanıcı

oy
13

Bu konuşma Java ve bağımlılık enjeksiyon ile ilgilidir.

C ++ denememiz DEĞİL etrafında RAW işaretçileri geçmek. RAW işaretçi onunla ilişkili hiçbir sahiplik anlambilgisi olmasıdır. Eğer hiçbir sahipliğini varsa o zaman nesneyi temizlemeye kimin sorumlu olduğunu bilmiyorum.

Zamanın bağımlılık enjeksiyon çoğu C ++ başvuruları aracılığıyla yapıldığını bulmak.
Eğer işaretçileri kullanmalıdır Nadir durumlarda, bunları sarmak std :: unique_ptr <> veya std :: Shared_ptr <> Sahipliğini yönetmek istiyorum nasıl bağlı.
Eğer std :: auto_ptr <> kullanabilir ya :: Shared_ptr <> artırmak, C ++ 11 özelliklerini kullanamazsınız.

Ayrıca programlama C ++, Java stilleri şimdi diğer bir dilden stilini uygulamak kaçınılmaz felakete yol böylece farklı olduğuna işaret etmek isterim.

Cevap 09/12/2008 saat 15:47
kaynak kullanıcı

oy
2

Eğer doğru şeyler yapıldığında C ++ olarak, normalde, çoğu durumda hiç yıkıcı yazmaya gerek yoktur. Otomatik şeyleri silmek için akıllı işaretçileri kullanmalıdır. Ben oluşturucu Sınıf A ve ClassB örneklerinin sahibi gibi görünüyor yok düşünüyorum. Eğer akıllı işaretçileri kullanmak beğenmezseniz, sen nesneleri yaşam süresi ve sahiplerine düşünmelisin.

Cevap 09/12/2008 saat 16:14
kaynak kullanıcı

oy
3

RAII kullanın.

Birine ham bir işaretçi Handing onlara sahipliğini teslim aynıdır. o değil yapmak istediğiniz buysa, onlara da söz konusu nesneyi temizlemek bilen cephenin çeşit vermelidir.

Shared_ptr <> yapabilirsiniz; onun kurucusuna ikinci argüman nesnesini silmek bilen bir fonksiyon nesnesi olabilir.

Cevap 09/12/2008 saat 17:40
kaynak kullanıcı

oy
9

Bu şablonları kullanarak ++, C DI ilginçtir:

http://adam.younglogic.com/?p=146

Ben yazar C içine ++ fazla ciddiye Java DI çevirmez olarak doğru adımlar atıyor düşünüyorum. okuma değer.

Cevap 23/12/2009 saat 02:08
kaynak kullanıcı

oy
2

Kendi deneyimlerine dayanarak, açıkça sahiplik kuralları olması en iyisidir. küçük beton nesneler için, çapraz bağımlılık önlemek için doğrudan kopyasını kullanmak en iyisidir.

Bazen çapraz bağımlılık kaçınılmaz olduğu ve net bir sahiplik yoktur. Örneğin, (m) bir örneği, kendi (n) Oda örnekler ve bazı B örnekleri olarak çoklu sahip olabilir. Bu durumda, en iyi yaklaşım, COM referans sayma benzer şekilde, B'ye referans sayma uygulamaktır. B * ele geçirmek tüm fonksiyonlar ilk başvuru sayısı artırmak ve bulundurma serbest zaman düşürebilirsiniz gerekir.

Ben de yeni bir tür (shared_ptr ve iki ayrı tip haline B *) oluşturur olarak boost :: shared_ptr kullanmaktan kaçının. Ben yöntemleri eklediğinizde daha baş ağrısı getirir bulundu.

Cevap 23/12/2009 saat 17:04
kaynak kullanıcı

oy
6

Geçenlerde DI böcek tarafından Isırılmışsın. Bunun karmaşıklık sorunları, özellikle otomatik parçanın bir çok çözer düşünüyorum. Sizin oldukça C ++ şekilde DI kullanmak ya da en azından ben öyle düşünüyorum sağlayan bir prototip yazdım. Burada kod örneği bir göz atabilirsiniz: http://codepad.org/GpOujZ79

Açıkçası eksik şeyler: hayır kapsam, hiçbir uygulanmasına arayüzünün bağlanması. İkincisi ben bir fikrim yok eski, çözmek oldukça kolaydır.

Burada kimse kod hakkında görüş varsa memnun olurum.

Cevap 10/05/2010 saat 17:39
kaynak kullanıcı

oy
1

Ayrıca kontrol edebilirsiniz FFEAD Bağımlılık Injection . Bu JAVA için Bahar hatlarında DI sağlar ve şeylerle uğraşan olmayan bir rahatsızlık verici bir yol vardır. Aynı zamanda gibi diğer önemli özelliklerinden bir yeri vardır dahili C ++, ORM, Mesajlaşma, Web Services, Konu-Havuzlar ve bir Uygulama Sunucusu için AJAX desteği, Yansıma, Serileştirme, C ++ yorumlayıcı, İş Bileşenleri tüm bu özellikleri destekler.

Cevap 10/08/2010 saat 08:31
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more