Co je Inverze Control?

hlasů
1k

Inverze Control (MOV), nebo může být docela matoucí, když se poprvé setkali.

  1. Co je to?
  2. Jaké problémy to vyřešit?
  3. Je-li to vhodné a kdy ne?
Položena 06/08/2008 v 04:35
zdroj uživatelem
V jiných jazycích...                            


32 odpovědí

hlasů
1k

Inverze Control (IOC) a závislost injekce (DI) vzory jsou o odebrání závislostí z kódu.

Řekněme například, že aplikace má komponenta textového editoru a chcete zajistit kontrolu pravopisu. Vaše standardní kód bude vypadat nějak takto:

public class TextEditor {

    private SpellChecker checker;

    public TextEditor() {
        this.checker = new SpellChecker();
    }
}

To, co jsme udělali tu vytváří závislost mezi TextEditora SpellChecker. Ve scénáři MOV bychom místo toho něco takového:

public class TextEditor {

    private IocSpellChecker checker;

    public TextEditor(IocSpellChecker checker) {
        this.checker = checker;
    }
}

V prvním příkladu kódu jsme instance SpellChecker( this.checker = new SpellChecker();), což znamená, že TextEditortřída je přímo závislá na SpellCheckertřídě.

Ve druhém příkladu kódu vytváříme abstrakce tím, že má SpellCheckertřídu závislost v TextEditorkonstruktoru podpisem (ne inicializace závislost ve třídě). To nám umožňuje volat závislost pak ji přenést do třídy textový editor, jako je takto:

SpellChecker sc = new SpellChecker; // dependency
TextEditor textEditor = new TextEditor(sc);

Nyní klient vytváří TextEditortřídu má kontrolu nad tím, SpellCheckerimplementace použít, protože jsme vstřikování závislost k TextEditorpodpisu.

Toto je jen jednoduchý příklad, je tu dobrá série článků Simone Busoli tím se to vysvětluje podrobněji.

Odpovězeno 06/08/2008 v 08:22
zdroj uživatelem

hlasů
485

Inverze Control je to, co dostanete, když váš program zpětná volání, například jako GUI programu.

Například ve staré školní jídelníček, budete muset:

print "enter your name"
read name
print "enter your address"
read address
etc...
store in database

čímž se řídí tok uživatele.

V GUI programu nebo něco takovýho, místo toho říkáme

when the user types in field a, store it in NAME
when the user types in field b, store it in ADDRESS
when the user clicks the save button, call StoreInDatabase

Takže nyní ovládají je převrácený ... namísto počítače přijetím vstupu uživatele v pevném pořadí, uživatel ovládá pořadí, ve kterém se zadává data, a když jsou data uložena v databázi.

V podstatě cokoliv se smyčkou událostí, zpětná volání, nebo provést triggery spadá do této kategorie.

Odpovězeno 06/08/2008 v 06:42
zdroj uživatelem

hlasů
356

Co je Inverze Control?

Pokud se budete držet těchto jednoduchých dva kroky, které jste udělali inverze kontroly:

  1. Oddělená co -to-nerozdělí od kdy -to-nerozdělí.
  2. Ujistěte se, že když část ví, jak málo , jak je to možné o jakou část; a vice versa.

Existuje několik možných technik pro každý z těchto kroků založených na technologii / jazyka používaného pro implementaci.

-

Inverze část Inverze Control (MOV) je složitá záležitost; protože inverze je relativní pojem. Nejlepší způsob, jak pochopit, IOC je zapomenout na to slovo!

-

Příklady

  • Manipulace události. Psovodi událostí (co-to-udělat díl) - zvýšení akce (když-to-udělat díl)
  • Rozhraní. Klient komponenta (když-to-udělat díl) - implementace rozhraní pro jednotlivé komponenty (co-to-udělat díl)
  • xUnit fixure. Nastavení a demontáže (co-to-udělat díl) - xUnit rámců volání Setup na začátku a demontáže na konci (je-li k dělat část)
  • Šablona metoda návrhový vzor. Vzorová metoda, kdy k nerozdělí - primitivní implementaci podtřídy co-to-nerozdělí
  • DLL kontejnerové metody COM. DllMain, DllCanUnload, etc (co-to-udělat díl) - KOM / OS (je-li k nerozdělí)
Odpovězeno 22/07/2010 v 18:34
zdroj uživatelem

hlasů
81

Inverze kontrol je o separaci obavy.

Bez IoC : Máte přenosný počítač a náhodou zlomit obrazovky. A látat, najdete ve stejné obrazovce modelu notebooku není nikde na trhu. Takže nevíte jak dál.

S IoC : Máte stolní počítač a jste omylem rozbít obrazovku. Zjistíte, že můžete jen chytit téměř jakýkoli pracovní plochy monitoru z trhu, a funguje to dobře s vaší pracovní ploše.

Váš desktop úspěšně realizuje IOC v tomto případě. Přijímá typ škálu monitorů, zatímco laptop není, je třeba zvláštní obrazovku, aby se opravit.

