@scibi92: > ##### scibi92 napisał(a):
I czy w którym kolwiek z nich jest napisane że warto wydzielić interfejs z jednej implementacji, po to żeby był? Jeśli nie ma planu na dodanie kolejnych?
Tak, bo interface to kontrakt.
Klasy bez wydzielonego interfejsu również zapewniają kontrakt.
Jeśli schowasz całą logikę w klasie ExchangeRateProvider to też nie będzie zależeć.
Będzie, bo wtedy nie możesz już trzymać ExchangeRateProvider wraz z pakietem mającym tylko klasy związane z domeną. Musisz mieć albo klienta restowego w domenie, albo domene importującą pakiety z infrastruktury. A tak możesz mieć całą domenę niezależną od frameworków, baz danych, klientów resta, klientów kafki itp
Teraz jestem przekonany że mówisz o warstwowych, aplikacjach końcowych, a nie o rozwoju oprogramowania w ogóle (tzn aplikacjach które trafiają od razu do usera, od których nic nie zależy (i nie mówię tu o interfejsach np http, etc. mam na myśli "zależy kodowo"), i w których boilerplate jest duży i warstwy to jest spora część aplikacji, a logika jest mniejszą).
No to faktycznie, jeśli masz z góry narzucone warstwy, i masz osobne pakiety które np chciałbyś deployować/dystrubutować osobno, to może i to ma sens dla ExchangeRateProvider
. Może. Dlatego że:
a) Jeśli nie chcesz ich dystrybutować osobno, to to nic złego że domenowy pakiet ma jednego importa z zewnętrznego pakietu (jeśli implementacja jest jedna).
b) wybrałeś sobie przykład, w którym jest bardzo łatwo określić jakie/czy/gdzie mogłyby być dostarczone inne implementacje (provider walut, bardzo wygodne).
Poza tym nadal nie odniosłeś się do mojego poprzedniego pytania, co w styacji kiedy logika jest bardzo złożona i granica pomiędzy (tym co nazwałeś) "infrastrukturą" i tym co nazwałeś "domeną" się zaciera. Bo oczywiście, kiedy piszesz apkę dla usera podpartą libkami i frameworkami to logiki masz bardzo mało, i łatwo sobie powiedzieć: "ta klasa to domena, ta klasa to infrastruktura". Ale kiedy tych klas jest dużo więcej, jak np w jakiejś konkretnej branżowej skomplikowanej logice, to rozróżnienie się zaciera.
Nie chcę mi się filozować, więc podsumuję to tym:
Programowanie to dosyć skomplikowana i nowa dziedzina, dużo jest tutaj zmiennych, i bardzo dużo zależy od wielu innych rzeczy.
To, dlaczego prowadzę z Tobą cały ten wątek to, to że potrzebowałbym bardzo dobrego argumentu, żeby się zgodzić z Twoim bardzo jednostronnym i bezwarunkowym stanowiskiem, że zawsze należy wydzielić interfejs z każdej klasy, nawet jeśli ma jedną implementację. Bo Twoja teza nie brzmiała "czasem warto", albo "w konkretnych przypadkach", albo "ja tak robię".
Programowanie to nie tylko backendy z urlami /user/accounts
, CRUD, mappery, widoki i repozytoria z baz danych (takie apki każdy po kursie na udemy może napisać). Ale zaprojektuj np edytor tekstu (podobny do worda), albo painta, odtwarzacz wideo, grę w szachy online, program wizualizujący fractale, narysuj drzewo w opengl'u, program konwertujący svg na png, klienta http jak curl, nakładkę na osa która wyświetla ikonki przy folderach - w skrócie jaką kolwiek aplikacje w której logiki jest dużo, a warstw jest mało. I wtedy wypowiedz się, ile razy w takich aplikacjach pojawił się problem oddzielenia domeny od infrastruktury.
scibi92