Dönüşüm nəzarəti nədir?

İnversiyon nəzarət (və ya IoC) ilk meydana gəldiyində olduqca qarışıq ola bilər.

  • Nədir?
  • Hansı problemlər həll edir?
  • Zaman uyğun olarsa, yoxsa?
1531
06 авг. Mike Minutillo tərəfindən təyin edilən 06 Av 2008-08-06 06:35 '08 saat 06:35 'da 2008-08-06 06:35
@ 33 cavab
  • 1
  • 2

Control (IoC) və Bağımlılık Enjeksiyonu (DI) şablonları, kodunuzdaki bağımlılıkları aradan qaldırılması üçün tasarlanmıştır.

Məsələn, tətbiqinizin bir mətn redaktoru komponenti olduğunu və yazım denetimi təmin etmək istəyirik. Sizin standart kodunuz belə bir şeyə bənzəyir:

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

İlk kodun nümunəsində biz SpellChecker nümunəsini yaradırıq ( this.checker = new SpellChecker(); ), yəni TextEditor sinfi SpellChecker sinifinə birbaşa bağlıdır.

İkinci kodun nümunəsində, TextEditor imzasında SpellChecker asılılıq sinifinə sahib olan bir soyuducu yaradırıq (sinifdəki asılılığı başlatmadan). Bu, bizi asılılıq yaratmağa və sonra TextEditor sinifinə aşağıdakı şəkildə verməyə imkan verir:

tərəfindən yaxşı bir sıra məqalələr var ki, bunu daha ətraflı izah edir. 

1227
06 авг. Cavab verilir . 2008-08-06 10:22 '08 saat 10:22 'da 2008-08-06 10:22

Nəzarətin ters çevrilməsi proqramlarınız, məsələn, qrafik interfeysi olan proqramı çağırdıqda nə əldə edir.

Məsələn, köhnə məktəb menyusunda aşağıdakılar ola bilər:

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

beləliklə istifadəçi qarşılıqlı təsirini nəzarət edir.

border=0

Qrafik interfeysi olan bir proqramda və ya bir şeydə deyirik:

 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 

Beləliklə, nəzarət indi ters çevrilmişdir ... istifadəçi girişini sabit bir qaydada qəbul edən kompüterin yerinə, istifadəçi məlumatların daxil edildiyini və verilənlər bazasında saxlandığı sırada nəzarət edir.

Əslində, bir hadisə loop, geri çağırışlar və ya icra tetikleyicileri olan hər şey bu kateqoriyaya düşür.

519
06 авг. Mark Harrison tərəfindən verilən cavab 06 Av 2008-08-06 08:42 '08 saat 08:42 'da 2008-08-06 08:42

Dönüşüm nəzarəti nədir?

Bu sadə iki addımı təqib etsəniz, nəzarət tərsinə çevrildiniz:

  • İştirak hissəsini zaman -hissə hissəsinə ayırın.
  • Bölmə haqqında mümkün qədər az bildiyi zaman əmin olun; və əksinə.

Bu addımların hər biri üçün tətbiqiniz üçün istifadə etdiyiniz bir neçə texnologiya / dil əsaslı metod var.

-

Nəzarətin inversiyasiyasının inversiya hissəsi (IoC) qarışıq bir şeydir; Çünki inversiya nisbi bir müddətdir. IoC-ni anlamaq üçün ən yaxşı yoldur bu sözü unutmaqdır!

-

Nümunələr

  • Hadisə idarə Hadisə işləyiciləri (Fəaliyyət bölməsi) - Hadisələrin artırılması (Fərdi olaraq yerinə yetirilən hissə)
  • Arayüzlər Komponent müştəri (hissəsi ayrılıqda həyata keçirilir) - komponent interfeysinin tətbiqi (aksiyaya həsr olunmuş hissə)
  • xUnit fiksasiya. Quraşdırma və TearDown (bir şey üçün hissə) - xUnit infrastrukturu başlanğıcda quraşdırılması və sonunda TearDown (hissəsi ayrı keçirilir)
  • Metod şablon dizayn şablonu. şablon metodu, hissəsi - ibtidai subclass tətbiqi
  • DLL konteyner üsulları COM. DllMain, DllCanUnload və s. (İş üçün nəzərdə tutulan hissə) - COM / OS (hissəsi ayrılıqda yerinə yetirilir)
374
22 июля '10 в 20:34 2010-07-22 20:34 cavab 22 iyul 'da 20:34' də verildi

Nəzarətlərin törədilməsi problemlərin ayrılmasıdır.

IoC olmadan . Bir laptop kompüteriniz var və təsadüfən ekranı qırırsınız. Və lənətləmək olar ki, eyni laptop ekran modelinin bazarda heç bir yerdə olmadığını görəcəksiniz. Beləliklə, siz sıxışdınız.