Odpovězeno 25/09/2013 v 15:24
zdroj uživatelem

hlasů
77

Inverze Control, (nebo IOC), je asi dostat svobodu (Můžete vzít, jste ztratili svobodu a ty jsou ovládány. Můžete se rozvedli, který jste právě realizované Inverze Control. To je to, co jsme nazvali „oddělené“. Dobrý počítačový systém odrazuje některé velmi blízký vztah.) větší flexibilitu (v kuchyni ve vaší kanceláři slouží pouze čistou vodu z vodovodu, která je jedinou volbou, pokud chcete pít. váš šéf realizován Inverze Control zřízením nového kávovaru. Nyní dostanete flexibilita výběru buď vodu z vodovodu nebo kávu.) a menší závislost (váš partner má práci, nemáte práci, je finančně závislá na svého partnera, takže jsou řízeny. Můžete najít práci, jste implementovali Inverze ovládání. Dobrá počítačový systém podporuje in-závislost.)

Používáte-li stolní počítač, jste podřízen (nebo říkat, řízené). Budete muset sednout před obrazovku a podívat se na něj. Pomocí klávesnice typu a myší k navigaci. A špatně napsaný software vám otrocké ještě víc. Máte-li nahradit váš desktop s notebookem, pak poněkud převrácený kontrolu. Můžete snadno vzít a pohybovat. Takže teď můžete řídit, kde jste s počítačem, namísto počítač ji ovládající.

Realizací Inverze Control, software / objekt spotřebitel získat další ovládací prvky / volby přes Software / předměty, místo toho, aby řízené nebo mají méně možností.

S výše uvedenými myšlenkami v mysli. Stále nám chybí klíčovou součástí MOV. Ve scénáři MOV, software / objekt spotřebitel je sofistikovaný rámec. To znamená, že kód, který jste vytvořili není volána sami. Nyní se pojďme vysvětlit, proč tento způsob funguje lépe pro webové aplikace.

Předpokládejme, že váš kód je skupina pracovníků. Je třeba, aby postavit auto. Tito pracovníci potřebují místo a nástroje (rámcovou software) postavit auto. Tradiční software rámec bude jako garáž s mnoha nástrojů. Takže pracovníci musí vymyslet plán sebe a používat nástroje k vytvoření auto. Budování auto není jednoduchá záležitost, bude to opravdu těžké pro pracovníky plánovat a správně spolupracovat. Moderní software rámec bude vypadat moderní automobilky s veškerým zařízením a manažerů na svém místě. Dělníci nemají dělat žádný plán, manažeři (součástí rámce, jsou nejchytřejší lidi a dělal nejdokonalejší plán), pomůže koordinovat tak, aby se pracovníci vědí, kdy se dělat svou práci (rámcová volá váš kód). Pracovníci stačí být dostatečně flexibilní, aby se používat jakékoliv nástroje manažeři dát jim (pomocí závislost injekce).

Ačkoli pracovníci dávají kontrolu nad řízením projektu na nejvyšší úrovni k manažerů (rámec). Ale je dobré mít někteří profesionálové pomoct. Jedná se o koncept MOV skutečně pocházejí.

Moderní webové aplikace s MVC architekturou závisí na struktuře dělat URL Směrování a dát správcům v místě rámec pro volání.

Závislost injekce a Inversion of Control spolu souvisejí. Závislost injekce je na mikro úrovni a Inverze Control je na makro úrovni. Musíte jíst každé sousto (implementovat DI) s cílem dokončit jídlo (realizaci MOV).

Odpovězeno 04/03/2013 v 20:33
zdroj uživatelem

hlasů
72

Před použitím Inverze Control byste měli být dobře vědomi skutečnosti, že má své klady a zápory, a měli byste vědět, proč jste ji použít, pokud tak učiníte.

Klady:

  • Váš kód dostane odděleny, takže můžete snadno vyměňovat implementace rozhraní s alternativními implementací
  • Je silný motivátor pro kódování proti rozhraní namísto implementací
  • Je to velmi snadné psát jednotkové testy pro váš kód, protože to závisí na tom nic jiného než objekty účely přijímá ve svém konstruktoru / tvůrci a můžete snadno inicializovat je s těmi správnými objekty v izolaci.

Nevýhody:

  • MOV nejen obrátí tok kontrola ve svém programu, ale také to výrazně mraky. To znamená, že můžete již jen číst váš kód a skok z jednoho místa na druhé, protože spoje, které by za normálních okolností v kódu nejsou v kódu ještě. Namísto toho je v konfiguračních souborů XML a anotace a v kódu svého MOV kontejner, který interpretuje tato metadata.
  • Vyvstává novou třídu chyb, kde vám vaše XML config nebo anotace špatné a můžete strávit spoustu času zjistit, proč se vaše MOV kontejner vstřikuje null odkaz do jedné ze svých objektů za určitých podmínek.

