Java EE - początek nauki.

Java EE - początek nauki.
S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
0

@Pinek: w sumie czasami sięe tak robi, np. przekazuje sie Comperator ale generalnie jestem przeciwny nadmiernemu stosowaniu tego rozwiązania, sprawia że kod jest mniej czytelny zwiększa niepotrzebnie liczbę argumentów i ogólnie jest to jakieś takie dziwaczne :D
Moim ulubionym podejściem jest stworzenie konstruktora, wstrzyknięcie wszystkich zależności przez niego i dodatkowo te zależności powinnny byc inteferjsami a pola final :)


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 17 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
0

Jednym z najzabawniejszych Kargo Kultów jaki widzę w JavaEE i Spring jest właśnie tworzenie interfejsów do każdego beana. Jeśli w systemie jest tylko jedna implementacja... to naprawdę ciężko wymyślić wytłumaczenie. Ale ludzie tak robią, bo to się wydaje spoko profesjonalne. A kto wie kiedyś może będzie drugi CustomerServiceBeanImpl2 :P...

A powód jes banalny - w zamierzchłym EJB / JavaEE ( i chyba , bo teraz nie moge znaleźć dokładnie kiedy - w starym Springu*). nie dało się inaczej tych beanów wstrzyknąć, wykorzystać. Żeby zadziałało Dynamic Proxy - musiał być interfejs. Tylko potem weszło w użycie cglib i problem zniknął - już nie było potrzeby pisania tych interfejsów. A tradycja mimo to przetrwała :-)
Kargo Kult

(*Update: W springu był cglib od wersji 1.0. Inna sprawa, że w zależności czy użyty był cglib czy proxy z JDK są minimalne różnice w działaniu - magia jest inna. * )


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 5x, ostatnio: jarekr000000
M9
W EJB 3.0 specyfikacja wymuszała interfejsy @local / @Remote. W sumie sam potem usuwałem z całego projektu zostawiając @stateless w 3.2.
KK
  • Rejestracja:ponad 16 lat
  • Ostatnio:około miesiąc
0

Od kilku dni bawię się Springiem, napieram RESTy, sadzę adnotacje, mockuje wszelkie testy. Nawet mi się zaczęło to podobać. Teraz czytam Was i znowu mam zrytą banię. :D

A skoro ja mam, to autor tematu już chyba do działu Javy nie zajrzy na tym forum..


jarekr000000
Widzisz, może przynajmniej jego udalo się uratować.
M9
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 6 lat
0

Taki temat na forum mamy średnio raz na tydzień. Ogólnie mi nie robi większej różnicy czy pisze w Springu czy JEE, tylko adnotacje się zmieniają. Zgadzam się, że programowanie oparte na proxy / instrumentacji bajt-kodu jest zbyt skomplikowane i nieprzyjemne. Też podoba mi się kierunek w jakim zmierza Spring. Oby tak dalej. W JEE 9 też potencjalnie jest szansa na ciekawe rzeczy jak standaryzacja obsługi wielu tenantów, NoSQL, centralnej konfiguracji (typowe wzorce do mikrousług). Jak community się za to weźmie to może będzie ok (fundacja Eclipse). Jak JEE zrobi to dobrze to i Spring skorzysta (uważam, że póki co Spring Cloud jest zbyt skomplikowany,ale standaryzacja mogłaby pomóc).

Też liczę na popularyzacje czystego kodu javowego/kotlinowego z dala od piekła proxy i adnotacji. W końcu pozwoli się to skupić na tym co jest naprawdę ważne, czyli logice biznesowej. Serwery aplikacyjne głównie przeszkadzają.

edytowany 4x, ostatnio: margor90
S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
0

