Ósjálfstætt innspýting vs þjónustuaðila

Ljósmynd eftir John Carlisle á Unsplash

Margir verktaki þarna úti sjá ekki muninn á milli háðs innspýtingar og hönnunarmynsturs þjónustuaðila. Já, báðir reyna að leysa sama vandamál - auka aftengingu. Við vitum öll hvaða ávinning þetta gefur okkur þegar kemur að stigstærð, prófun eða einfaldlega að lesa kóðann.

Hvernig veit ég hvenær á að nota innspýtingu í ósjálfstæði og hvenær á að nota þjónustuaðila? Ég myndi segja að við ættum að nota þau bæði þegar það á við.

Ef ég væri beðinn um að velja eina sögn sem best lýsir innspýtingarmynstri háðs myndi ég velja „að gefa“. Ef þú hugsar um það, þá er það nákvæmlega það sem við náum með sprautufíkn. Við gefum hlutum einfaldlega hluti.

$ gluggi = nýr gluggi ();
$ hurð = ný hurð ();
$ hús = nýtt hús ($ gluggi, $ hurð);

Í þessu tilfelli gefum við gluggahlutnum og hurðarhlutnum að húshlutnum.

Hins vegar myndi ég segja „að taka“ ef ég væri beðin um að lýsa uppsetningunni á þjónustu með einni sögn. Hugsaðu aðeins um það. Það er það sem við gerum þegar við notum þjónustuaðila. Við tökum hluti úr hlut.

$ house = $ serviceLocator-> get (House :: class);

Eins og þú sérð tökum við húsið mótmæla frá þjónustuveitunni.

Í mörgum tilfellum er ósjálfstæða innspýtingin og staðsetningarþjónustan virkar sem ein eining. Við gætum ekki séð það þegar hlutunum er sprautað sjálfvirkt en á bak við svæðið treysta útfærslur á innspýtingu á ávanabindingu þjónustuaðila til að ná raunverulegum ósjálfstæði.

Svona getur það litið út einhvers staðar í kóðanum:

foreach ($ ósjálfstæði sem $ háð) {
    $ tilvik [] = $ þetta-> ílát-> fá ($ háð);
}
skila $ þessu-> leysa ($ flokkur, $ tilvik);

Þjónustuleitandi er frekar auðveldur í framkvæmd. Allt sem þú þarft er að hafa getu til að fá umbeðið dæmi með nafni eða kennitölu og getu til að athuga hvort umbeðið dæmi sé raunverulega til. Þess má geta að þjónustuleitandi er oft kallaður gámur. Báðir hlutirnir eru eins. Báðum er ætlað að bjóða upp á tilvik eða þjónustu, en þú vilt helst hringja í þá. Auðvitað er munur á þjónustu og dæmi þegar talað er um hugtök og tilgang, en frá tæknilegu sjónarmiði eru þau öll tilvik af ákveðnum flokkum.

Hérna er frumstæð útgáfa af þjónustuaðila (aka gámur):

bekk ServiceLocator {

    einka $ þjónusta = [];

    opinber aðgerð fá (strengur $ id):? mótmæla {
        skila $ þessu-> þjónustu [$ id] ?? núll;
    }


    Opinber aðgerð hefur (band $ id): bool {
        endurkoma er sett ($ this-> þjónusta [$ id]);
    }

    opinber aðgerðaskrá (strengur $ id, object $ þjónusta): ógilt {
        $ this-> þjónustu [$ id] = $ þjónusta;
    }
}
$ serviceLocator = nýr ServiceLocator ();
$ serviceLocator-> skrá ('hús', nýtt hús ());
// einhvers staðar annars staðar

ef ($ serviceLocator-> hefur ('hús')) {
    $ house = $ serviceLocator-> fá ('hús');
}

Að auki hef ég lagt leið til að skrá þjónustu.

Útfærslurnar á sprautufíkn sprautast venjulega sjálfkrafa í ósjálfstæði. Allt sem þú þarft er að bjóða upp á smá stillingar og það er allt. Það er mjög þægilegt í mörgum tilvikum, en það eru tilfelli þegar þú þarft að nota þjónustuaðila til að forðast sjálfheldu. Þetta gæti gerst þegar tvö tilvik eru háð hvort öðru með framkvæmdaaðila. Hér er dæmi:

bekkur A {
    
    opinber aðgerð __construct (B $ b)
    {
        //
    }
}

flokkur B {
    opinber aðgerð __construct (A $ a)
    {
        //
    }
}
$ a = nýtt A (...); // Okkur vantar B!
$ b = ný B (...); // Okkur vantar A!

Eins og þú sérð getum við ekki leyst neina af þjónustunum vegna þess að þær eru háðar hvor annarri. Við getum ekki leyst þjónustuna A vegna þess að hún þarfnast þjónustunnar B, og við getum ekki leyst þjónustuna B vegna þess að hún þarfnast þjónustunnar A. Til að leysa þetta verðum við að sækja eina þjónustuna á latan hátt. Sem þýðir að við ættum að taka eina þjónustuna frá þjónustuveitunni á þeim stað þegar þjónustan er í raun nauðsynleg en ekki í framkvæmdaaðila.

Allt í allt

Vona að þessi grein hafi hreinsað ýmislegt fyrir þig og þú hafir haft gaman af því að lesa hana. Ef ekki, verður þú að vera nú þegar klárasti forritari þarna úti ;-)