Osobně vidím silné stránky MOV a opravdu mi líbí, ale mám tendenci, aby se zabránilo MOV kdykoli je to možné, protože to změní váš software do kolekce tříd, které již představují „skutečné“ program, ale jen něco, co je třeba dát dohromady konfiguraci XML nebo anotace metadata a padne (a padá) od sebe, aniž by to.

Odpovězeno 12/02/2010 v 15:31
zdroj uživatelem

hlasů
55
  1. Wikipedia článek . Pro mě je inverze kontroly se otáčeli postupně písemný kód a převést ji do struktury delegace. Místo toho, aby váš program výslovně ovládající všechno, váš program nastaví třídu nebo knihovnu s určitými funkcemi, které mají být volána, když se určité věci dějí.

  2. Řeší duplicitu kódu. Například za starých časů byste ručně napsat vlastní akce smyčky, dotazování systémové knihovny pro nové události. V dnešní době, většina moderních API jednoduše říci systémových knihoven, jaké události, které vás zajímají, a dáme vám vědět, kdy k nim dochází.

  3. Inverze ovládání je praktický způsob, jak snížit duplicita kódu, a pokud si najdete sami kopírování celého způsobu a pouze změna malý kousek kódu, můžete zvážit s ním vypořádat se převracením kontroly. Inverze ovládání je snadné v mnoha jazycích prostřednictvím konceptu delegátů, rozhraní, nebo dokonce syrové ukazatelů funkcí.

    Není vhodné použít ve všech případech, protože tok programu může být těžší řídit, když napsal tento způsob. Je to užitečný způsob, jak navrhnout metody při psaní knihovnu, která bude opětovně použit, ale měl by být používán šetrně v jádru svého vlastního programu, pokud je to opravdu řeší problém kód duplikace.

Odpovězeno 06/08/2008 v 05:33
zdroj uživatelem

hlasů
38

Ale myslím, že musíte být velmi opatrní s tím. Budete-li nadužívání tohoto modelu, budete dělat velmi složitý design a ještě složitější kód.

Stejně jako v tomto případě se textový editor: Pokud máte pouze jeden Spellchecker možná to není opravdu nutné používat MOV? Pokud nepotřebujete psát unit testy, nebo tak něco ...

Mimochodem: za přiměřené. Návrhový vzor jsou osvědčené postupy , ale ne Bible, aby bylo kázáno. Neber si to držet všude.

Odpovězeno 06/08/2008 v 23:08
zdroj uživatelem

hlasů
34

Předpokládejme, že máte objekt. A jdete do restaurace:

Bez IoC : můžete požádat o „jablko“, a ty jsou vždy podávány jablko, když se zeptáte více.

S IoC : Můžete požádat o „ovoce“. Můžete získat různých druhů ovoce pokaždé, když vám sloužil. je například jablko, pomeranč nebo vodní meloun.

Takže, samozřejmě, IOC je výhodný, pokud se vám líbí odrůdy.

Odpovězeno 25/09/2013 v 15:00
zdroj uživatelem

hlasů
34

MOV / DI na mě tlačí ven závislosti volajícímu objektů. Super jednoduché.

Non-techy odpověď je možnost vyměnit motor v autě těsně předtím, než jej zapnete. Je-li vše zavěsí právo (rozhraní), jste dobří.

Odpovězeno 19/09/2008 v 03:54
zdroj uživatelem

hlasů
23
  1. Inverze řízení je vzor použit pro oddělení složek a vrstev v systému. Vzor se provádí prostřednictvím vstřikování závislosti na komponenty, když je postavena. Tato závislost se obvykle poskytovány jako rozhraní pro další oddělení a podpořit testovatelnosti. MOV / DI kontejnery, jako je hrad Windsor, Unity jsou nástroje (knihovny), které mohou být použity pro poskytnutí MOV. Tyto nástroje poskytují rozšířené funkce nad rámec jednoduchého řízení závislostí, včetně doby životnosti, AOP / odposlechu, politika, atd.

  2. A. Zmírňuje součást z odpovědnosti za správu je to závislostí.
    b. Poskytuje možnost vyměnit implementace závislost v různých prostředích.
    C. Umožňuje komponenta být testována prostřednictvím Posmívání závislostí.
    d. Poskytuje mechanismus pro sdílení zdrojů v celé aplikaci.

  3. A. Kritická, když dělá testy řízený vývoj. Bez IoC to může být obtížné testovat, protože složky v rámci testu jsou velmi spojený se zbytkem systému.
    b. Kritická při vývoji modulárních systémů. Modulární systém je systém, jehož komponenty mohou být nahrazeny bez nutnosti recompilation.
    C. Kritická, pokud existuje mnoho průřezových obavy, které musí řešit, partilarly v podnikové aplikace.

Odpovězeno 19/09/2008 v 03:27
zdroj uživatelem

hlasů
17

I sepíše svou jednoduchou chápání těchto dvou podmínek:

For quick understanding just read examples*

