Dobra organizacja większych aplikacji springowych

Dobra organizacja większych aplikacji springowych
ZA
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 5 lat
  • Postów:174
0

Witajcie,
Ostatnio zauważyłem że architektura projektu napisanego w Springu, który hoduję od ok 6 miesięcy nie daje rady (moim zdaniem).
Problem polega głównie na złożoności logiki biznesowej jak i mnogości funkcji oferowanej przez produkt.
Dodatkowo klient ma dość chore wymagania, jak pokazywanie moim zdaniem zbyt dużej ilości informacji na 1 widoku (co wiąże się ze wrzucaniem ogromnej ilości propertiesów do modelu we wzorcu MVC), ale nie z tym do was przychodzę.
Związku z tak ogromną ilością funkcjonalności powstało dużo serwisów, a w nich ogrom zagmatwanych metod. Chciałbym zabrać się za refactoring tego kodu, lecz nie wiem od czego zacząć.
Czy architektura serwisowa znajduje w ogóle zastosowanie w większych projektach? Czy lepiej zrobić to inaczej? Jak inaczej to jak?
Jak pozbyć dużej ilości pól wstrzykiwanych do każdej z instancji serwisów?

Pozdrawiam i liczę na wasze wskazówki, jak utrzymać ten projekt, by jego rozwój był przyjemnością, a nie płaczem :)

PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:3 miesiące
  • Postów:2787
0

Też chętnie się dowiem, co na ten temat myślą @Shalom @somekind @katelx @Lectre. Od siebie napiszę, że jak najbardziej, warstwowa architektura jest okej. Prawda, że przy złożonej logice, serwisy będą miało sporo wstrzykniętych innych serwisów. Kluczem tutaj będzie dobre projektowanie kolejnych metod pod względem poziomu abstrakcji - jeśli coś dotyczy w większości encji X, to piszę tą metodę w serwisie do X.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

Niejako tutaj: http://4programmers.net/Forum/Inzynieria_oprogramowania/276798-wstrzykiwanie_zaleznosci_a_testy_jednostkowe_-_zloty_srodek?p=1288229 toczy sie dyskusja zbliżona ;)
Myślałeś może o podejściu Backend-as-a-service i mikroserwisach? Wyobraź sobie że zamiast w jednym biednym kontrolerze zbierać wszystkie możliwe informacje a potem upychać do modelu zeby wyrenderować widok mozesz to zrobić zupełnie inaczej:

  • Masz wiele małych, specjalizowanych kontrolerów @RestController które zwracają bardzo konkretne dane jako jsona
  • Po stronie frontendu masz ajaxowe wywołania javascriptu które pobierają z twoich kontrolerów dane i wyswietlają je.

To powinno pomóc w obu kwestiach. Logika biznesowa trochę się odseparuje, bo nie będziesz potrzebował już serwisów "zbierających" dane z wielu miejsc. Powinno to też ułatwić pracę z klientem, bo teraz dodanie nowych danych to jest dodanie nowego modułu z jego własnym kontrolerem, a nie dopisywanie i przerabianie istniejącego.
Jeśli chodzi o podejście serwisowe to się sprawdza, ale może warto pomyśleć o jakiejś hierarchii i poziomach abstrakcji?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
ZA
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 5 lat
  • Postów:174
0

@Shalom Hierarchii i poziomach abstrakcji? Co masz dokładniej na myśli?

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

Na myśli mam że zamiast wstrzykiwać 10 zależności do jednej klasy można je zwykle zgrupować i wstrzyknąć np. 3 serwisy grupujące (z których każdy ma 3-4 zależności). Czyli tworzysz kolejny poziom abstrakcji.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
Lectre
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 6 lat
  • Lokalizacja:Warszawa
  • Postów:293
1

Pracuję teraz w projekcie na ~700k linii samej Javowej logiki, zastosowana jest architektura serwisowa, więc jak najbardziej znajduje zastosowanie w większych systemach. W dodatku czytelność i utrzymalność na relatywnie wysokim poziomie. Wszystko dzięki modularyzacji i mikroserwisom. W rzeczywistości każda funkcjonalność to osobny byt, który można osobno zbudować, osobno uruchomić i osobno przetestować. Niemniej wątpię by przepisywanie całej aplikacji na mikroserwisy było rozwiązaniem na twoje bolączki.

Jak sam mówisz, upychasz do modelu wszystko jak leci, a to źle. Stwórz, tak jak mówił Shalom osobne RESTowe endpointy wysyłające małe paczki danych. Dodatkowo część logiki możesz przerzucić na JS, nie mówię tu o zaprzęganiu Angulara, bo w tym przypadku byłoby to bez sensu, ale np. formatowanie danych możesz zrzucić na front-end, wtedy zamiast tworzyć 10 kontrolerów do jednego zasobu (albo jednego uber kontrolera z 10 parametrami) tworzysz bardziej generyczny kontroler. Oczywiście to raczej zasada kciuka i nie trzymaj się tego sztywno, żeby na przykład nie wysyłać wrażliwych danych tam gdzie nie są potrzebne. Anyway, you get the concept.

Ciekawy temat, czekam na pomysły innych :)

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:2 dni
  • Lokalizacja:Wrocław
0

Dziel i rządź. Bez kodu trudno zasugerować coś więcej.

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)