2010-10-12 10 views
45

Czytam teorię o zależnościach inwersję i dipola i nie widzę różnicy między nimi.Różnica między „odwrócenie sterowania”, „Dependency inwersji” i „decoupling”

Inwersja zależności mówi o oddzieleniu składników funkcjonalnych, tak aby komponenty wyższego poziomu nie były zależne od komponentów niższego poziomu.

Decoupling mówi o tym samym i jak to osiągnąć. Ale potem mamy IoC Containers, które zepsuły sprawę jeszcze bardziej. Dlaczego nie są one raczej nazywane Dependency Inversion Containers lub jeszcze lepiej Dependency Injection Containers, ponieważ służą do łączenia w czasie wykonywania niezależnych komponentów?

Następnie mamy Inwersja kontroli. Jest to w zasadzie to samo, co Inwersja zależności Inna wersja: czyż nie? Dlaczego istnieją trzy terminy, które opisują to samo? Czy ja jestem ślepy?

  1. Jaka jest różnica między tymi trzema?
  2. Co ma zrobić IoC w kontenerach IoC?
+0

@Anton Gogolev: Oddzielenie jest pisane z dodatkowym "o": http://en.wikipedia.org/wiki/Decoupling#Software_Development –

Odpowiedz

46

Decoupling to bardzo ogólna zasada obowiązująca w wielu dziedzinach. Inwersja zależności to specyficzna forma oddzielania, w której oddziela się wyższe poziomy systemu od niższych poziomów, rozdzielając je na biblioteki i wykorzystując interfejsy. Pozwala to na zastąpienie części niższego poziomu w systemie bez większych przeróbek.

Na przykład zamiast wyższych części systemu tworzących konkretne instancje klas niższego poziomu można użyć kontenera IoC, aby oddzielić sposób tworzenia obiektów.

Inwersja sterowania to zasada projektowania używana przez biblioteki szkieletowe, które pozwalają ramie odzyskać pewną kontrolę z aplikacji. Oznacza to, że struktura okienkowania może ponownie wywoływać kod aplikacji, gdy występują pewne zdarzenia interfejsu użytkownika. Martin Fowler używa terminu Hollywood Principle jak w Nie dzwoń do nas, zadzwonimy do ciebie. Oddzielenie jest ważną częścią inwersji kontroli.

Ale co ma kontener IoC , aby wykonać inwersję sterowania? To quote Martin Fowler:

Odwrócenie kontroli jest zbyt ogólnym terminem, przez co ludzie uważają to za mylące. W wyniku wielu dyskusji z różnymi rzecznikami IoC zdecydowaliśmy się na nazwę Dependency Injection.

(Zauważ, że Martin Fowler mówi o wtrysk zależność nie zależność inwersja.)

IoC kontener pomaga wdrożyć iniekcji zależność i być może lepsze byłoby określenie pojemnik zależność wtrysku. Jednak nazwa kontenera IoC wydaje się trzymać. Wstrzyknięcie zaleŜności jest waŜnym składnikiem inwersji zaleŜności, ale uŜycie pojemników IoC do wstrzykiwania zaleŜności moŜe być mylące, poniewaŜ inwersja kontroli jest szerszą i bardziej ogólną zasadą.

Podkreślasz, że nazewnictwo nie jest bardzo spójne, ale nie powinno to być dużym zaskoczeniem, ponieważ te warunki zostały niezależnie wynalezione i użyte, nawet jeśli nakładają się na siebie.

+0

Zgadzam się, chociaż nie użyłbym terminu "IoC", ponieważ tak naprawdę nie jest to prawidłowe. (niepoprawny) popularny schemat nazewnictwa tutaj, ponieważ każdy, kto rozumie zasadę pojemników DI powinien być w stanie zrozumieć prawidłowe nazewnictwo –

38

Zależność wtrysku osiąga Oddzielenie pomocą odwrócenie sterowania.

+0

nie mogli być bardziej prostsze. – Pradeep

+3

czy to ** myśl o Inwersji Kontroli ** czy jest to ** Inwersja Dependencji **? Powiedziałbym, że to drugie. –

+1

-1 to faktycznie * łączy * termin "iniekcja zależności" z "inwersją kontroli". Wstrzyknięcie zależne jest samodzielną techniką oddzielania. –

9

znaleźć następujące wyjaśnienia od DIP in the Wild artykułu na martinfowler.com proste do zrozumienia (tutaj Di = Dependency Injection, DIP = Dependency Inversion Zasada, IoC = odwrócenie sterowania):

DI jest o tym, jak jeden obiekt nabywa zależność. Gdy zależność jest dostarczana zewnętrznie, wówczas system używa DI. IoC dotyczy tego, kto zainicjuje połączenie . Jeśli twój kod inicjuje połączenie, to nie jest to IoC, jeśli kontener/system/biblioteka wywołuje ponownie kod, który podałeś , czy to jest IoC.

Z kolei DIP to poziom abstrakcji wiadomości wysyłanych z twojego kodu do rzeczy, do której dzwoni. (...) DI jest około okablowania, IoC jest o kierunku, a DIP jest o kształcie [obiektu , od którego zależy kod].

+2

"DI jest o okablowaniu, IoC jest o kierunku, a DIP jest o kształcie [obiektu, od którego zależy kod ]. "to było dobre zdanie;) –

+0

Zgadzam się - ta mała odpowiedź tutaj ma dla mnie największy sens. – ppumkin

Powiązane problemy