Inversjon av kontroll og avhengighetsinjeksjon i Java / vår

Innholdsfortegnelse
Dette er den fjerde delen av en serie opplæringsprogrammer som fokuserer på å gjennomgå de grunnleggende temaene i Java -språket for å forberede leseren i bruk av Spring Framework. Den første delen av denne opplæringsserien kan fås her, den andre delen kan fås her og den tredje delen her. I denne opplæringen vil vi se to grunnleggende konsepter som vi må håndtere hvis vi vil bruke Spring riktig: Inversion of Control and Dependency Injection.
Først og fremst vil jeg presisere at disse begrepene er mye bedre forklart av Martin Fowler i denne artikkelen og oversatt til spansk på denne siden, men min intensjon er å prøve å oppsummere konseptet for å gjøre det lett å forstå og spare deg for litt å lese artikkelen (selv om du er hjertelig invitert til å lese den hvis du har flere spørsmål).
Begrepet er relativt nylig, men det er et programmeringsmønster som går tilbake til de programmene som er opprettet ved hjelp av ren sekvensiell programmering, der en enkelt programmerer (eller gruppe programmerere) satte seg ned for å skrive en serie trinn eller beregningsinstruksjoner som skulle utføres i perfekt form sekvens. fra start til slutt med den hensikt å få et siste resultat.
På dette tidspunktet (tror ikke det var mange år siden) kom samtalene til metodene og bibliotekene alltid fra en sentral kilde som hadde ansvaret for å manipulere alle variablene i det samme programmet. Senere ble det utviklet grafiske grensesnitt som hadde ansvaret for å administrere datainngangene til programmet, mens programmets hovedflyt hadde ansvaret for å skaffe håndtere hendelser som skjedde i det grafiske grensesnittet (aktiverer noe når du klikker, trykker på denne tasten , beveger musen, etc.) mens grensesnittet er i en konstant sløyfe. På denne måten er kontrollen over programmet reversert, det grafiske grensesnittet har ansvaret for å varsle hovedflyten om hva du skal gjøre og hvordan du trenger å vite nøyaktig HVORDAN det gjøres.
Hvis du merker det, kan grensesnitt i Java hjelpe deg med å overføre kontroll over et program til eksterne agenter, men konseptet gjelder for demontråder som venter på at en hendelse skal skje, en klasse som er ansvarlig for å installere og levere implementeringer av andre klasser til programmet (fabrikkmønster) og egentlig et hvilket som helst mønster som tillater overføring av kontroll av programmet til en ekstern agent.
Det er en spesiell type inversjon av kontroll der en klasse A ikke vet hvilket objekt den skal bruke i øyeblikket den blir kompilert, men bare kjenner handlingene den må utføre med det objektet. La oss anta følgende klasse (som er basert på klassene som ble opprettet i min forrige opplæring):
 offentlig klasse Tegner {offentlig plass; offentlig tegneserieskaper () {square = new Square (); } offentlig tomrom MasterDraw () {square.Draw (); }} 

Som du vil se, er denne "Tegner" -klassen helt avhengig av "Square" -klassen siden den har ansvaret for livssyklusen til det firkantede objektet som den senere vil bruke. Denne måten å opprette en "Tegner" -klasse på er veldig upraktisk, fordi hvis vi senere ville at tegneren skulle tegne rektangler eller trekanter, måtte vi endre grunnkoden for å gjøre det.
I stedet kan vi lage en mer gjenbrukbar klasse hvis vi implementerer "Drawable" -grensesnittet som vi opprettet i forrige opplæring:
 offentlig klasse Tegner {offentlig Tegning som kan tegnes; offentlig tegner (tegnbar d) {tegning = d; } offentlig tomrom MasterDrawing () {drawing.Drawing (); }} 

På denne måten "kontrollerer" ikke objektene i "Tegner" -klassen objektet de må tegne, men vet bare at det implementerer Drawable -grensesnittet og senere disse "Tegner" -objektene som jeg vil lage i applikasjonen min eller at noen ellers blir brukt i et program som får tilgang til objektbiblioteket mitt, de er perfekt i stand til å motta ethvert objekt som implementerer "Drawable" -grensesnittet.
I det forrige eksemplet bruker vi det som er kjent som "Konstruktørinjeksjon" siden avhengigheten injiseres på konstruktornivå, men du kan også injisere avhengigheten gjennom "Setters", eller på andre programmeringsspråk kan du injisere parametrene eller grensesnittene (I Java kan du ikke endre parametrene eller grensesnittene som godtar en metode ved kjøretid, men Python tillater for eksempel metoder å godta parametere uten å spesifisere typen parametere.)
 offentlig klasse Tegner {offentlig Tegning som kan tegnes; public void setDrawing (Drawable d) {drawing = d; } offentlig tomrom MasterDrawing () {drawing.Drawing (); }} 

De avhengighetsinjeksjon muliggjør i hovedsak en separasjon av funksjonene til programmet ditt. Denne uavhengigheten lar deg teste klassene dine uten (verdt å gjenta) klassen din er knyttet til noe. Denne uavhengigheten er en av de viktigste delene å bruke Vår, komponentene avhenger av rammeverket og ikke av programmet, du kan lage objekter som eksisterer utenfor applikasjonen din og bare bruke dem når du trenger dem.
Fra den neste opplæringen vil vi begynne å jobbe direkte med Spring, og du vil se hvordan alle konseptene vi har sett så langt er relatert til driften, og lar deg skaffe deg nødvendig kompetanse på kort tid.
Jeg venter på kommentarene dine, til neste gang!Likte og hjalp du denne opplæringen?Du kan belønne forfatteren ved å trykke på denne knappen for å gi ham et positivt poeng

Du vil bidra til utvikling av området, dele siden med vennene dine

wave wave wave wave wave