IoC ilə . Masaüstünüz üçün kompüteriniz var və təsadüfən ekranı qırırsınız. Siz bazardan demək olar ki, hər hansı bir masa üstü monitoru tuta biləcəyinizi tapacaqsınız və masaüstünüz ilə yaxşı işləyir.

Bu halda, masaüstünüz müvəffəqiyyətlə IoC tətbiq edir. Laptop işləməyincə, müxtəlif növ monitorları qəbul edir, müəyyən bir ekran onu düzəltmək üçün tələb olunur.

114
25 сент. Cavab Luo Jiong Hui tərəfindən verilir. 2013-09-25 17:24 '13 'da 17:24' də 2013-09-25 17:24

İdarəetmə təyini (və ya IoC) azadlıq əldə etməkdir (evlənirsiniz , azadlığınızı itirirsiniz və nəzarətə alınırsınız). Boşanmışsınız, yalnız İdarə Tərsinə tətbiq olundu. biz çağırışa çağırdıq. Yaxşı bir kompüter sistemi bir çox yaxın münasibətləri çəkindirir.) Böyük rahatlıq ( Ofisinizdə olan mətbəx yalnız təmiz su tapan suya xidmət edir, içmək istədiyiniz zaman bu yalnız seçimdir). su və ya qəhvə.) və daha az asılılıq (ortaq bir iş var, siz onların ortaq haqqında maliyyə asılı olan iş deyil, belə ki, nəzarət var. Siz bir iş tapmaq, siz nəzarət Inversion həyata keçirdik. Good kompüter f tap naya sistemi asılılıq həvəsləndirir.)

Bir masa üstü kompüter istifadə edərkən, nəzarət edərsiniz (və ya deyirlər). Ekranın qarşısında oturmalı və ona baxmaq lazımdır. Naviqasiya etmək üçün siçan daxil və istifadə etmək üçün klaviatura istifadə edin. Və pis yazılı proqram daha da kölə edə bilər. Masaüstünüzü laptop ilə əvəz etsəniz, nəzarəti bir az çevirdiniz. Siz onu asanlıqla götürə və hərəkət edə bilərsiniz. İndi kompüterlə olduğunuz yerdə nəzarət edə bilərsiniz və kompüterinizi idarə edə bilməzsiniz.

Nəzarət inversiyasını tətbiq edərək, proqramın / obyektin istifadəçisi proqramın / obyektlərin üzərində yoxlanılması yerinə daha çox nəzarət / variant alır və ya daha az variant var.

Yuxarıda göstərilən fikirlərlə. Biz hələ də IoC-nin əsas hissəsini qaçırdıq. IoC ssenarisində bir proqram / obyekt istifadəçisi kompleks bir quruluşdur. Bu, yaratdığınız kodun özü tərəfindən çağırılmadığı anlamına gəlir. İndi bu metodun veb tətbiqi üçün ən yaxşı niyə işlədiyini izah edin.

Kodunuzu bir qrup işçi olduğunu varsayalım. Bir avtomobil qurmaq lazımdır. Bu işçiləri avtomobilin qurulması üçün bir yer və vasitələr (proqram mühiti) lazımdır. Ənənəvi proqram mühiti bir çox vasitələrlə qaraj kimi görünəcək. Beləliklə, işçilərin özləri bir plan hazırlamalı və vasitəsi yığmaq üçün vasitələrdən istifadə etməlidirlər. Bir avtomobilin qurulması asan deyil, işçilər planlaşdırmaq və düzgün əməkdaşlıq etmək çox çətin olacaq. müasir kompleks kompleksi müasir avtomobil zavoduna bütün imkanları və menecerləri ilə bənzəyəcəkdir. İşçilər heç bir plan etməməyə ehtiyac duymurlar, rəhbərlər (strukturun bir hissəsi, ən ağıllı insanlardır və ən mürəkkəb planı hazırlamışdır) işçilərin işlərini nə vaxt edəcəyini bilməsi üçün işin əlaqələndirilməsinə kömək edəcəkdir (çərçivə çağırır). İşçilərin sadəcə menecerlər üçün təmin etdikləri vasitələrdən istifadə etmək üçün kifayət qədər çevik olmalı (Enjeksiyon Bağlılığı istifadə edir).

İşçilərin layihə rəhbərliyini yüksək səviyyədə idarəçilərə (çərçivəyə) nəzarət etməsinə baxmayaraq. Bəzi mütəxəssislərin kömək etdiyi yaxşıdır. Bu IoC konsepsiyası həqiqətən gəlir.

Müasir MVC-based veb proqramları marşrutlaşdırma URL'leri üçün strukturdan asılıdır və strukturu çağırmaq üçün nəzarətçiləri quraşdırır.

Depozit inyeksiyası və nəzarət tərsinə bağlıdır. Depozit inyeksiyası mikro səviyyədədir və nəzarət tənəzzülü də olur . Yeməyin tamamlanması üçün hər ısırığını (DI tətbiq edin) yeməlisiniz (IoC tətbiq edin).

85
04 марта '13 в 22:33 2013-03-04 22:33 Cavab Luo Jiong Hui tərəfindən 04.03.2013 tarixində saat 10:33 'da verilir

Nəzarətin Inversiyonunu istifadə etməzdən əvvəl, bunun yaxşı və mənfi cəhətləri olduğundan yaxşı tanış olmalısan və əgər bunu etsəniz, nə üçün istifadə etdiyini bilmək lazımdır.

Pros:

  • Kodunuz untied, belə ki, asanlıqla interfeys tətbiqlərini alternativ tətbiqlərlə dəyişə bilərsiniz.
  • Bu tətbiqlər yerinə interfeyslər kodlaşdırmaq üçün güclü bir motivasiya.
  • Kodunuz üçün vahid testləri yazmaq çox asandır, çünki yalnız onun qurucularında / ayarlayıcılarında qəbul etdiyi obyektlərdən asılıdır və onları seçilmiş obyektlərdən asanlıqla işə sala bilərsiniz.

Eksiler:

  • IoC proqramınızdakı nəzarət axını ilə yanaşı, həm də əhəmiyyətli dərəcədə azaldır. Bu, artıq kodunuzu oxumaq və bir yerdən başqa bir yerə gedə bilməyiniz deməkdir, çünki kodunuzda olan əlaqələr artıq kodda deyildir. Bunun yerine, bu XML konfiqurasiyasının faylları və ya şərhləri və bu meta məlumatları şərh edən IoC konteynerinizin kodu daxilindədir.
  • XML konfiqurasiyasını və ya ek notlarınızı yanlış istifadə etdiyiniz yeni bir səhv sinifləri var və sizin IoC konteyneriniz nəyə görə müəyyən bir şərtdə obyektlərinizdən birinə null link qoyduğunu anlayaraq çox vaxt sərf edə bilərsiniz.

Şəxsən, IoC gücünü görürəm və mən onları çox sevirəm, amma mümkün olduğunda IoC-dən qaçmaq üçün çalışıram, çünki proqramı artıq "real" proqramı təmsil edən dərslər toplusuna çevirir, amma bir şey nə XML konfiqurasiya və ya əlavə metadata ilə birləşilməli və onsuz da düşəcək (və düşəcək).

79
12 февр. cavab 12 fevrala verilir. 2010-02-12 17:31 '10 at 17:31 2010-02-12 17:31
  • Vikipediya məqaləsi . Mənim üçün nəzarət tərsinə sizin ardıcıl olaraq yazılmış kodunuzu çevirir və onu bir heyət strukturuna çevirir. Proqramınızın hər şeyə açıq şəkildə nəzarət etdiyinə görə, proqramınızda müəyyən işlər baş verdiyi zaman müəyyən bir funksiya olan bir sinif və ya kitabxana qurulur.

  • Çoğaltıcı kodu həll edir. Məsələn, köhnə günlərdə, yeni hadisə üçün sistem kitabxanalarını sorgulayarak, öz hadisə dövrünü əl ilə qeyd etdiniz. Hal-hazırda, ən müasir API-lər sistem kitabxanalarına hadisələri maraqlandıranları bildirirlər və bu zaman baş verdikdə sizə məlumat verəcəkdir.

  • Nəzarət inversiyası kod çoğaltmasının azaltılması üçün praktik bir yoldur və bütün metodu kopyaladığınızı və kodun yalnız kiçik bir hissəsini dəyişdirdiyinizi görürsünüzsə, onu nəzarət tersi ilə həll etmək imkanını nəzərdən keçirə bilərsiniz. Nəzarət inversiyası nümayəndələri, interfeyslər, hətta xam funksiyası göstəriciləri ilə bir çox dillərdə sadələşdirilir.

    Bütün hallarda istifadə edilə bilməz, çünki bu metodu yazarkən proqramın hərəkəti daha da çətin ola bilər. Bu yenidən istifadə ediləcək kitabxana yazarkən metodların inkişaf etdirilməsində faydalı bir üsuldur, lakin kodun təkrarlanması məsələsini həqiqətən həll etmədikcə, öz proqramınızın əsas hissəsində az istifadə edilməlidir.

58
06 авг. cavab NilObject 06 aug verilir . 2008-08-06 07:33 '08 saat 07:33 'da 2008-08-06 07:33

Amma buna görə çox diqqətli olmalısan. Bu şablonları sui-istifadə etsəniz, çox mürəkkəb bir dizayn və daha mürəkkəb bir kod yaradacaqsınız.

TextEditor ilə bu nümunədə olduğu kimi: Yalnız bir SpellChecker varsa, IoC-dən istifadə etmək lazım ola bilməz? Vahid testlər və ya başqa bir şey yazmaq lazım deyilsə ...

Hər halda: ağlabatan olun. Ən yaxşı təcrübənin şablonunu tərtib et , ancaq Müqəddəs Kitab təbliğ edilmir. Hər yerdə sopa etməyin.

41
07 авг. Michal Sznajder tərəfindən verilmiş cavab 07 Av 2008-08-07 01:08 '08 saat 01:08 2008-08-07 01:08

Bir obyekt olduğunuzu düşünürəm. Və bir restorana gedirsiniz:

IoC olmadan : bir alma soruşursunuz və daha çox soruşarkən həmişə bir alma xidmət edəcək.

IoC ilə : "meyvə" üçün müraciət edə bilərsiniz. Hər dəfə xidmət etdiyiniz zaman fərqli meyvələr əldə edə bilərsiniz. məsələn, alma, narıncı və ya qarpız.

Beləliklə, açıq-aydın olaraq, sortları sevdiyiniz zaman IOC üstünlük təşkil edir.

38
25 сент. Cavab Luo Jiong Hui tərəfindən verilir. 2013-09-25 17:00 '13 saat 17:00 'də 2013-09-25 17:00' də

IoC / DI mənə zəng edənlərə asılılıqları itələyir. Super sadə.

Texniki olmayan cavab, maşının üzərinə dəyməzdən əvvəl maşının dəyişdirilməsi imkanıdır. Hər şey düzgün bağlanarsa (interfeys), yaxşısan.

37
19 сент. Cavab 19 avqustda ferventcoder tərəfindən verilir . 2008-09-19 05:54 '08 at 5:54 'da 2008-09-19 05:54
  • İnversiyon nəzarət sistemi içindəki komponentləri və qatlamaları ayırmaq üçün istifadə edilən bir nümunədir. Şablon, qurulduğunda bağımlılıkları komponentə daxil etməklə həyata keçirilir. Bu bağımlılıkları, daha çox ayrıştırma və test imkanları üçün interfeys olaraq təmin edilir. Castle Windsor, Unity kimi IoC / DI konteynerlər IoC təmin etmək üçün istifadə edilə bilən alətlərdir (kitabxanalar). Bu vasitələr sadə asılılıqdan kənar inkişaf qabiliyyətlərini təmin edir, o cümlədən həyat ömrü, AOP / tutma, siyasət və s.

  • a Bağlılığını idarə etmək üçün məsul olan komponenti aradan qaldırır.
    b. Müxtəlif mühitlərdə asılılıq mübadilələrinin mübadiləsi qabiliyyətini təmin edir.
    c. Komponenti səhv bağımlılıklarla test etməyə imkan verir.
    e) ərizə boyunca resursların bölüşdürülməsi üçün mexanizm təmin edir.

  • a Testləri inkişaf etdirərkən mühüm əhəmiyyət kəsb edir. IoC olmadan sınanmaq çətin ola bilər, çünki sınaqda olan komponentlər sistemin qalan hissəsi ilə sıx birləşir.
    b. Modul sistemlərin inkişafında mühüm əhəmiyyət kəsb edir. Modul bir sistem, komponentləri recompilation ehtiyac olmadan dəyişdirilə bir sistemdir. c. Çox kəsişən məsələlərin, xüsusən müəssisənin tətbiqində həll edilməli olan məsələlər olduqca vacibdir.

25
19 сент. Cavab Glenn Block 19 sep tərəfindən verilir . 2008-09-19 05:27 '08 saat 05:27 'da 2008-09-19 05:27

Bu iki şərt mənim sadə anlayışımı yazacağam:

 For quick understanding just read examples* 

Bağımlılık Enjeksiyonu (DI):
Depozit inyeksiyası adətən bir metodun bir metoddan asılı olduğu bir obyektin keçməsini nəzərdə tutur , əvəzinə asılı bir obyekt yaratmaq üsuludur . Praktikada bu, metodun birbaşa xüsusi həyata keçirilməsinə bağlı olmadığını göstərir; tələblərə cavab verən hər hansı bir tətbiq parametr kimi qəbul edilə bilər. Bu obyektlərin köməyi ilə onların asılılıqları göstərilir. Və bahar onu əlverişli edir.
Bu, güzəştli birləşdirilmiş tətbiq inkişafına gətirib çıxarır.

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

Nəzarət Inversiyon Konteyner (IoC):
Bu çərçivələrin ümumi bir xüsusiyyəti, IOC java obyektlərini idarə edir.
- misal üçün, onun BeanFactory vasitəsilə məhv edilməsi.
IoC konteyner tərəfindən yaradılan java komponentlərinə fasulyə deyilir və IoC konteyner fənər sahəsi, həyat dövrü hadisələri və konfiqurasiya və kodlaşdırıldığı hər hansı AOP funksiyalarını nəzarət edir .

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 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 .

Nəzarət inversiyasını tətbiq edərək, proqram / obyektin istifadəçisi nəzarət yerinə daha çox proqram nəzarət / variantları / obyektləri alır və ya daha az variant var.

Dizayn rəhbərliyi kimi nəzarətin idarəedilməsi aşağıdakı məqsədlərə xidmət edir:

Tətbiqdən xüsusi bir vəzifə yerinə yetirmək üçün bir qərar var.
Hər bir modul bu üçün nəzərdə tutulan məqamlara diqqət yetirir.
Modullar digər sistemlərin nə etdikləri barədə fərziyyələr vermir, lakin müqavilələrinə əsaslanır.
Modulların dəyişdirilməsi digər modullara yan təsir göstərmir. Burada bir abstraksiyondur. Mövzunun ətraflı öyrənilməsi üçün aşağıdakı linklərə müraciət edə bilərsiniz.
Yaxşı nümunə oxu

Ətraflı izahat

20
10 нояб. Cavab VdeX 10 noyabrda verilir. 2014-11-10 11:43 '14 at 11:43 2014-11-10 11:43

Yalnız birinci hissəsi cavablandırır. Bu nədir?

Nəzarətin ters çevrilməsi (IoC) ilk növbədə sinifin ilk və son nümunələrinin (mütləq konstruktor vasitəsilə daxil edilməməsi) nümunələrinin yaradılması və ilk növbədə sinif nümunəsi yaratmaq deməkdir. Beləliklə, nəzarət invertasiyası proqramın nəzarət axını inverted . Nəzarət akışının idarə edilməsinin əvəzinə (müstəqillik yaratdıqda), zəng edən proqramın idarəetmə axını nəzarət edir .

20
11 янв. İstifadəçi 2330678 tərəfindən verilmiş cavab Yanvar 11 2016-01-11 03:49 '16 at 3:49 2016-01-11 03:49

Məsələn, 1 nömrəli məsələ bir obyekt yaratmaqdır. IOC konseptsiyasız, # 1 məsələsi proqramçı tərəfindən yerinə yetirilməlidir. Lakin IOC konsepsiyası ilə 1 nömrəli konteyner konteynerdən istifadə ediləcək.

Qısacası, Control Programmer-dan konteynerə çevrilir. Beləliklə, bu nəzarət tənəffüsü adlanır.

Burada bir yaxşı nümunə tapdım.

16
27 янв. Cavab gogs tərəfindən verilir 27 yanvar. 2010-01-27 15:15 '10 saat 15:15 'da 2010-01-27 15:15

Göründüyü kimi, "IoC" ilə bağlı ən mürəkkəb bir şey bir kısaltmasıdır və onun adı nədir ki, adı bir cazibədar - demək olar ki, səs-küy adı.

Prosedur və hadisəyə əsaslanan proqramlaşdırma arasındakı fərqi təsvir etmək üçün həqiqətən bir ada ehtiyacımız varmı? Bəli, ehtiyacımız var, amma qərar verməkdən daha çox şeyləri qarışdıran "həyatdan daha çox" adını seçmək lazımdırmı?

15
19 янв. Cavab verilir email.privacy Jan 19 2011-01-19 06:50 '11 saat 06:50 'da 2011-01-19 06:50

NilObject ilə razıyam , amma əlavə etmək istəyirəm:

bütün metodu kopyaladığınızı və yalnız kiçik bir kod parçasını dəyişdiyinizi görürsünüzsə, onu nəzarət tərsinə keçirə bilərsiniz

Özünüzü kopyalayıp yapıştırma kodunu bulursanız, hemen hemen yanlış bir şey yaparsınız. Dizayn prinsipi olaraq şifrələnmişdir. Bir dəfə və bir dəfə .

15
06 авг. Peter Burns 06 Avqust tarixində cavab verdi 2008-08-06 08:20 '08 saat 08:20 'da 2008-08-06 08:20

Bilirəm ki, biz bir oteldə görüşürük.

Bir çox insan, bir çox su kafe, bir çox plastik fincan.

Kimsə içmək istəyirsə, kuboka, içkiyə doldurur və kubanı yerə atır.

Через час или что-то у нас есть пол, покрытый пластиковыми стаканами и водой.

Пусть инвертирует управление.

На той же встрече в одном и том же месте, но вместо пластиковых чашек у нас есть официант с одной стеклянной чашкой (Singleton)

и она все время предлагает гостям выпить.

Когда кто-то хочет пить, она садится из официанта, выпивает и возвращает его обратно официанту.

Оставив в стороне вопрос о гигиене, последняя форма контроля над процессом выпивки намного эффективнее и экономичнее.

И это именно то, что делает Spring (другой контейнер IoC, например: Guice). Вместо того, чтобы позволить приложению создавать то, что ему нужно, используя новое ключевое слово (взяв пластиковую чашку), Spring контейнер IoC все время предлагает приложению тот же экземпляр (одиночный) нужного объекта (стакан воды).

Подумайте о себе как организаторе такой встречи. Вам нужен способ сообщить администрации отеля, что

участникам собрания понадобится стакан воды, но не кусок пирога.

Пример: -

 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 } 

Полезные ссылки: -

14
ответ дан Jainendra 26 сент. '12 в 20:54 2012-09-26 20:54

IoC означает инвертирование отношения между вашим кодом и сторонним кодом (library/framework):

  • В обычной разработке s/w вы пишете метод main() и называете методы "библиотеки". Вы находятся в управлении:)
  • В IoC "framework" управляет main() и вызывает ваши методы. Элемент Framework находится в управлении: (

DI (Dependency Injection) - это то, как управление течет в приложении. Традиционное настольное приложение имело поток управления из вашего приложения (метод main()) в другие вызовы методов библиотеки, но с потоком управления DI инвертируется, что среда заботится о том, чтобы запустить ваше приложение, инициализировать его и вызывать ваши методы, когда это требуется.

В конце концов вы всегда выигрываете:)

11
ответ дан Khanh 19 сент. '14 в 21:25 2014-09-19 21:25

Я нашел очень яркий пример здесь , который объясняет, как "контроль инвертируется.

Классический код (без внедрения зависимости)

Вот как примерно будет работать код, не использующий DI:

  • Приложению требуется Foo (например, контроллер), поэтому:
  • Приложение создает Foo
  • Приложение вызывает Foo
    • Foo нуждается в Bar (например, услуга), поэтому:
    • Фу создает бар
    • Фу называет бар
      • Бар нужен Bim (сервис, хранилище,…), поэтому:
      • Бар создает Бим
      • Бар что-то делает

Использование внедрения зависимости

Вот как примерно будет работать код, использующий DI:

  • Приложению нужен Foo, которому нужен Bar, которому нужен Bim, поэтому:
  • Приложение создает Bim
  • Приложение создает бар и дает ему Бим
  • Приложение создает Foo и дает ему Bar
  • Приложение вызывает Foo
    • Фу называет бар
      • Бар что-то делает

Управление зависимостями инвертируется от одного вызываемого к одному вызывающему.

Какие проблемы это решает?

Внедрение зависимостей облегчает обмен с другой реализацией внедренных классов. Во время модульного тестирования вы можете внедрить фиктивную реализацию, что значительно облегчает тестирование.

Пример: предположим, что ваше приложение хранит загруженный пользователем файл на Google Диске, с DI код вашего контроллера может выглядеть так:

 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) {} } 

Когда ваши требования изменятся, скажем, вместо GoogleDrive вас попросят использовать Dropbox. Вам нужно только написать реализацию Dropbox для StorageServiceInterface. Вам не нужно вносить никаких изменений в контроллер, пока реализация Dropbox придерживается StorageServiceInterface.

Во время тестирования вы можете создать макет для StorageServiceInterface с фиктивной реализацией, где все методы возвращают ноль (или любое предопределенное значение согласно вашему требованию тестирования).

Вместо этого, если у вас был класс контроллера для создания объекта хранения с new ключевым словом, например:

 class SomeController { private $storage; function __construct() { $this->storage = new GoogleDriveService(); } public function myFunction () { return $this->storage->getFile($fileName); } } 

Когда вы хотите изменить реализацию Dropbox, вы должны заменить все строки, где создается new объект GoogleDriveService, и использовать DropboxService. Кроме того, при тестировании класса SomeController конструктор всегда ожидает класс GoogleDriveService и срабатывают фактические методы этого класса.

Когда это уместно, а когда нет? По моему мнению, вы используете DI, когда думаете, что есть (или могут быть) альтернативные реализации класса.

10
ответ дан Raghavendra N 04 нояб. '17 в 16:27 2017-11-04 16:27

Очень простое письменное объяснение можно найти здесь

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

Это говорит -

"Любое нетривиальное приложение состоит из двух или более классов, которые взаимодействуют друг с другом для выполнения некоторой бизнес-логики. Традиционно каждый объект отвечает за получение своих собственных ссылок на объекты, с которыми он взаимодействует (его зависимости). При применении DI объекты получают свои зависимости во время создания некоторой внешней сущностью, которая координирует каждый объект в системе. Другими словами, зависимости вводятся в объекты ".

9
ответ дан agaase 22 февр. '13 в 17:13 2013-02-22 17:13

Инверсия контроля происходит, когда вы идете в продуктовый магазин, и ваша жена дает вам список продуктов, которые нужно купить.

В терминах программирования она передала функцию обратного вызова getProductList() функции, которую вы выполняете - doShopping() .

Это позволяет пользователю функции определять некоторые ее части, делая ее более гибкой.

9
ответ дан mario1ua 15 дек. '17 в 21:35 2017-12-15 21:35

Программирование говоря

IoC в простых терминах: использование интерфейса как способа для конкретного (такого поля или параметра) как шаблона, который может использоваться некоторыми классами. Это позволяет повторно использовать код.

Например, скажем, что у нас есть два класса: Собака и Cat . Оба имеют те же качества/состояния: возраст, размер, вес. Поэтому вместо создания класса службы с именем DogService и CatService , я могу создать один, называемый AnimalService , который позволяет использовать только Dog and Cat если они используют интерфейс IAnimal .