Závislost injekce (DI):
Závislost injekce se obecně rozumí předáním objekt, v němž způsob závisí, jako parametr způsobu, spíše než způsob vytvoření závislý objekt .
Co to znamená v praxi je, že tento způsob není přímo závislá na konkrétní implementaci; jakákoli implementace, která splňuje požadavky může být předán jako parametr.

S tímto objekty říct Thier závislostí. A na jaře je to k dispozici.
To vede k volně vázané vývoj aplikací.

Quick Example:EMPLOYEE OBJECT WHEN CREATED,
              IT WILL AUTOMATICALLY CREATE ADDRESS OBJECT
   (if address is defines as dependency by Employee object)

Inverze Control (MOV) Kontejner:
Toto je společná charakteristika rámců, MOV řídí Java objekty
- z instance k destrukci prostřednictvím BeanFactory.
-Java součásti, které jsou vytvořeny instance kontejneru MOV se nazývají fazole a kontejner MOV řídí rozsah fazole je, životního cyklu události a případné AOP vlastnosti , pro které byl nakonfigurován a kódované.

QUICK EXAMPLE:Inversion of Control is about getting freedom, more flexibility, and less dependency. When you are using a desktop computer, you are slaved (or say, controlled). You have to sit before a screen and look at it. Using keyboard to type and using mouse to navigate. And a bad written software can slave you even more. If you replaced your desktop with a laptop, then you somewhat inverted control. You can easily take it and move around. So now you can control where you are with your computer, instead of computer controlling it,

Realizací Inverze Control, software / objekt spotřebitel získat další ovládací prvky / volby přes Software / předměty, místo toho, aby řízené nebo mají méně možností.

Inverze kontroly jako vodítko konstrukce slouží k těmto účelům:

Tam je oddělení výkonu určitého úkolu z implementace.
Každý modul může soustředit na to, co je určen.
Moduly provádět žádné předpoklady o tom, co ostatní systémy dělat, ale spoléhat na jejich smluv.
Výměna modulů nemá žádné vedlejší účinky na ostatní moduly
budu držet věci zde abstraktní, můžete navštívit následující odkazy na detailní pochopení tématu.
Dobrý čtení s příkladem

podrobné vysvětlení

Odpovězeno 10/11/2014 v 08:43
zdroj uživatelem

hlasů
15

Například, úkol # 1 je vytvořit objekt. Bez IOC konceptu úkol # 1 má být provedeno Programmer.But S IOC konceptu, úkol # 1 bude provedeno kontejneru.

Stručně řečeno Dostane obráceně od programátoru do nádoby. Tak, to je nazýváno jako inverze kontroly.

Zjistil jsem, jeden dobrý příklad zde .

Odpovězeno 27/01/2010 v 13:15
zdroj uživatelem

hlasů
14

Zodpovězení pouze první část. Co je to?

Inverze Control (MOV), prostředky pro vytváření instance závislostí první a druhé instance třídy (případně je vstřikování prostřednictvím montážního závodu), namísto vytváření instance třídy a pak instance třídy vytvoření instance závislostí. Tak, inverze kontroly invertuje na tok řízení programu. Místo toho, aby se volaného ovládající na tok řízení (při vytváření závislostí) je volající řídí tok řízení programu .

Odpovězeno 11/01/2016 v 00:49
zdroj uživatelem

hlasů
14

Zdá se, že nejvíce matoucí věc jen „MOV“ zkratky a název na kterých stojí, že je to příliš okázalý názvu - téměř názvu hluku.

Opravdu potřebujeme jméno, podle kterého chcete popsat rozdíl mezi procesním a událostmi řízeného programování? OK, pokud potřebujeme, ale potřebujeme, aby si vybral zcela nové jméno „větší než život“, která plete víc než to vyřeší?

Odpovězeno 19/01/2011 v 04:50
zdroj uživatelem

hlasů
13

Dovolte říci, že děláme nějakou schůzku v nějakém hotelu.

Mnoho lidí, mnoho karafy vody, mnoho plastové kelímky.

Když někdo chce napít, ona vyplnit šálkem, pít a hodit šálek na podlaze.

Po hodině nebo tak něco máme podlaha pokryta z plastových kelímků a vody.

Nechť ovládání obracení.

Na této schůzi ve stejném místě, ale namísto plastových kelímků máme číšníka s jedním skleněná baňka (Singleton)

a ona se celý čas nabízí hostům pití.

Když někdo chce pít, dostala od číšník sklářských, pít a vrátit jej zpět na číšníka.

Ponecháme-li stranou otázku, hygienické, poslední forma kontroly pitné procesů je mnohem efektivnější a ekonomičtější.

A to je přesně to, co Spring (další kontejner MOV, například: Guice) dělá. Místo toho, aby nechal aplikaci vytvořit to, co je potřeba používat nové klíčové slovo (s plastový kelímek), jaro MOV kontejner všechny nabídky času na aplikaci stejné instance (singleton) potřebného předmětu (sklenicí vody).

