Ornstein napisał(a):
Tu mnie zaskoczyłeś. Czytałem trochę o
package scopei odniosłem wrażenie, że powinienem zwracać dużą uwagę na to, aby jak najmniej klas było widocznych poza pakietem.
Package-scope nie ma nic wspólnego z dependency inversion. To są jakby osobne mechanizmy.
Package-scope to jest jeden ze sposobów enkapsulacji w javie - sposób na ukrycie niektórych szczegółów, a pozostawienie wydocznym jedynie interfejs modułu. Natomiast w architekturze hexagonalnej, i ogólnie w dependency inversion chodzi o to żeby żeby wysokopoziomowe elementy (domena) nie zależały od niżej poziomowych szczegółów implementacyjnych (widok i baza). W szczególności chodzi o to, żeby zmiana szczegółu (implementacji widoku lub bazy) nie musiała oznaczać zmiany w wysokopoziomowych elementach (domenie). Bez dependency inversion nie zawsze jest to możliwe.
To odniosłem wrażenie, że powinienem zwracać dużą uwagę na to, aby jak najmniej klas było widocznych poza pakietem. to też nie jest do końca prawda.
Jeśli myślisz o pakietach w javie jak o folderach, to równie dobrze wszystkie klasy w pakiecie mogłyby być public. Nic byś nie stracił.
Ale jeśli myślisz o nich jak o modułach, czyli częściach aplikacji odpowiedzialnych za konkretne zadanie, to należy na to patrzeć w taki sposób że moduł wystawia pewien interfejs: class/interface/enum/record (elementy publiczne), żeby inne moduły mogły z nim gadać, a sam wykonuje jakieś operacje, które są już szczegółem implementacyjnym tego modułu (i one mogą być package-private - a właściwie nawet powinny, bo ich zmiana nie powinna wpłynąć na żadnego użytkownika tego modułu). Pod tym względem moduły i klasy zaczynają być do siebie podobne - obie z nich mają interfejs (sposób w jaki ktoś z nich korzysta), i obie mają swój sposób działania (swój wewnętrzny mechanizm i implementacje). Zmiana interfejsu wymaga żeby użytkownicy również się zaktualizowali (dlatego niektórzy mogą Ci radzić żeby public było mało), z kolei zmiana implementacji nie wpływa na nic poza modułem (dlatego ich może być dużo). Ale to nie jest tak, że publiców MUSI BYĆ mało. Chodzi o to że wszystko o czym nie muszą wiedzieć użytkownicy modułu lepiej zrobić package-private, po to żeby przypadkiem nikt z tego nie skorzystał, po to zeby refaktor szczegółów implementacyjnych niepotrzebnie nie wymuszał zmian w innych miejscach.
Ornstein napisał(a):
W pakiecie
servicepraktycznie wszystkie klasy są prywatne, poza klasą odpowiedzialną za wejście. Teraz chciałbym je skonfigurować i stworzyć beana. Nie chcę tego robić w domenie, bo wymieszam domenę ze Springiem. Utworzę nowy oddzielny pakietregistration->config. Problem polega na tym, że nie jestem w stanie zaimportować prywatnych klas z innego pakietu. Musiałbym nałożyć na nie jakiś interfejs. Nie wiem, czy nie byłby to trochę overengineering.
No to skoro masz jedną klasę odpowiedzialną za wejście, a reszta pakietu jest prywatna, to chyba powinno dać się móc zrobić beana używając tylko i wyłącznie tej klasy wejściowej, a prywatnych elementów nie dotykać?