Однако, прагматично говоря, он имеет некоторые обратные.

a) Большинство разработчиков не знают, как использовать его . Например, я могу создать класс Клиент и , который я могу создать автоматически (используя инструменты IDE) с помощью интерфейса ICustomer . Таким образом, не редко можно найти папку, заполненную классами и интерфейсами, независимо от того, будут ли интерфейсы повторно использоваться или нет. Это называется BLOATED. Некоторые люди могут утверждать, что "возможно, в будущем мы сможем его использовать".: - |

b) Он имеет некоторые ограничения. Например, расскажите о случае Dog и Cat , и я хочу добавить новую услугу (функциональность) только для собак. Скажем, что я хочу рассчитать количество дней, которые мне нужны, чтобы обучить собаку ( trainDays() ), для кота это бесполезно, кошек нельзя обучить (я шучу).

b.1) Если я добавлю trainDays() в Сервис AnimalService , то он также работает с кошками, и он недействителен вообще.

b.2) Я могу добавить условие в trainDays() , где он оценивает, какой класс используется. Но он полностью разрушит IoC.

b.3) Я могу создать новый класс службы с именем DogService только для новой функциональности. Но, это увеличит ремонтопригодность кода, потому что у нас будет два класса обслуживания (с аналогичной функциональностью) для Dog , и это плохо.

8
ответ дан magallanes 19 апр. '15 в 15:07 2015-04-19 15:07

Мне нравится это объяснение: http://joelabrahamsson.com/inversion-of-control-an-introduction-with-examples-in-net/

Все начинается просто и показывает примеры кода.

2019

ответ дан DDan 16 февр. '17 в 5:03 2017-02-16 05:03

Инверсия управления - это общий принцип, в то время как Dependency Injection реализует этот принцип как шаблон проектирования для построения графа объекта (т.е. конфигурация контролирует, как объекты ссылаются друг на друга, а не сам объект, контролирующий, как получить ссылку на другой объект).

Рассматривая Инверсию Контроля как шаблон проектирования, нам нужно посмотреть на то, что мы инвертируем. Dependency Injection инвертирует управление построением графа объектов. Если сказать в терминах непрофессионала, инверсия управления подразумевает изменение потока управления в программе. Məsələn, В традиционном автономном приложении у нас есть метод main, из которого управление передается сторонним библиотекам (в случае, если мы использовали функцию сторонней библиотеки), но посредством инверсии управления управление передается из кода сторонней библиотеки в наш код, так как мы берем на себя обслуживание сторонней библиотеки. Но есть и другие аспекты, которые необходимо инвертировать в программе - например, вызов методов и потоков для выполнения кода.