@jarekr000000: a inny powód też jest banalny. Jesli stosujesz CGLIB to nie możesz implementacji beana zrobić finalną. A ja ja wszystkie beany robie final, z konstruktorem z argumentami i wszystkie pola są final :)


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Spring swego czasu w ogóle nie wspierał cglibowych class proxy, a później tylko z odpowiednią konfiguracją. W efekcie jak miałeś jakiegoś beana z dodatkowym aspektem (czyli np. @Service + @Transactional) to juz nie działało bo spring nie był w stanie wygenerować odpowiedniego proxy dla takiej klasy, jeśli operowałeś na klasach a nie interfejsach. Nie dało się takiego beana wstrzyknąć podając typ klasy, tylko poprzez interfejs. Ale fakt, niektórym pewnie zostalo takie pisanie "na wszelki wypadek" :D
Z drugiej strony to niby takie pisanie zgodnie z zasadą Dependency Inversion Principle, poleganie na interfejsie a nie na konkretnej implementacji! ;)


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 6x, ostatnio: Shalom
S9
/jw nie możesz zrobić zadeklarować klasy z użyciem final i mieć CGLIBa...
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0

Mnie dobija jak mam interfejs do beana z którego się korzysta, mam beana, ale ten bean już nie implementuje tego interfejsu bo po drodze jest jakaś magia która powoduje że ten interfejs jest opcjonalny. Czyli wywołuję nie-wiadomo-co.

zyxist
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 6 lat
  • Postów:101
1

@jarekr000000 -> jest wytłumaczenie, i to całkiem uzasadnione. Ja na przykład wypracowałem sobie taki styl programowania zupełnie niezależnie od Spring/JEE, aby rozwiązać bardzo prozaiczny problem. Mianowicie zauważyłem, że gdy ludzie mają w aplikacji niemal wyłącznie klasy, to mają silną tendencję do tworzenia ogromnych klocków, gdzie wszystko pospinane jest ze sobą, jak spaghetti. Ponadto sprawia to, że ludzie przestają patrzeć na to, co dany kawałek aplikacji powinien robić, tylko biorą jakąś rzecz i używają, "bo akurat im tu pasuje".

Zacząłem wprowadzać interfejsy dla pojedynczych serwisów, aby programiści nauczyli się myśleć w kategoriach "kontraktów" i tego, by nie przywiązywać się aż tak bardzo do tego, co jest po drugiej stronie. Jeśli chcesz sobie podejrzeć jakąś metodę, a zamiast tego trafiasz na interfejs z paroma metodami i musisz włożyć więcej wysiłku by znaleźć ich implementację, to zmusza to do pewnej refleksji. Ponadto w interfejsie widać głównie prototypy metod (no... od Javy 8 już niekoniecznie) i łatwiej jest dostrzec kontekst. Okazało się, że takie podejście zaczęło przynosić dobre efekty i dlatego je kontynuuję. Niejednokrotnie też później okazywało się, że te interfejsy przydawały się, gdy nagle okazywało się, że jednak jest potrzebna więcej niż jedna implementacja (albo gdy zaczynałem tworzyć nową implementację o statusie "eksperyment", która przez pewien czas funkcjonowała "na żądanie" równolegle ze starą). Jak widać, jest uzasadnienie dla takiego stylu programowania całkowicie niezależne od kontenerów, aspektów, itd. Chwalą to sobie zwłaszcza osoby nowe w projekcie, bo mogą wziąć sobie jakieś zadanie i skupić się na małym wycinku systemu.

Ktoś może zapytać czy tworzę też interfejsy dla jakichś utensyliów. Odpowiedź brzmi: nie, nie popadam tutaj ze skrajności w skrajność. Stosuję też bezpośrednie zależności między klasami, ale raczej na poziomie bardziej lokalnym, tj. kilka klas leżących obok siebie w jednym pakiecie, stosuję bezpośrednio klasy "utensyliowe".


edytowany 1x, ostatnio: zyxist
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 17 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
2

@zyxist: kontrakty... no po to zostały interfejsy wymyślone :-) Tyle, że klasa to też kontrakt. Jak jest mała to go dobrze widać.

Różne są wypadki, też mi się zdarza zrobić interfejs do jednej klasy... ale to raczej wyjątek.
Jak dla mnie jak jest potrzeba drugiej implementacji - to wydzielenie metod do interfejsu to nie jest problem. Extract interface i posprzątane.

