former for design: afhængighed injektion

, design mønstre: afhængighed injektion,,,,, 48,,,,,,,, 10,,,,,,, det cyber - mandag envato tuts + kurser vil blive reduceret til $3.- og' t miss.,, selv om afhængighed injektion er et emne, der sjældent undervises begyndere, det er et bestemt mønster, der fortjener større opmærksomhed.mange udviklere undgå afhængighed injektion, fordi de ikke ved, hvad det betyder, eller fordi de tror, at de ikke har brug for det, i denne artikel, vil jeg forsøge at overbevise dem om værdien af afhængighed injektion.for at gøre det her, jeg vil introducere dig for afhængighed injektion af viser dig, hvor nemt det er i sin enkleste form.,, 1.hvad er afhængighed injektion?,, der er skrevet meget om afhængighed injektion, og der er en masse værktøj og biblioteker, der har til formål at forenkle afhængighed injektion.der er et citat, men der fanger den forvirring, mange mennesker har omkring afhængigheden injektion.,, "afhængighed injektion" er en 25 dollar udtryk for en 5-cent begreb.- james land, når du forstå den idé, der ligger til grund for afhængighed, injektion, vil du også forstå ovennævnte citat.lad os starte med et eksempel for at illustrere begrebet.,, en six anvendelse har mange områder og deres anvendelse kan påberåbe sig afhængighed, du er ikke klar over, det er, at du ikke finder dem afhængighedsforhold.følgende kode snippet viser gennemførelsen af en, uiviewcontroller, anvendes ved navn, viewcontroller,.gennemførelse omfatter en metode, der hedder, savelist:,.kan du se den afhængighed?,,&#import "viewcontroller. h" @ grænseflade viewcontroller () @ ende @ gennemførelse viewcontroller - (indhold) savelist: (nsarray *) liste (hvis ([liste iskindofclass: [nsarray klasse]]) (nsuserdefaults * userdefaults = [nsuserdefaults standarduserdefaults]; [userdefaults setobject: liste forkey: @ "listen"]}} @ ende, som er den mest almindelige overset besiddelser, er dem, som vi stoler mest på.i, savelist:, metode, vi opbevare et system i den pågældende misligholdelse database, som er tilgængelig gennem, nsuserdefaults, klasse.vi har adgang til den fælles misligholdelser genstand ved at påberåbe sig de  , standarduserdefaults metode.hvis du er bekendt med programmerbare eller os x udvikling, så er du formodes at være bekendt med, nsuserdefaults, klasse, og lagring af data i den pågældende misligholdelse database er hurtig, let og pålidelig.tak til  , standarduserdefaults, metode, vi har adgang til brugeren misligholdelser database, fra hvor som helst i projektet.den metode, returnerer en singleton, som vi kan bruge, når vi vil.livet kan være smuk.,, singleton?når og hvor?kan du lugte noget?ikke blot kan jeg lugte en afhængighed, jeg kan lugte en dårlig praksis.i denne artikel, jeg ønsker ikke at åbne pandoras æske ved at drøfte anvendelse og misbrug af 'er fygter, men det er vigtigt at forstå, at' er fygter bør anvendes med måde, de fleste af os er blevet så vant til brugeren misligholdelser database, som vi ser det ikke som en afhængighed.men det er bestemt en.det samme gælder for anmeldelse center, som vi normalt adgang via singleton tilgængelige gennem  , defaultcenter metode.tag et kig på følgende eksempel for afklaring.,,&#import "viewcontroller. h" @ grænseflade viewcontroller () @ ende @ gennemførelse viewcontroller&#pragma mark -&#pragma mark initialization - (instancetype) lokalitet (self - = [super lokalitet]; hvis (selvstændige) (nsnotificationcenter * nc = [nsnotificationcenter defaultcenter]; [nc addobserver: selv vælger: @ vælgeren (applicationwillenterforeground:) navn: uiapplicationwillenterforegroundnotification formål: nul]} tilbage selv;}&#pragma mark -&#pragma mark hukommelse management - (indhold) dealloc {[[nsnotificationcenter defaultcenter] removeobserver: selv]}&#pragma mark -&#pragma mark anmeldelse af (tomrum) applicationwillenterforeground: (nsnotification *) anmeldelsen (//...} @ ende, ovenstående scenario er meget almindeligt.vi tilføjer på registeransvarlige som observatør for meddelelser med navn  , uiapplicationwillenterforegroundnotification og fjerne det som observatør i, dealloc, metode i klassen.det er en afhængighed af, viewcontroller, klasse, en afhængighed, der ofte glemmes eller ignoreres.,, det spørgsmål, de kan stille dig selv er "hvad er problemet?"eller bedre, er der et problem? "lad os starte med det første spørgsmål,.,,, hvad er problemet?, baseret på ovenstående eksempler, det virker, som om der ikke er noget problem.det er ikke helt sandt.den registeransvarlige   på, afhænger af, om de fælles misligholdelser formål og misligholdelse meddelelse center for at gøre sit arbejde, er det et problem?næsten hver eneste formål er baseret på andre genstande, der skal gøre sit arbejde.problemet er, at afhængighed er  , implicit.udvikler nye til projektet ved ikke det synspunkt er baseret på disse områder registeransvarlige ved inspektion af klasse grænseflade, afprøvning, viewcontroller, klasse   også vil vise sig at være svært, siden vi ikke har kontrol over den  , nsuserdefaults,   og nsnotificationcenter, klasser.lad os se på nogle løsninger på dette problem.med andre ord, lad os se, hvor afhængigheden injektion kan hjælpe os med at løse dette problem., 2.injektion af afhængighed, som jeg nævnte i indledningen, afhængighed, opløsning er et meget enkelt begreb.james land har skrevet en stor artikel om forenkling af afhængighed injektion.der er et andet citat fra james land om, hvad afhængighed injektion er på et meget centralt.,, afhængighed injektion betyder, at et objekt sit eksempel variabler.virkelig.det er det.- james kyst, er der en række metoder til at opnå dette, men det er vigtigt at forstå, hvad ovenstående citat.lad os se, hvordan vi kan anvende den på den, viewcontroller, klasse, i stedet for at få adgang til den manglende anmeldelse center i den lokalitet, metode gennem  , defaultcenter, klasse metode, skaber vi en ejendom i meddelelsen center i  , viewcontroller, klasse.det er, hvad de ajourførte grænseflade for, viewcontroller, klasse ser ud efter denne tilføjelse.,,&#import < uikit /uikit. h > @ grænseflade viewcontroller: uiviewcontroller @ ejendom (svag, nonatomic) nsnotificationcenter * defaultcenter; @ ende, betyder det også, at vi er nødt til at gøre en smule ekstra arbejde, når vi aktivere et tilfælde af, viewcontroller, klasse.som james skriver vi side, viewcontroller, f.eks. dens instans variabler.det er, hvordan simple afhængighed - injektion.det er et fint navn til en   enkle koncept. //påbegynd opfattelse registeransvarlige viewcontroller * viewcontroller = [[viewcontroller forpl] lokalitet]; //konfigurere opfattelse registeransvarlige [viewcontroller setnotificationcenter: [nsnotificationcenter defaultcenter]], som følge af denne ændring, gennemførelsen af den, viewcontroller, klasse ændringer.det er, hvad den lokalitet, og dealloc metoder ligner, når du injicerer misligholdelse meddelelse center.,,&#pragma mark -&#pragma mark initialization - (instancetype) lokalitet (self - = [super lokalitet]; hvis (selvstændige) ([self.notificationcenter addobserver: selv vælger: @ vælgeren (applicationwillenterforeground:) navn: uiapplicationwillenterforegroundnotification formål: nul]} tilbage selv;}&#pragma mark -&#pragma mark hukommelse management - (indhold) dealloc ([_notificationcenter removeobserver: selv]}, bemærke, at vi ikke bruger, selv i den, dealloc metode.det er som en dårlig praksis, da det kan føre til uventede resultater., der er et problem.kan du se det?i initializer af, viewcontroller, klasse, vi har adgang til, notificationcenter, ejendom, at tilføje for registeransvarlige, som observatør.i initialization imidlertid det, notificationcenter, ejendom er ikke fastsat endnu.vi kan løse dette problem ved at vedtage den afhængighed, som parameter for initializer.det er, hvad det ligner.,,&#pragma mark -&#pragma mark initialization - (instancetype) initwithnotificationcenter: (nsnotificationcenter *) notificationcenter (self - = [super lokalitet]; hvis (selvstændige) (//sæt meddelelse center [selv setnotificationcenter: notificationcenter]; //add observatør [self.notificationcenter addobserver: selv vælger. @ vælgeren (applicationwillenterforeground:) navn: uiapplicationwillenterforegroundnotification formål: nul]} tilbage selv.}, at få det til at fungere, er vi også nødt til at ajourføre den grænseflade for, viewcontroller, klasse.vi udelader det, notificationcenter, ejendom og tilføje en metode for erklæring om initializer skabte vi.,,&#import < uikit /uikit. h > @ grænseflade viewcontroller: uiviewcontroller&#pragma mark -&#pragma mark initialization - (instancetype) initwithnotificationcenter: (nsnotificationcenter *) notificationcenter; @ ende i gennemførelsen fil, skaber vi en klasse udvidelse, som vi erklærer, notificationcenter, ejendom.ved at gøre det, notificationcenter, ejendom er private til, viewcontroller, klasse og kan kun fastsættes med henvisning til den nye initializer.dette er endnu en bedste praksis for at huske på, at kun udsætte egenskaber skal være offentlige.,,&#import "viewcontroller. h" @ grænseflade viewcontroller () @ ejendom (stærk, nonatomic) nsnotificationcenter * notificationcenter; @ ende, instantiate et tilfælde af, viewcontroller, klasse, vi stoler på initializer vi skabte tidligere. //påbegynd opfattelse registeransvarlige viewcontroller * viewcontroller = [[viewcontroller forpl] initwithnotificationcenter: [nsnotificationcenter defaultcenter]], 3.fordele, hvad har vi opnået ved udtrykkeligt at injicere meddelelse center objekt som en afhængighed.,, klarhed, grænseflade for, viewcontroller, klasse utvetydigt viser, at klasse er baseret, eller afhænger af, nsnotificationcenter, klasse.hvis du er ny til programmerbare eller os x udvikling, dette kan synes at være en lille sejr for den kompleksitet, tilføjede vi.men, som din projekter bliver mere komplekse, vil du lære at sætte pris på hver eneste del af klarhed kan du tilføje et projekt.udtrykkeligt at erklære afhængighed vil hjælpe dig.,, modularitet,, når du begynder at bruge afhængighed injektion, din kode, vil blive meget mere modulære.selv om vi gav en særlig kategori i, viewcontroller, klasse, er det muligt at tilføre et objekt, der er i overensstemmelse med en specifik protokol.hvis man anvender denne metode, vil det blive meget lettere at erstatte en gennemførelse med en anden.,,&#import < uikit /uikit. h > @ grænseflade viewcontroller: uiviewcontroller @ ejendom (stærk, nonatomic) id < myprotocol > someobject;&#pragma mark -&#pragma mark initialization - (instancetype) initwithnotificationcenter: (nsnotificationcenter *) notificationcenter; @ ende i ovennævnte grænseflade for, viewcontroller, klasse, erklærer vi, en afhængighed.denne afhængighed er et objekt, der svarer til den, myprotocol,   protokol.det er, hvor den sande magt af afhængighed injektion bliver synligt.det, viewcontroller, klasse er ligeglad med den type, someobject, det beder kun om at det vedtager den, myprotocol, protokol.det gør for meget modulopbygget, fleksibel og testes kode.,, afprøvning, selv om testning er ikke så udbredt blandt os x 105 og udviklere, som i andre samfund, kontrol er et centralt emne, der vinder i betydning og popularitet.ved at vedtage afhængighed injektion, vil du få din kode meget lettere at prøve.hvordan vil du prøve følgende initializer?det bliver svært.ikke?,,&#pragma mark -&#pragma mark initialization - (instancetype) lokalitet (self - = [super lokalitet]; hvis (selvstændige) (nsnotificationcenter * nc = [nsnotificationcenter defaultcenter]; [nc: selv addobserver gearvælgeren: @ vælgeren (applicationwillenterforeground:) navn: uiapplicationwillenterforegroundnotification formål: nul]} tilbage selv;} den anden initializer, men gør denne opgave meget lettere.tag et kig på initializer og test, der går med det,&#pragma mark -&#pragma mark initialization - (instancetype) initwithnotificationcenter: (nsnotificationcenter *) notificationcenter (self - = [super lokalitet]; hvis (selvstændige) (//sæt meddelelse center [selv setnotificationcenter: notificationcenter]; //add observatør [self.notificationcenter addobserver: selv vælger: @ vælgeren (applicationwillenterforeground:) navn: uiapplicationwillenterforegroundnotification formål: nul]} tilbage selv.},,&#pragma mark -&#pragma mark test for initialization - (indhold) testinitwithnotificationcenter (//skabe falsk anmeldelse center id mocknotificationcenter = ocmclassmock ([nsnotificationcenter klasse]); //sæt lyset registeransvarlige viewcontroller * viewcontroller = [[viewcontroller forpl] initwithnotificationcenter: mocknotificationcenter] xctassertnotnil (viewcontroller, @ "for registeransvarlige, bør ikke være nul.") ocmverify ([mocknotificationcenter addobserver: viewcontroller vælgeren: @ vælgeren (applicationwillenterforeground:) navn: uiapplicationwillenterforegroundnotification genstand: nul]);}, ovennævnte prøve gør brug af ocmock bibliotek, en fremragende håner bibliotek for objective-c. i stedet for nærlys i tilfælde af, nsnotificationcenter, klasse, vi vedtager i en hån imod og kontrollere, om de metoder, der skal anvendes i initializer erpåberåbes, er der flere metoder til at teste meddelelse håndtering, og det er den letteste, jeg har mødt.det er en smule op ved at indsprøjte anmeldelsen center objekt som en afhængighed, men fordelen opvejer den øgede kompleksitet i min udtalelse.,, 4.tredjemand løsninger, håber jeg, at jeg har overbevist dem om, at afhængighed er en enkelt injektion koncept med en enkel løsning.der er imidlertid en række populære rammer og biblioteker, der har til formål at gøre afhængighed injektion mere magtfuld og lettere at forvalte komplekse projekter.de to mest populære biblioteker er typhoon og indvendinger.,, hvis du er ny afhængighed injektion, så anbefaler jeg, at begynde at anvende teknikker som beskrevet i denne forelæsning.du er nødt til at forstå begrebet før brug af tredjemand opløsning, såsom tyfon eller indsigelse.,, konklusion, at målet med denne artikel var at gøre afhængighed injektion lettere at forstå for folk, der er nye programmerings - og bekendt med begrebet.jeg håber, at jeg har overbevist dem om værdien af afhængighed - injektion og forenkling af den idé, der ligger til grund, er der en række gode ressourcer om afhængighed injektion.james kyst er artikel om afhængighed injektionsvæske er en skal læse for nogen.graham lee skrev også en stor artikel med henblik på 105 og os x udviklere.



Previous:
Next Page: