Architektura kodu

Architektura kodu
SZ
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:616
0

Witam,
chciałem się zapytać jak tworzycie bardziej zaawansowane algorytmy jeśli chodzi o struktury w kodzie nawet jeśli weźmiemy na tapetę "hexagonal architecture" oraz DDD gdzie centrum wszystkiego jest logika biznesowa to rodzi to u nas pewne problemy

Wyobraźmy sobie flow

Controller ->Application Service(UseCase, DTO) -> Domain Logic(DDD) -> Repo (Aka Hibernate)

Już na pierwszy rzut oka mamy do czynienia z trzeba strukturami obiektów:

  1. DTO - które spływa od klienta
  2. BusinessModel - jako obiekty dla obliczeń logiki biznesowej
  3. Entity jako dane do zapisu w bazie danych

konwersja tych typów jest bardzo męcząca dodatkowo rodzi problemy takie jak np. walidacja odbywa się na BusinessModel i teraz znów w jakiś magiczny sposób musimy przekształcać wyjątki z BusinessModel na te zrozumiał dla usera, np pole ilość przekracza douszczalny stan i teraz musimy zapalić lampeczke na GUI ale nie mamy powiązania GUI/DTO ->BusinessModel

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2
  1. Nie rozumiem trochę o jakiej konwersji mówisz. Warstwa logiki biznesowej to są zwykle Serwisy i mogą operować na tych DTO bez problemów. Ba, nawet powinny bo i czemu by nie.
  2. Nie rozumiem twojego problemu z wyjątkami bo powiązanie o którym mówisz istnieje i nazywa się Kontroler. Kontroler pobiera request od usera, woła metodę logiki biznesowej a potem pcha dane do odpowiedniego widoku. Jak poleci wyjątek to właśnie na kontrolerze się zatrzyma a ten pchnie do usera odpowiednie "dane" i odpowiedni "widok", w tym przypadku info o błędzie.

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
DK
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:13
0

Generalnie spotkałem się z różnymi podejściami w tego typu klasycznym stylu jeśli chodzi o wspomnianą "konwersję" i zarządzanie wyjątkami, natomiast ja osobiście preferuję kilka prostych rozwiązań usprawniających całą zabawę:

  1. Konwersja pomiędzy DTO i encjami: tutaj także spotkałem się z różnymi podejściami. Niektórzy preferują ręczną konwersję kreując klasy assemblery w tym celu, unikając jakiejkolwiek refleksji. Ma to swoje plusy w postaci pełnej kontroli konwersji. Minusem jest fakt, iż pola dto i encji mogą się znacznie rozjechać. Ja osobiście preferuję skorzystanie z metody copyProperties z BeanUtils ze Springa czy Apache Commons w celu szybkiej konwersji encji do dto. Plusem tego podejścia jest prostota i oszczędność czasu (nie trzeba pisać assemblerów). Jeszcze lepiej do kopiowania działa Dozer. Konieczność trzymania nazw pól w DTO i encjach spójnych też imho jest plusem. Niestety, przy tym podejściu każda zmiana w modelu / dto przemknie cichaczem i może objawić się NPE. Często i tak nie obejdzie się bez assemblerów, gdy trzeba będzie coś zaimplementować, co nie jest w encjach. W takich przypadkach lepiej jednak już pisać assemblery.
    W przypadku konwersji z DTO do encji (lub czegokolwiek innego w warstwie DAO) można zawsze posłużyc się walidacyjnymi propertisami z jsr303. Ale o tym w drugim punkcie.
  2. Jeśli chodzi o kwestię wyjątków i interfejsu użytkownika, tutaj wg mnie warto stworzyć sobie własne klasy wyjątków, które mogą posłużyć jako wrappery do wyjątków wyrzucanych czy to z warstwy serwisu, czy z DAO. Dodatkowo, mogą rozszerzać RuntimeException, dlatego możemy zapomnieć o zbytecznych try-catchach. Każdej instancji takiego wyjątku możesz nadać własne UUID (bardzo użyteczne w szukaniu problemu w logach), skorzystać z i18n w celu konwersji językowej wiadomości dla użytkownika czy pogrupować je jakimś polem enumem w grupy specyficznych wyjątków aplikacyjnych, co potem pozwoli na skuteczniejszy debug grepując logi. Warto skorzystac także z AOP nie tylko do logowania, ale choćby łapania tego typu bąbelkujących wyjątków. Np Springowego RestControllerAdvice, w którym możesz sobie łapać poszczególne klasy wyjątków wyrzucanych z kontrolerów. Daje Ci to duże możliwości: łapiesz wyjątek rzucany z czeluści backendu, logujesz stack trace, tłumaczysz wiadomość dla użytkownika poprzez serwis i18n, ustawiasz http status i tworzysz pięknego jsona z błędem zwracanego przez kontroler. Później możesz sobie takiego jsona dalej przetworzyć (np tworząc http interceptora po stronie frontu, np httpInterceptor w Angularze). Możesz użytkownikowi wyświetlić UUID błędu, co ułatwia wszelakie grepy po logach.
    Skorzystaj także z walidacji JSR303, oczywiście wcześniej warto się zabezpieczyć po stronie frontu, by nie robić niepotrzebnych calli do backendu. Jeśli nawet użytkownik wprowadzi błędne dane i przejdzie to walidację od strony UI, to jsr303 automatycznie wygeneruje wyjątek (choćby MethodArgumentNotValidException), który znowu przechwyci RestControllerAdvice i wypchnie elegancko do wiadomości użytkownikowi. Jeśli dojdzie do warstwy biznesowej i tam znowu zostanie rzucony wyjątek, to i tak wybąbelkuje wzwyż i zostanie złapane przez advice, wskutek czego użytkownik dostanie jakiś ładny generyczny komunikat.

Uff, trochę się rozpisałem, ale tego typu automatyzacja trochę uprzyjemnia zabawę z wyjątkami i konwersją.

edytowany 1x, ostatnio: Dawid Kotarba
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)