Přemýšlejte o sobě jako organizátor tohoto setkání. Budete potřebovat způsob, jak poselství správu ubytovacích zařízení, které

setkání členů bude potřebovat sklenici vody, ale ne kus dortu.

Příklad:-

public class MeetingMember {

    private GlassOfWater glassOfWater;

    ...

    public void setGlassOfWater(GlassOfWater glassOfWater){
        this.glassOfWater = glassOfWater;
    }
    //your glassOfWater object initialized and ready to use...
    //spring IoC  called setGlassOfWater method itself in order to
    //offer to meetingMember glassOfWater instance

}

Užitečné odkazy:-

Odpovězeno 26/09/2012 v 18:54
zdroj uživatelem

hlasů
13

Souhlasím s NilObject , ale já bych rád dodal toto:

pokud se ocitnete kopírování celého způsobu a pouze změna malý kousek kódu, můžete zvážit s ním vypořádat s inverzí ovládání

Pokud zjistíte, že kopírování a vkládání kódu kolem, jste téměř vždy dělá něco špatného. Kodifikováno jako konstrukčního principu jednou a pouze jednou .

Odpovězeno 06/08/2008 v 06:20
zdroj uživatelem

hlasů
10

MOV je o převrácením vztah mezi kódu a kódu třetích stran (knihovna / rámce):

  • Za normálních s / w vývoj, psaní main () metodu a volání metody „Knihovna“. Máte vše pod kontrolou :)
  • V IoC dále jen „rámec“ řídí main () a volá vaše metody. Framework je pod kontrolou :(

DI (závislost injekce) je o tom, jak kontrola toků v aplikaci. Tradiční desktopové aplikace měl tok řízení z aplikace (metodě main ()) na jiné metody knihovna volání, ale s DI řízení toku je převrácený to rámec pečuje o spuštění aplikace, inicializaci a vyvolání vaše metody bude v případě potřeby.

Na konci vždy vyhrát :)

Odpovězeno 19/09/2014 v 19:25
zdroj uživatelem

hlasů
7

Inverze řízení je obecný princip, přičemž závislost injekce realizuje tuto zásadu jako konstrukční vzor pro objekt graf konstrukce (tj kontroly konfigurace, jak jsou objekty odkazování na sebe, spíše než samotného objektu ovládající, jak se dostat na odkaz na jiný objekt).

Podíváme-li se Inverze Control jako návrhový vzor, ​​musíme se podívat na to, co jsme převrácením. Závislost injekce obrátí kontrolu nad konstrukci graf objektů. -Li řečeno z hlediska laického, inverze kontroly naznačuje změnu v toku řízení v programu. Např. V tradiční samostatné aplikace, máme hlavní metodu, odkud ovládání je předán do jiných knihoven třetích stran (v případě, že jsme použili funkci knihovny třetí strana), ale díky inverzi kontroly kontrolního dostane převedeny z knihovny kódu třetí strany do našeho kódu , jak jsme službu knihovny třetí strany užívat. Existují však i jiné aspekty, které je třeba převrácený v rámci programu - např vyvolání metod a nitě spustit kód.

Pro zájemce o větší hloubky o Inverze Control má dokument byl zveřejněn navrhovat úplnější obraz Inverze Control jako návrhový vzor (OfficeFloor: pomocí kancelářské vzory zlepšit design softwaru http://doi.acm.org/10.1145/ 2739011.2739013 s volným kopii k dispozici ke stažení z http://www.officefloor.net/mission.html )

Jaký je identifikován následující vztah:

Inverze Control (pro metody) = závislost (stát) Injekce + Pokračování Injekce + závit Injekce

Odpovězeno 29/10/2015 v 04:27
zdroj uživatelem

hlasů
7

programování mluvící

MOV v výhodných podmínek: Je to použití rozhraní jako způsob, jak konkrétní něco (takovém poli nebo parametr) jako zástupný znak, který může být použit některými třídami. To umožňuje re-použitelnost kódu.

Například, řekněme, že máme dvě třídy: psa a kočku . Oba sdílí stejné vlastnosti / uvádí: věk, velikost, hmotnost. Takže namísto vytváření třídu služby s názvem DogService a CatService , mohu vytvořit jediný jeden s názvem AnimalService , která umožňuje používat pro psy a kočky pouze v případě, že používají rozhraní IAnimal .

Nicméně, pragmaticky vzato, to má některé dozadu.

a) Většina vývojáři nevědí, jak ji používat . Například lze vytvořit třídu s názvem Customer a mohu vytvořit automaticky (s využitím nástrojů IDE) rozhraní s názvem ICustomer . Tak, to není vzácné najít složku naplněnou tříd a rozhraní, bez ohledu na to v případě, že rozhraní bude znovu použít, nebo ne. Říká se tomu nafouklý. Někteří lidé by se tvrdit, že „může být v budoucnu bychom ho mohli využít.“ : - |

b) Má nějaké limitings. Například, pojďme mluvit o případu Pes a kočka a já chci přidat novou službu (funkci), pouze pro psy. Řekněme, že chci vypočítat počet dní, po které musím cvičit psa ( trainDays()), pro kočky je to k ničemu, kočky nemohou být vyškoleni (já srandu).

b.1) Když přidám trainDays()do servisního AnimalService pak to funguje také s kočkami a to neplatí vůbec.

b.2) mohu přidat podmínku trainDays(), kdy vyhodnotí, která třída je používána. Ale to bude přestávka zcela MOV.

b.3) mohu vytvořit novou třídu službě s názvem DogService jen pro nové funkce. Ale zvýší udržovatelnost kódu, protože budeme mít dvě třídy provozu (s podobnou funkcí) pro psa a to je špatné.

Odpovězeno 19/04/2015 v 12:07
zdroj uživatelem

hlasů
7

Velmi jednoduchý písemné vysvětlení lze nalézt zde

http://binstock.blogspot.in/2008/01/excellent-explanation-of-dependency.html

říká

„Každá netriviální aplikace se skládá ze dvou nebo více tříd, které spolupracují mezi sebou navzájem provádět některé obchodní logiku. Tradičně, každý objekt je odpovědný za získání vlastní odkazy na objekty, že spolupracuje s (jeho závislostí). Při podání DI, na předměty jsou vzhledem k jejich závislosti na čase vytvoření nějakým externím subjektem, který koordinuje každý objekt v systému. jinými slovy, závislosti jsou injekčně do objektů.“

Odpovězeno 22/02/2013 v 15:13
zdroj uživatelem

hlasů
6

Líbí se mi tato vysvětlení: http://joelabrahamsson.com/inversion-of-control-an-introduction-with-examples-in-net/

To spustit jednoduchý a ukazuje příklady kódu stejně.

zadejte popis obrázku zde

Spotřebitel, X, potřebuje spotřebované třídu, Y, něco dokázat. To je všechno dobré a přirozené, ale to X opravdu potřebujete vědět, že používá Y?

Není to tak, že X ví, že používá něco, co má chování, metody, vlastnosti atd, Y, aniž by věděl, kdo vlastně implementuje chování?

Extrakcí abstraktní definici chování X používané v Y, znázorněné jako já níže, a nechat je spotřebitel X použít instanci, že namísto Y může i nadále dělat to, co dělá, aniž by museli znát specifika týkající se Y.

zadejte popis obrázku zde

Na obrázku výše Y implementuje I a X používá instanci I když je docela možné, že X stále používá Y, co je zajímavé je to, že X neví. Je to prostě ví, že používá něco, který implementuje I.

Přečtěte si článek pro další informace a popis výhod, jako jsou:

  • X není závislá na Y už
  • Flexibilnější, implementace může být rozhodnuto v běhu
  • Izolace kódu jednotky, snazší testování

...

Odpovězeno 16/02/2017 v 02:03
zdroj uživatelem

hlasů
4

Inverze ovládání je asi přenos ovládání z knihovny na straně klienta. To dává větší smysl, když hovoříme o klienta, který vstřikuje (prochází) hodnotu funkce (lambda výraz) do funkce vyššího řádu (knihovní funkce), které řídí (změny) chování funkce knihovny. Klient nebo rámec, který vstřikuje knihovny závislostí (které nesou chování) do knihoven mohou být rovněž považovány za IOC

Odpovězeno 24/12/2017 v 18:34
zdroj uživatelem

hlasů
4

Našel jsem velmi jasný příklad zde , které vysvětluje, jak ‚kontrolní obrácena‘.

Classic kód (bez injekce závislost)

Zde je, jak kód nepoužívá DI bude zhruba fungovat:

  • Aplikace musí foo (např regulátor), takže:
  • Aplikace vytvoří Foo
  • Aplikace volá Foo
    • Foo potřebuje Bar (např služba), takže:
    • Foo vytváří Bar
    • Foo volá Bar
      • Bar potřebuje BIM (služby, úložiště, ...), takže:
      • Bar vytváří BIM
      • Bar něco dělá

Pomocí injekce závislost

Zde je, jak kód pomocí DI bude zhruba fungovat:

  • Žádost je třeba Foo, který potřebuje Bar, který potřebuje BIM, takže:
  • Aplikace vytvoří BIM
  • Aplikace vytvoří Bar a dává mu BIM
  • Aplikace vytvoří Foo a dává mu Bar
  • Aplikace volá Foo
    • Foo volá Bar
      • Bar něco dělá

Kontrola závislostí je převrácený z jednoho volána k jednomu volání.

Jaké problémy to vyřešit?

vkládání závislostí usnadňuje zaměnit s jiným provádění injekčně tříd. Zatímco jednotkové testy můžete aplikovat fiktivní realizace, což činí testování mnohem jednodušší.

Příklad: Předpokládejme, že vaše aplikace uloží nahraný soubor uživatele v Disku Google, s DI kód ​​ovladač může vypadat například takto:

