Interfejsy - czemu implementacja jest w innej warstwie, a deklaracja w innej?

0

Przegladam sobie przykłady różnych projektów i zastanawia mnie, dlaczego deklaracja interfejsu jest np w warstwie Core (tam gdzie model domenowy) a implementacja tego interfejsu jest w warstwie Infrastructure? To tylko taki przykład, bo jest tego wiecej, że deklaracja jest w innej warstwie a implementacja w innej. Jak to rozumieć i czym się kierować, żeby wrzucać deklaracje i implementacje w odpowiednich warstwach?

1

To się nazywa Dependency Inversion Principle, https://en.wikipedia.org/wiki/Dependency_inversion_principle

0

Może z tego wątku trochę skorzystasz, wiodąca dla dyskusji jest prezentacja
Modyfikatory dostepu i moduly- az tak zle w Javie?

7

Bo jakby były w jednej, to byłoby to bez sensu, skoro celem interfejsów jest separacja użycia od implementacji.

Interfejs i jego implementacje w jednej warstwie mają sens tylko dla strategii, łańcucha odpowiedzialności i innych wzorców.

0
bolson napisał(a):

To się nazywa Dependency Inversion Principle, https://en.wikipedia.org/wiki/Dependency_inversion_principle

Wtrącę się, ale mam pytanie związane z tematem, więc autor tematu może też skorzystać z odpowiedzi. W jakiej książce można przeczytać o takich zasadach, jak Dependency Inversion Principle, SOLID itp? Możecie polecić jakąś dobrą książkę? Kilka dni temu zamówiłem książkę "Czysta architektura. Struktura i design oprogramowania. Przewodnik dla profesjonalistów" Roberta C. Martina, a teraz czekam na dostawę. Można znaleźć w niej wyczerpujące informacje na ten temat?

0
  1. No dobrze ale skąd w takim razie wiedzieć, w której warstwie dać deklaracje a w której implementacje?
  2. Czym się kierować przy ustalaniu jakie interfejsy sa mi potrzebne w projekcie?
1
goodfather napisał(a):
  1. No dobrze ale skąd w takim razie wiedzieć, w której warstwie dać deklaracje a w której implementacje?

Nikt tutaj nie będzie wiedział, bez dokładnej znajomości Twojej aplikacji, jej założeń, sposobów działania, integracji z innymi aplikacjami itp.

  1. Czym się kierować przy ustalaniu jakie interfejsy sa mi potrzebne w projekcie?

jw.

Generalnie niektóre pryncypia Clean Architecture można to wytłumaczyć na bazie samochodu - masz 3 warstwy (załóżmy):

  • KabinaKierowcy
  • KomoraSilnika
  • Nadwozie (dla uproszenia, to podwozie+nadwozie)

Dla uproszenia przypadku załóżmy, że kierowanie osią przednią, zmiana biegów, obrotów silnika zachodzi w KomoraSilnika.
Teraz warstwa KomoraSilnika może udostępniać takie interfejsy Kierownica, Hamulec, Obroty silnika (pedał gazu), Skrzynia Biegów dla warstwy KabinaKierowcy.
Zauważ tutaj, że będąc kierowcą w kabinie kierowcy nie wiesz co tam się dzieje pod spodem jak kręcisz kierownicą, wciskasz poszczególne pedały, czy dodajesz gaz, czy hamujesz, czy zmieniasz biegi. Ciebie interesuje tylko efekt - te interfejsy pozwalają Ci wpływać na ruch pojazdu, natomiast to jak to działa "pod maską" warstwę typu KabinaKierowcy w ogóle nie obchodzi.

W Kabinie kierowcy możesz mieć różne kształty kierownicy, gałek, pedałów, różne ich kolory, ale wciąż one "implementują" interfejsy "wystawione" przez KomoraSilnika
Generalnie KabinaKierowcy jest tutaj bardzo "samolubna", ona nie interesuje się jak to robi KomoraSilnika - ją interesuje efekt końcowy. Ją również nie będzie obchodzić jak np. zapalić światła i które.

Co w takim razie, w tym przypadku, robi warstwa Nadwozie (wygląd zewnętrzny auta)? Ona generalnie "nie wie" co dzieje się w warstwie KabinaKierowcy - zupełnie zbędne to jest jej do "działania". Czyli np. zmiana koloru gałki biegów w KabinaKierowcy nie powoduje, że np. trzeba zmienić kolor karoserii (chyba, że to auto dla kobiety;P). Warstwa Nadwozie jaka taka najbardziej zewnętrzna może np. mieć światła, kilka ich rodzajów. Kto wie jaki rodzaj świateł włączyć? Oczywiście KabinaKierowcy. Więc KabinaKierowcy może skorzystać też z interfejsu wystawionego przez warstwę Nadwozie - ZapalŚwiatłaStopu, ZgaśŚwiatłaStopu, itp itd. Zauważ, że znowu KabinaKierowcy kompletnie nie wie które światła się palą, jak się palą itp - ona tylko "używa" ZapalŚwiatłaStopu() i ma.