Для тех, кто заинтересован в более глубоком рассмотрении Inversion of Control, была опубликована статья с изложением более полной картины Inversion of Control как шаблона проектирования (OfficeFloor: использование шаблонов office для улучшения дизайна программного обеспечения http://doi.acm.org/10.1145/2739011.2739013 с бесплатной копией, доступной для загрузки по адресу http://www.officefloor.net/mission.html )

То, что идентифицировано, является следующим отношением:

Инверсия управления (для методов) = впрыск зависимости (состояния) + впрыск продолжения + впрыск резьбы

8
ответ дан Daniel Sagenschneider 29 окт. '15 в 7:27 2015-10-29 07:27

Я понимаю, что ответ уже дан здесь. Но я все еще думаю, что некоторые основы об инверсии управления должны быть подробно обсуждены здесь для будущих читателей.

Инверсия управления (IoC) построена на очень простом принципе, называемом Голливудский принцип . И он говорит, что

Не звоните нам, мы позвоним вам

Что это значит, так это то, что не отправляйтесь в Голливуд, чтобы исполнить свою мечту, а если вы достойны, тогда Голливуд найдет вас и воплотит в жизнь вашу мечту. Довольно сильно перевернуто, да?

Теперь, когда мы обсуждаем принцип IoC, мы используем, чтобы забыть о Голливуде. Для IoC должен быть три элемента, Голливуд, вы и задача, подобная вашей мечте.

В нашем мире программирования Голливуд представляет собой общую структуру (может быть написан вами или кем-то еще), вы представляют написанный вами код пользователя и Задача представляет собой то, что вы хотите выполнить с помощью своего кода. Теперь вы никогда не станете запускать свою задачу самостоятельно, а не в IoC! Скорее всего вы разработали все, чтобы ваша инфраструктура спровоцировала вашу задачу для вас. Таким образом, вы создали многоразовую структуру, которая может сделать кого-то героем или другим злодеем. Но эти рамки всегда отвечают, он знает, когда кого-то выбрать, и что кто-то знает, кем он хочет быть.

Здесь приведен пример реальной жизни. Предположим, вы хотите разработать веб-приложение. Таким образом, вы создаете фреймворк, который будет обрабатывать все распространенные вещи, которые должно обрабатывать веб-приложение, например, обрабатывать HTTP-запрос, создавать меню приложений, обслуживать страницы, управлять куки файлами, запускать события и т.д.

И затем вы оставляете несколько крючков в своей структуре, где вы можете добавлять дополнительные коды для создания пользовательского меню, страниц, файлов cookie или протоколирования некоторых пользовательских событий и т.д. В каждом запросе браузера ваша инфраструктура будет запускаться и исполнять ваши пользовательские коды, если они будут подключены тогда верните его в браузер.

Итак, идея довольно проста. Вместо создания пользовательского приложения, которое будет управлять всем, сначала создайте повторно используемую структуру, которая будет контролировать все, а затем записывать ваши пользовательские коды и подключать их к фреймворку, чтобы выполнить их вовремя.

Laravel и EJB являются примерами таких структур.

Referans:

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

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

4
ответ дан Abdullah Al Farooq 01 окт. '17 в 14:24 2017-10-01 14:24

Инверсия управления - это передача управления от библиотеки клиенту. Это имеет больше смысла, когда мы говорим о клиенте, который вводит (передает) значение функции (лямбда-выражение) в функцию более высокого порядка (библиотечная функция), которая контролирует (изменяет) поведение библиотечной функции. Клиент или инфраструктура, которые внедряют библиотечные зависимости (которые переносят поведение) в библиотеки, также могут рассматриваться как IoC.

4
ответ дан Sergiu Starciuc 24 дек. '17 в 21:34 2017-12-24 21:34

Создание объекта внутри класса называется жесткой связью, Spring удаляет эту зависимость, следуя шаблону проектирования (DI/IOC). В котором объект класса передается в конструкторе, а не создается в классе. Более того, мы предоставляем ссылочную переменную суперкласса в конструкторе для определения более общей структуры.

3
ответ дан user4768611 13 мая '15 в 11:52 2015-05-13 11:52

Используя IoC, вы не новичок в своих объектах. Ваш контейнер IoC будет делать это и управлять временем их жизни.

Решает проблему ручного изменения каждого экземпляра объекта одного типа на другой.

Это уместно, если у вас есть функциональность, которая может измениться в будущем или которая может быть различной в зависимости от используемой среды или конфигурации.

3
ответ дан Rush Frisby 16 июля '15 в 19:06 2015-07-16 19:06
  • Итак, номер 1 выше . Что такое инверсия управления?

  • Обслуживание - это номер один, который он решает для меня. Это гарантирует, что я использую интерфейсы, чтобы два класса не были интимными друг с другом.

При использовании контейнера, такого как Castle Windsor, он решает проблемы обслуживания еще лучше. Возможность замены компонента, который поступает в базу данных для тех, которые используют постоянство на основе файлов без изменения строки кода, является удивительным (изменение конфигурации завершено).

И как только вы попадаете в дженерики, это становится еще лучше. Представьте, что у вас есть издатель сообщений, который получает записи и публикует сообщения. Его не волнует, что он публикует, но ему нужен картограф, чтобы взять что-то из записи в сообщение.

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

Я написал его один раз, но теперь я могу вставлять много типов в этот набор кода, если публиковать разные типы сообщений. Я также могу написать картотеки, которые берут запись того же типа и сопоставляют их с разными сообщениями. Использование DI с Generics дало мне возможность писать очень мало кода для выполнения многих задач.

О да, есть проблемы с тестируемостью, но они вторичны для преимуществ IoC/DI.

Я определенно люблю IoC/DI.

3. Это становится более подходящим в тот момент, когда у вас есть проект среднего размера с несколько большей степенью сложности. Я бы сказал, что это становится подходящим в тот момент, когда вы начинаете чувствовать боль.

3
ответ дан ferventcoder 19 сент. '08 в 7:59 2008-09-19 07:59

Чтобы понять концепцию, инверсия управления (IoC) или принцип инверсии зависимостей (DIP) включает в себя два действия: абстракция и инверсия. Инъекция зависимостей (DI) является лишь одним из немногих методов инверсии.

Чтобы узнать больше об этом, вы можете прочитать мой блог Здесь

  • Nədir?

Это практика, когда вы позволяете фактическому поведению поступать извне границы (класс в объектно-ориентированном программировании). Пограничный объект знает только абстракцию (например, интерфейс, абстрактный класс, делегат в объектно-ориентированном программировании).

  1. Hansı problemlər həll edir?

В период программирования IoC пытается решить монолитный код, сделав его модульным, развязывая различные его части и сделав его проверяемым на единицу.

  1. Zaman uyğun olarsa, yoxsa?

Это уместно в большинстве случаев, если у вас нет ситуации, когда вам просто нужен монолитный код (например, очень простая программа)

3
ответ дан kusnaditjung tjung 03 июня '16 в 4:46 2016-06-03 04:46
  • 1
  • 2

Другие вопросы по меткам или Задайте вопрос