class SomeController
{
    private $storage;

    function __construct(StorageServiceInterface $storage)
    {
        $this->storage = $storage;
    }

    public function myFunction () 
    {
        return $this->storage->getFile($fileName);
    }
}

class GoogleDriveService implements StorageServiceInterface
{
    public function authenticate($user) {}
    public function putFile($file) {}
    public function getFile($file) {}
}

Když jsou vaše požadavky mění říci, namísto Disk Google budete vyzváni k použití Dropbox. Jediné, co potřebujete napsat implementaci dropbox pro StorageServiceInterface. Nemáte žádné změny v regulátoru tak dlouho, jak implementace Dropbox přilne k StorageServiceInterface.

Při testování můžete vytvořit falešnou pro StorageServiceInterface s náhradní plnění, kdy všechny metody vrátit null (nebo nějaký předem definovanou hodnotu dle vašeho požadavku testování).

Místo toho, pokud jste měli třídu řadič postavit objekt úložného s newklíčovým slovem, jako je tento:

class SomeController
{
    private $storage;

    function __construct()
    {
        $this->storage = new GoogleDriveService();
    }

    public function myFunction () 
    {
        return $this->storage->getFile($fileName);
    }
}

Pokud chcete změnit při provádění Dropbox je třeba vyměnit všechny řádky, kde newje GoogleDriveService objektu konstruovaného a používají DropboxService. Kromě toho při testování třídy SomeController konstruktér vždy očekává, že třída GoogleDriveService a skutečné metody této třídy jsou aktivovány.

Je-li to vhodné a kdy ne? Podle mého názoru použít DI, když si myslíte, že jsou (nebo mohou existovat) alternativní implementace třídy.

Odpovězeno 04/11/2017 v 13:27
zdroj uživatelem

hlasů
4

Chápu, že zde již bylo vzhledem k tomu, že odpověď. Ale stále si myslím, některé základy o opaku kontroly musí být zde uvedeno v délce pro budoucí čtenáře.

Inverze Control (IOC), byl postaven na velmi jednoduchém principu zvaném Hollywood princip . A říká, že,

Nevolejte nám, zavoláme vám

Co to znamená, že nechodí do Hollywoodu, aby splnit svůj sen spíše, pokud jste hodni pak Hollywood tě najde a váš sen se stává skutečností. Do značné míry vedené, co?

Nyní, když jsme diskutovali o zásady MOV používáme zapomenout na Hollywood. Pro MOV, musí existovat tři element, Hollywood, ty a úkol chtěl splnit svůj sen.

V našem programovém světě, Hollywood představují obecný rámec (může být napsán vy nebo někdo jiný), ty představují uživatelský kód, který napsal a za úkol zastupovat věc, kterou chcete provést u příslušného kódu. Nyní nemusíte někdy jít spouštět svůj úkol sami, není IoC! Spíše jste navrhli všechno tak, aby vaše rámec spustí svůj úkol pro vás. Tak jste si vybudovali opakovaně použitelný rámec, který může dělat někdo hrdinou nebo jiný jeden padouch. Ale tento rámec je vždy odpovědný za to ví, kdy si vybrat někoho, a že někdo ví, co chce být.

Skutečný život Příkladem by mohl být dáván tady. Předpokládám, že chcete vyvíjet webové aplikace. Takže vytvořit rámec, který bude zpracovávat všechny běžné věci, webové aplikace by měla zvládnout jako manipulační požadavku HTTP, vytváření menu aplikací, které slouží stránek, správu cookies spouštěcí události atd.

A pak nechat nějaké háčky ve svém rámci, kde si můžete dát další kódy k vytvoření vlastního menu, stránek, cookies nebo přihlášení některých uživatelských událostí atd. Na přání každého prohlížeče, bude váš framework spuštění a realizuje své vlastní kódy, pokud zahnutý pak slouží zpět do prohlížeče.

Takže myšlenka je do značné míry jednoduchá. Spíše než vytvářet uživatelské aplikace, které budou kontrolovat vše, nejprve vytvořit opakovaně použitelný rámec, který bude řídit vše pak psát své vlastní kódy a připojit jej k rámu vykonat ty včas.

Laravel a EJB jsou příklady takového rámce.

Odkaz:

https://martinfowler.com/bliki/InversionOfControl.html

https://en.wikipedia.org/wiki/Inversion_of_control

Odpovězeno 01/10/2017 v 11:24
zdroj uživatelem

hlasů
4

IOC je také známý jako injekce závislost (DI). Jedná se o proces, při kterém objekty definovat jejich závislosti, to znamená, že jiné objekty, které pracují s, pouze prostřednictvím konstruktérů argumenty, parametry do tovární metodu, nebo vlastnosti, které jsou nastaveny na stavu objektu, poté, co je vytvořena, nebo vrácen z metoda rodiny , Nádoba pak vstřikuje takové závislosti, když se vytvoří fazole. Tento proces je v podstatě inverzní, odtud název Inverze Control (MOV), z fazole samotného ovládající konkretizaci nebo umístění jeho závislosti pomocí přímého výstavbu tříd nebo mechanismu, jako je například vzor Service Locator

