Podział projektu na pakiety - szybkie, proste pytanko.

Podział projektu na pakiety - szybkie, proste pytanko.
Belka
  • Rejestracja:prawie 8 lat
  • Ostatnio:28 dni
  • Lokalizacja:PL
  • Postów:452
0

Cześć.

Niedawno wyczytałem, że znacznie lepiej jest dzielić klasy na pakiety pod względem funkcjonalności, a nie warstw aplikacji. Wcześniej dzieliłem projekt po prostu na pakiety service, controller, config, model itd, a w dopiero w tych pakietach, rozdzielających projekt warstwowo, tworzyłem dokładniejszy podział.
Narzuca mi się do głowy kilka drobnych pytań doprecyzowujących mój tok myślenia:

  1. Czy obiekty encji powinienem trzymać jednak razem w jednym pakiecie?
  2. Czy warstwę kontrolerów też wrzucić do pakietu kontroler?
  3. Rozumiem, że podział na pakiety per funkcjonalność odbywa się głównie w warstwie serwisu, tj. miejscu, w którym realizowana jest logika biznesowa. Czy taki podział stosować w taki sposób, że w pakiecie znajdują się klasy odpowiedzialne za pewną funkcjonalność, obiekt domenowy, dto, jakaś fasada wystawiająca publiczny interfejs sklejony z tych klas itd? Co jednak, gdy kilka funkcjonalności wykorzystuje tą samą grupę obiektów? Jak zapobiec takiemu wymieszaniu wszystkiego? Boję się, że poprzez nieumiejętny podział zamienię siekierkę na kijek i wszystko mi się pomiesza.

Jak powinienem zrealizować taki podział?

AreQrm
  • Rejestracja:prawie 11 lat
  • Ostatnio:17 dni
  • Lokalizacja:Londyn
  • Postów:873
1

Wszystko zależy od architektury. Jeśli się nie mylę, opisujesz dość ciekawą ale starą już ;-) architekturę n-warstwową, gdzie dzieli się horyzontalnie i architekturę gdzie dzieli się pionowo (ehh, nazwa mi wypadła). Ten drugi podział na funkcjonalności można też w pewnym sensie obserwować w mikro serwisach, w końcu każdy ma tylko wycinek swojej funkcjonalności, a nie całą warstwę.

Więc przy feature slice'ach to nie powinineś trzymać wszystkic X razem, a jeśli masz monolit to trzymać w jednym feature folderze (albo pakiecie, projekcie, zależy jak to sobie wydzieliłeś i co ma sens) z podfolderami jeśli trzeba (jak masz 4 pliki w jednym folderze, np Controller, DTO, Serwis i model domenowy - encje, to jest ok, a jak będzie ich 100 to już słabo się robi i trzeba to jakoś ogarnąć).

Teraz odp na Twoje pytania:

  1. Nie *.
  2. Nie *.
  3. Tak *. A gdy masz wspólne części to może to wspólna funkcjonalność? A może zostało źle podzielone? A może tylko wydaje się wspólna ze względu na odczyt/prezentacje, a nie na to jak działa (patrz CQRS)? Ciężko powiedzieć coś innego niż - to zależy.
    I teraz gwiazdka na koniec - to zależy, czy technologia, framework to wspiera ładnie. Jeśli nie, to musisz iść na ustępstwa. Np da się trzymać widoki i kontrolery osobno w .Net Core i klasycznym, ale w starszych wersjach było z tym wcześniej ciężko, ale Nancy (taki framework) to ładnie wspierało od strzała). Czasem framework coś wymusza i trudno.

Belka
  • Rejestracja:prawie 8 lat
  • Ostatnio:28 dni
  • Lokalizacja:PL
  • Postów:452
0

Więc przy feature slice'ach to nie powinineś trzymać wszystkic X razem, a jeśli masz monolit to trzymać w jednym feature folderze (albo pakiecie, projekcie, zależy jak to sobie wydzieliłeś i co ma sens) z podfolderami jeśli trzeba (jak masz 4 pliki w jednym folderze, np Controller, DTO, Serwis i model domenowy - encje, to jest ok, a jak będzie ich 100 to już słabo się robi i trzeba to jakoś ogarnąć).

Tworzę monolit. Mikroserwisy to jeszcze nie mój level umiejętności, muszę się zabierać za wszystko po kolei, żeby się nie pogubić :)
Cały Twój post rozjaśnił moje wątpliwości, jednak intryguje mnie fragment, który pozwoliłem sobie zacytować.

