A függőség injekció C ++

szavazat
23

Ez is egy kérdés, hogy megkértem egy megjegyzést az egyik Miško hevery a google beszél , hogy foglalkozott függőség injekció, de ez van eltemetve a megjegyzéseket.

Kíváncsi vagyok, hogyan lehet a gyári / építő lépést vezetékeket a függőségek együtt tud működni a C ++.

Azaz van egy osztályú, amely attól függ, B. Az építő osztja B a kupac, át egy mutatót B A-konstruktorának miközben kiosztása a kupacban és visszatér egy mutatót A.

Ki tisztítja utána? Ez jó, hogy hagyja, hogy a builder megtisztítása után ez kész? Úgy tűnik, hogy a helyes módszer, mivel a beszéd azt mondja, hogy az építtető kell beállítási objektumok, amelyek várhatóan ugyanolyan életre, vagy legalábbis a függőségek hosszabb élettartammal (én is egy kérdést, hogy). Ez alatt azt értem kód:

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;
    }
};

Most, ha van egy függőség, amely várhatóan tovább tart, mint az élettartama a tárgy mi oltjuk be (mondjuk ClassC hogy függőség) Megértem, hogy meg kell változtatni a build módszer, valami ilyesmit:

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

Mi a preferált megközelítés?

A kérdést 09/12/2008 15:26
a forrás felhasználó
Más nyelveken...                            


8 válasz

szavazat
13

Ez a beszéd szól Java és a függőségi injekciót.

A C ++ igyekszünk NEM átadni RAW mutatókra. Ez azért van, mert a RAW pointer nincs tulajdonosi szemantika társítva. Ha nincs tulajdonosi akkor nem tudjuk, hogy ki a felelős a takarítás az objektumot.

Rájöttem, hogy a legtöbb időt függőség injekció útján történik hivatkozás C ++.
Azokban a ritka esetekben, ahol meg kell használni mutatók, csomagolja őket std :: unique_ptr <> vagy std :: shared_ptr <> attól függően, hogy a kezelni kívánt tulajdon.
Abban az esetben, nem tudja használni a C ++ 11 jellemzőiről használja std :: auto_ptr <> vagy növeljék :: shared_ptr <>.

Azt is hangsúlyozzák, hogy a C ++ és Java programozási stílusok most olyan eltérő alkalmazása, hogy a stílus egyik nyelvről a másikra elkerülhetetlenül katasztrófához vezet.

Válaszolt 09/12/2008 15:47
a forrás felhasználó

szavazat
9

Ez azért érdekes, DI C ++ sablonok segítségével:

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

Azt hiszem, a szerző a megfelelő lépéseket, hogy ne fordítsa Java DI a C ++ is szó. Érdemes az olvasási.

Válaszolt 23/12/2009 02:08
a forrás felhasználó

szavazat
6

Én nemrég megharapta a DI bug. Azt hiszem, ez megoldja a sok összetettsége problémák, különösen a automatizált része. Írtam egy prototípus, amely lehetővé teszi, hogy használja DI egy csinos C ++ módon, vagy legalábbis én így gondolom. Akkor vessen egy pillantást a kódot példa itt: http://codepad.org/GpOujZ79

A dolgok nyilvánvalóan hiányzik: nincs tartalom meghatározás, nincs kötődése interfész végrehajtását. Az utóbbi elég könnyű megoldani, az egykori, fogalmam sincs.

Nagyon hálás lennék, ha valaki itt van véleménye a kódot.

Válaszolt 10/05/2010 17:39
a forrás felhasználó

szavazat
3

Használja RAII.

Átadás a nyers mutató valakinek megegyezik átnyújtja tulajdon. Ha ez nem az, amit akarok, akkor meg kell adni nekik valamilyen homlokzati hogy azt is tudja, hogyan kell megtisztítani a kérdéses tárgy.

shared_ptr <> megteheti; A második érv annak kivitelező lehet egy függvény objektum, amely tudja, hogyan kell törölni az objektumot.

Válaszolt 09/12/2008 17:40
a forrás felhasználó

szavazat
2

Ennek alapján a saját tapasztalat, hogy a legjobb, ha tiszta tulajdonosi szabályokat. A kis konkrét tárgyak, a legjobb, ha a közvetlen másolás elkerülése érdekében a határokon függőséget.

Néha kereszt függőség elkerülhetetlen, és nincs egyértelmű tulajdon. Például, (m) A példányok saját (n) B esetekben, és bizonyos B esetekben lehet tulajdonában több néven. Ebben az esetben a legjobb megoldás az, hogy alkalmazni referencia számlálás B, a hasonló módon COM hivatkozási számolás. Bármilyen funkciók birtokba venni a B * meg kell növelni hivatkozási szám az első, és csökkenti, amikor elengedi a birtokában.

Én is elkerülhető boost :: shared_ptr hiszen létrehoz egy új típusú (shared_ptr és B * vált két különböző típusú). Azt találtuk, hogy amellett, hogy nagyobb fejfájást, ha adhatok módszerekkel.

Válaszolt 23/12/2009 17:04
a forrás felhasználó

szavazat
2

A C ++, normálisan, ha kész a dolgokat, akkor nem kell írni destruktorok egyáltalán a legtöbb esetben. Akkor érdemes használni smart pointerek törölni dolgokat automatikusan. Azt hiszem, építőmester nem néz ki, mint a tulajdonos a ClassA és ClassB példányok. Ha nem szeretné, hogy az intelligens mutató, meg kell gondolni tárgyak élettartam és a tulajdonosok.

Válaszolt 09/12/2008 16:14
a forrás felhasználó

szavazat
2

A dolgok egyre bonyolultabbá válnak, ha nem rendezi a kérdést, tulajdonosi egyszer és mindenkorra. Akkor egyszerűen el kell döntenie, a megvalósításban, ha ez lehetséges, hogy a függőségek tovább élnek, mint a tárgyak vannak fecskendeznek.

Személy szerint én nem mondok: az objektumot, amelyben a függőség fecskendezik tisztítsák meg utána. Próbálok csinálni a készítő azt jelenti, hogy az építtető lesz tovább élnek, mint mind a függőség és az objektumot, amelyben az injekciót. Ez még problémát, mint amennyit megold, véleményem szerint, mert az építtető nem szolgál többé hasznos célt megépítését követően a függőség injekció beadása után.

Válaszolt 09/12/2008 15:33
a forrás felhasználó

szavazat
1

Ön is ellenőrizheti a FFEAD Függőség Injection . Ez biztosítja DI a vonalak Tavaszi Java és egy nem zavaró módon foglalkozik a dolgokat. Ez is egy csomó más fontos funkciók, mint a beépített AJAX támogatás, elmélkedés, sorszámozás, C ++ fordító, Business Components C ++, ORM, az Üzenetek, web-szolgáltatások, téma-medence és egy Application Server , amely támogatja ezeket a funkciókat.

Válaszolt 10/08/2010 08:31
a forrás felhasználó

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