Pružinová rámec-referance.pfd strana 27 (v případě počítání všechny stránky PDF dokument, je na str 51)

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/pdf/spring-framework-reference.pdf

Odpovězeno 24/01/2013 v 15:52
zdroj uživatelem

hlasů
3

Inverze ovládání je, když jdete do obchodu s potravinami, a vaše žena vám seznam produktů, které kupují.

Z hlediska programování složila funkci zpětného volání getProductList()na funkci, kterou vykonávající doShopping();

To umožňuje uživateli funkce definovat některé jeho části zpružnění.

Odpovězeno 15/12/2017 v 18:35
zdroj uživatelem

hlasů
3

K pochopení konceptu, Inverze Control (IOC), nebo v zásadě závislost inverze (DIP) zahrnuje dvě činnosti: abstrakce a inverze. Závislost Injection (DI) je jen jednou z mála metod inverze.

Pokud si chcete přečíst více o tom si můžete přečíst můj blog zde

  1. Co je to?

Je to praxe, kde si nechat skutečné chování pochází ze zemí mimo hranice (Class v objektově orientovaného programování). Hranice entita zná pouze abstrakci (např interface, abstraktní třída, delegát do objektově orientovaného programování), z toho.

  1. Jaké problémy to vyřešit?

Z hlediska programování, MOV se snaží vyřešit monolitické kódu tím, že modulární oddělení různých částí ní, a učinit z něj jednotkové testovatelné.

  1. Je-li to vhodné a kdy ne?

Je vhodné, většinu času, pokud máte situaci, kdy si jen chcete monolitické kód (např velmi jednoduchý program)

Odpovězeno 03/06/2016 v 01:46
zdroj uživatelem

hlasů
3

Vytváření objektu v rámci třídy se nazývá těsné spojení, Spring odstraňuje tuto závislost pomocí následujících návrhový vzor (DI / IOC). Ve které objekt třídy v prošel v konstruktoru spíše než vytvářet ve třídě. Více než dáváme výborný referenční třída proměnné v konstruktoru definovat obecnější strukturu.

Odpovězeno 13/05/2015 v 08:52
zdroj uživatelem

hlasů
3
  1. Takže číslo 1 výše . Co je Inverze Control?

  2. Údržba je číslo jedna věc, to vyřeší za mě. Zaručuje Jsem pomocí rozhraní tak, že dvě třídy nejsou intimní spolu navzájem.

Při používání kontejneru, jako je hrad Windsor, řeší problémy s údržbou ještě lepší. Být schopen vyměnit komponentu, která jde do databáze na jeden, který používá vytrvalost založenou souborů bez změny jediného řádku kódu je úžasné (změna konfigurace, máte hotovo).

A jakmile se dostanete do generik, to je ještě lepší. Představte si, že vydavatel zprávu, která přijímá záznamy a vydává zprávy. To není jedno, co vydává, ale potřebuje mapovač vzít něco ze záznamu do zprávy.

public class MessagePublisher<RECORD,MESSAGE>
{
    public MessagePublisher(IMapper<RECORD,MESSAGE> mapper,IRemoteEndpoint endPointToSendTo)
    {
      //setup
    }
}

Napsal jsem to jednou, ale teď můžu aplikovat mnoho druhů do tohoto souboru kódu, když publikovat různé typy zpráv. Také mohu psát tvůrci map, které se záznam stejného typu a mapovat je do různých zpráv. Používání DI s Generics mi dal schopnost psát jen velmi málo kód splnit mnoho úkolů.

Ach jo, existují obavy testovatelnosti daného obvodu, ale oni jsou druhotné vzhledem k přínosům MOV / DI.

Jsem rozhodně milující MOV / DI.

3. To se stává vhodnější minutu máte středně velkou projekt poněkud větší složitosti. Řekl bych, že se stane to vhodné minut se začnete cítit bolest.

Odpovězeno 19/09/2008 v 05:59
zdroj uživatelem

hlasů
2

Použitím IOC nejste new'ing vaše objekty. Váš MOV kontejner bude dělat to a řídit životnost z nich.

To řeší problém, že bude muset ručně změnit všechny instance jednoho typu objektu do druhého.

Je vhodné, když máte funkci, která může v budoucnu změnit, nebo že se může lišit v závislosti na prostředí nebo konfiguraci použité.

Odpovězeno 16/07/2015 v 16:06
zdroj uživatelem

hlasů
1

Úplně první verze Java EE (J2EE v té době) představil koncept inverze kontroly (IOC), což znamená, že kontejner bude převzít kontrolu nad svým obchodním kódu a na poskytování technických služeb (například transakce nebo řízení bezpečnosti).

Odpovězeno 03/04/2017 v 22:42
zdroj uživatelem

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