Załóżmy, że mam klasę ComputerRental, przechowującą w sobie obiekt Computer, Person (osoba, która np. wypożyczy sprzęt), ComputerModel, zawierający w sobie jeszcze ComputerProducer itd. Robi się tych obiektów dużo i o ile intuicyjnie przychodzi mi do głowy pomysł podziału tej całej struktury na pakiety, gdzie każdy realizowałby chociażby CRUDowe operacje (dodanie nowego producenta do bazy, usunięcie producenta, dodanie modelu komputera, modyfikacja parametrów modelu itd.), to w celu zaimplementowania funkcjonalności wypożyczenia, gdzie jako tako wszystkie te obiekty będą obecne robi mi się lekki miszmasz.

Chyba, że planuję to w trochę zły sposób. Może powinienem z tych pakietów powiązanych z pakietami powiązanych z ComputerModel, ComputerProducer udostępniać DTO i w pakiecie powiązanym z wypożyczeniami mapować to DTO na zagnieżdżony obiekt ComputerModel w klasie ComputerRental w pakiecie obejmującym funkcjonalność wypożyczenia? Trochę to zagmatwanie opisałem, więc wybacz :)

AreQrm
  • Rejestracja:prawie 11 lat
  • Ostatnio:17 dni
  • Lokalizacja:Londyn
  • Postów:873
1

Jak myślisz CRUDem - to myślisz źle ;-) Nie powinieneś iść tak mocno w dół z rozmiarem. Za bardzo to rozdrabniasz.

Funkcjonalność to całość, np wypożyczenie komputera. I nie dzielisz tego na techniczne "zapisz zmiany w X, zapisz zmiany w Y" bo faktycznie to tylko mentliku można dostać od tego. To jest jeden cały pakiet.
Inna funkcjonalność, którą może i można zrealizować CRUDem, jeśli nie ma dodatkowych warunków to może być faktycznie to co napisałeś "dodanie nowego producenta do bazy, usunięcie producenta" i kolejna "dodanie modelu komputera, modyfikacja parametrów modelu itd". Albo nawet możesz wziąć na klatę że to tylko CRUD i nawet nie dzielić na osobne pakiety dopóki to tylko CRUD.

Dodam kilka materiałów na ten temat, wyszukanych na szybko:


edytowany 1x, ostatnio: AreQrm
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

Tylko że jeśli ktoś robi vertical slice na poziomie pakietów a nie jakichś modułów mavena czy czegoś w tym stylu, to nagle ma cały projekt "spaczony" frameworkiem i nie da się łatwo wyciągnąć np. "samej domeny".


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Zobacz pozostały 1 komentarz
Shalom
Ale masz jara który zawiera wszystko w takim układzie.
Charles_Ray
Dopóki i tak wszystko wdrażam razem, nie widzę uzysku z N jarów. Widzę za to robienie sobie pod górkę, jeśli chodzi o współdzielone klasy - i tak powstanie moduł „commons” ;)
viader
@Charles_Ray: podam przykład, wdrażaliśmy pewną aplikację Androidową z rozbudowaną komunikacją sieciową. Komunikacja sieciowa potrzebowała zależności na przykład informacji o urządzeniu, bazy danych itp. Nagle dostaliśmy wymaganie by puścić komunikację sieciową na Jenkinsie bez dostępu do Androida. Dzięki podziałowi na moduły i osobnym jarom dodaliśmy tylko implementacje Runtime bazy danych, jakiegoś fikcyjnego providera danych o urządzeniach i mogliśmy napisać sobie zupełnie dodatkowy mini projekt korzystający z tej samej współdzielonej biblioteki sieciowej.
viader
Projekt ten tak naprawdę miał wykrywać anomalie i awarie w komunikacji sieciowej dla produkcyjnej apki mobilinej i przy niepowodzeniu testu o odpowiednio wysokim priorytecie wysyłać informacje SMS'em do wsparcia technicznego. Dodatkowo praktycznie za friko mieliśmy testy regresji komunikacji sieciowej co update produkcyjnej aplikacji.
viader
Z kolejnych korzyści - Gradle super optymalizuje czas kompilacji dla dużych projektów jeśli masz podział na moduły. Od strony clean codu moduły zapewniają najczęściej lepszą enkapsulację rzeczy i nazewnictwo dzięki czemu naprawdę jest sporo korzyści.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)