Interfejsy na zapas - jesli jest ich dużo, albo są niejako standardem (tak wszystko piszemy bo dziadowie kazali) to IMO smród.
Dodatkowo ten argument z zastanowieniem się, bo trafiamy na interfejs tak sobie działa:
Ctrl + Alt + B i jesteśmy w implementacji - nawet nie wiem, że po drodze był interfejs (ja tak sobie radze z przesadzonymi springowymi kobyłami).
Dodatkowo IntelliJ bezproblemowo uzupełnia i zmienia te wszystkie metody w interfejsie. .... więc wychodzi na to, że go mam, ale do niego nie zaglądam nawet -> ergo szum informacyjny.
Tu mówię o klasycznym przykładzie (mam taki teraz jeden soft), gdzie do każdego beana są pododawane interfejsy. Tylko mnie to wkurza - nic nie wnosi.

Btw. kiepscy programiści pewnie nie wszyscy potrafią skoczyć do implementacji od razu - więc rozumiem, że częściowo system działa. Potykają się o ten interfejs to ich spowalnia, piszą mniej kiepskiego kodu -> profit.


jeden i pół terabajta powinno wystarczyć każdemu
zyxist
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 6 lat
  • Postów:101
0

Argument "robię coś, bo ktoś mi kazał" jest smrodkiem. Natomiast argument "jak czegoś jest dużo, to jest to smród" można odnieść równie dobrze do programowania funkcyjnego i wszystkiego :), jeśli pozbawiony jest kontekstu. Ja patrzę na to tak:

jeśli stosuję coś w dużych ilościach z powodów takich, jak:

  • ktoś mi kazał,
  • bo to jest trendy,
  • bez refleksji nad dostępnymi rozwiązaniami,
  • by obchodzić jakieś ograniczenia technologii, którą używam,
    to jest to smród.

Natomiast co do reszty, to są różne style programowania. W kwestii kontraktów Twoje podejście ma również zalety i wady, ale nie jest jedynym słusznym. U mnie stosowanie interfejsów przynosi wymierne korzyści w postaci podniesienia jakości kodu. Nie posługuję się też generalizacjami "kiepscy programiści". Są ludzie, którzy są kiepscy, ale tak samo są ludzie, którzy dopiero zdobywają doświadczenie. Każdy był kiedyś początkujący, również Ty :). Ponadto widzę też, że profil tego, co piszesz (aplikacje), różni się trochę od profilu tego, co ja piszę (rozszerzalne biblioteki/rozwiązania dla programistów). W aplikacji końcowej, rozwiązującej jeden, konkretny problem, jest jeden kontrakt. U mnie często jest ich trochę więcej: kontrakt dla użytkownika, kontrakt dla mnie, które mogą się różnić i nie chcę, by użytkownicy widzieli i uzależniali się od wszystkich kontraktów w moim kodzie, bo później są duże problemy z utrzymaniem i migracją na nową wersję.


jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 17 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
0
zyxist napisał(a):

Natomiast co do reszty, to są różne style programowania. W kwestii kontraktów Twoje podejście ma również zalety i wady, ale nie jest jedynym słusznym. U mnie stosowanie interfejsów przynosi wymierne korzyści w postaci podniesienia jakości kodu. Nie posługuję się też generalizacjami "kiepscy programiści". Są ludzie, którzy są kiepscy, ale tak samo są ludzie, którzy dopiero zdobywają doświadczenie. Każdy był kiedyś początkujący, również Ty :). Ponadto widzę też, że profil tego, co piszesz (aplikacje), różni się trochę od profilu tego, co ja piszę (rozszerzalne biblioteki/rozwiązania dla programistów). W aplikacji końcowej, rozwiązującej jeden, konkretny

Co do bibliotek to się zgadzam, ba zdarza się, że nawet mam interfejsy bez implementacji (poza testami).
A zarzut, że byłem kiedyś początkujący jest całkiem nieuzasadniony :-)

Btw. są kiepscy programiści - to tacy co się nie uczą i nie chcą uczyć. Więc nie zdobywają doświadczenia, nawet jeśli przypadkiem coś tam umieją.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
discoStar
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Wlk. Brytania
  • Postów:92
0

@jarekr000000: czemu polecasz tylko Javę? Większość ofert pracy to Spring/Java EE.

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)