Wątek przeniesiony 2019-02-25 21:56 z przez somekind.

IoC a DI

Odpowiedz Nowy wątek
2019-02-25 21:46
0

Cześć. Zmagam się ze zrozumieniem pojęć i różnic pomiędzy IoC a DI. Nigdy nie przykuwałem do tego uwagi, po prostu wiedziałem jak się powinno pisać kod.
Nie powinienem robić aby jakaś klasa zależała od drugiej, czyli pisać w klasie Test Class class = new Class();, tylko powinienem wstrzykiwać tę klasę do konstruktora klasy Test. Plusy znam, łatwe utrzymanie, można takie klasy testować zmieniając implementacje.

No ale właśnie, wiem jak to się robi, nie wiem co to dokładnie oznacza. Zawsze mi się wydawało, że to co u góry napisałem, to jest wstrzykiwanie zależności. Gdzieś nad tą klasą tworzę obiekt, który wstrzykuje i to jest właśnie Dependency Injection.

Czy Inversion Of Control jest to cały koncept tego tak jakby? Cały zamysł, a DI to jest tak jakby sposób tego zrobienia?

Przemaglowałem już wiele stron zaczynająć od SO, kończąc na jakiś udziwnionych ścianach tekstu, ale nie mogę tego do końca zrozumieć.
Może mnie ktoś oświecić?

Pozostało 580 znaków

2019-02-28 08:42
3

Nie chcę brać udziału w tej dyskusji bo to chyba 50-ta z tej serii, nie chcę też tworzyć jakichś ulotnych i łatwo podważalnych definicji, ale chciałbym wyprostować jedno pojęcie.

Podano tu nieścisłe twierdzenia o IoC:

scibi92 napisał(a):

IoC to jest forma DI. DI oznacza że przez konstruktor wstrzykujesz zależności np:

Shalom napisał(a):
  1. DI to sposób realizacji IoC -> wstrzykujemy do modułów implementacje, z których one, poprzez jasno zdefiniowany interfejs, korzystają. Ale to nie jest jedyne rozwiązanie, jakiś ServiceLocator czy Factory też może być realizacją IoC.

Pracowałem z frameworkiem IoC w COBOLu. Tam nie ma konstruktorów, setterów ani interfejsów.
Prosta i krótka definicja: IoC inverts the flow control as compared to traditional control flow
Źródło: https://en.wikipedia.org/wiki/Inversion_of_control

Coś takiego można też zrobić w dowolnym innym języku. IoC można np. zauważyć przy odpalaniu skryptów /etc/init.d gdzie o przepływie sterowania decyduje "framework" a nie skrypt znajdujący się w tym katalogu.

Ogólnie DI nie ma w podstawowym znaczeniu związku z IoC.
IoC nie wymaga DI a samo DI (np. przez konstruktor) często jest realizowane bez IoC.
Przykład: https://hackernoon.com/you-do[...]ection-container-10a5d4a5f878

Dopiero na poziomie kontenera oba te terminy mogą się spotkać, np. w takim Springu - tam kontener wie tak dużo o module że może mu grzebać w bebechach bez wiedzy wybranego obiektu.

Ogólnie bliższe mi jest znaczenie z wiki niż takie odwołujące się w każdym zdaniu (pośrednio lub bezpośrednio) do Springa:

The term is related to, but different from, the dependency inversion principle, which concerns itself with decoupling dependencies between high-level and low-level layers through shared abstractions. The general concept is also related to event-driven programming in that it is often implemented using IoC, so that the custom code is commonly only concerned with the handling of events, whereas the event loop and dispatch of events/messages is handled by the framework or the runtime environment.


Szacuje się, że w Polsce brakuje 50 tys. programistów

Pozostało 580 znaków

2019-02-28 09:50
0

Definicja @Shalom jest oczywiście poprawna, ja tutaj popełniłem uproszczenie, bo od początku chodziło mi o kontener IOC.


Nie pomagam przez PM. Pytania zadaje się na forum.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 0, botów: 1

Robot: CCBot