Jakie taki "design" niesie implikacje?

Gdy np. wymieniasz silnik, "grzebiesz" tylko w warstwie KomoraSilnika. Nigdzie więcej. A jak zmieniasz koła, to "grzebiesz" tylko w warstwie Nadwozie . Przy tych przykładowych "przeróbkach" jak widzisz nic nie grzebiesz w KabinaKierowcy, bo (dla uproszenia) zmiana silnika nie powoduje, że musisz mieć inną kierownice, biegi, pedały czy przyciski do zapalania świateł.
Tak samo zmiana koła. A jak zmieniasz tylko kolor auta, czyli "modyfikujesz" warstwę Nadwozie? To zmieniasz tylko ją, KomoraSilnika jak i tradycyjnie KabinaKierowcy nie "wiedzą" nic o lakierze, bo im to do niczego niepotrzebne.

Z kolei teraz, gdybyś chciał zmienić coś w KabinaKierowcy, dajmy na to, dodać gałkę do włączania napędu 4x4 (bo go chcesz dodać), to zobacz co musisz zrobić:

  1. Musisz zrobić robotę w KabinaKierowcy - dodać gałkę włączania drugiej osi. Ale jak tylko dodasz gałkę to ona "nie działa" - bo "nie wie" co ma robić.
  2. Zatem musisz w KomoraSilnika dorobić stosowne wajchy/prowadnice, zmodyfikować wał/skrzynie - aby "dodać" opcję dołączania/odłączania tylnej osi. Krótko mówiąc wyprowadzasz stamtąd wał, który napędzi Ci dodatkową oś. W cholerę roboty, a i tak nie koniec, bo wciąż to nie będzie działać, bo nie będzie połączone z osią.
  3. Wreszcie w warstwie Nadwozie masz sporo roboty, bo ten wał musisz do tylnej osi doprowadzić, podpiąć tą oś. Sam ten wał z kolei wychodzi dajmy na to ze skrzyni biegów, czyli z warstwy KomoraSilnika itp zależności.

Dlaczego tu nagle tyle roboty było? Bo KabinaKierowcy to tzw. domena, najbardziej wewnętrzna warstwa, to warstwa, która powinna być najbardziej "stabilna", najmniej się zmieniać (bo jej zmiana, jak widzisz, od razu wymusza zmiany w innych warstwach). Dlatego generalnie pryncypia kierowania autem się nie zmieniają od lat - masz kierownicę do kierowania, pedały do hamowania/dodawania gazu, zależnie od skrzyni masz może dodatkowy pedał sprzęgła no i oczywiście drążki zmiany biegów lub trybów pracy skrzyni, jeśli jest automatyczna. Za to silniki, kolory nadwozi, kształt lamp, koła itp zmieniają się ciągle.

TL;DR Jak zmieniasz kolor lakieru auta, nie musisz zmieniać gałki zmiany biegów. A jak zmieniasz klocki hamulcowe, nie musisz zmieniać nakładek na pedały hamulca. To jest czysta architektura.

Masakrycznie uprościłem, pewnie błędów narobiłem, ale tak to w wielkim skrócie wygląda.

0

czyli sotsując twoja analogie @TurkucPodjadek gdzie powinien byc zaimplementowyny interfejs a gdzie zadeklarowany? Chce np miec mozliwosc skrecania, to deklaracja ISkrecanie powinna byc w warstwie KabinaKierowcy a jego implementacja w warstwie KomoraSilnika? Czy ma odwrót?

0
goodfather napisał(a):

czyli sotsując twoja analogie @TurkucPodjadek gdzie powinien byc zaimplementowyny interfejs a gdzie zadeklarowany? Chce np miec mozliwosc skrecania, to deklaracja ISkrecanie powinna byc w warstwie KabinaKierowcy a jego implementacja w warstwie KomoraSilnika? Czy ma odwrót?

Skręcanie/Skręcać to już bardziej metoda, interfejs to prędzej Kierownica, a jego deklaracja jest w warstwie KomoraSilnika (bo od niej zależy jak to działa pod spodem), a implementacja w KabinaKierowcy (ta warstwa tego używa)

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