3 zagnieżdżone pętle - uproszczenie

3 zagnieżdżone pętle - uproszczenie
RezyserKinaAkcji
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 163
0

Cześć Panowie. Pracuję nad kodem i muszę z głównego obiektu wyciągnąć obiekt spelniający pewne założenia. Obiekt główny jest mocno skomplikowany i zawiera w sobie listy obiektów, które zawierają swoje listy obiektów itp

Od razu widać, że wychodzi z tego arrow anty-pattern. Czy ktoś mógłby mi doradzić jak to uprościć, by wyglądało to bardziej elegancko ? Próbowałem streamami, ale 3 pętle to już trochę za dużo i się gubię.

Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1912
3

Złamane jest prawo Demeter (pomimo, że są to dtosy, a nie obiekty, wyglada to słabo). Ze streamami będzie to samo, a nawet gorzej (mniej czytelnie, dyskusyjne).

Deleguj wykonanie tych pętli do kolejnych obiektów w zagnieżdżeniu, to będziesz miał po jednym forze. Może zauważysz coś więcej i poprawisz w kolejnym kroku. Niestety jestem na wakacjach i nie mam dostępu do IDE :)

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5550
3
RezyserKinaAkcji napisał(a):

Cześć Panowie.

Panie tu też są

Pracuję nad kodem i muszę z głównego obiektu wyciągnąć obiekt spelniający pewne założenia. Obiekt główny jest mocno skomplikowany i zawiera w sobie listy obiektów, które zawierają swoje listy obiektów itp

Wklej kod jako tekst

Od razu widać, że wychodzi z tego arrow anty-pattern. Czy ktoś mógłby mi doradzić jak to uprościć, by wyglądało to bardziej elegancko ? Próbowałem streamami, ale 3 pętle to już trochę za dużo i się gubię.

Przy streamach też będziesz miał arrow anty-pattern (może mniejszy o jeden czy dwa poziomy) bo Java dalej nie ma For Comprehensions.
Ogólnie algorytm jest for zamień na metodę flatmap za wyjątkiem ostatniego for który pewnie powinieneś zamienić na map

W0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3759
1

Streamy:

Kopiuj
List<DigitalContentTileDTO> result = digitalContentsViewDTO.getPaginated().stream()
	.flatMap(e -> e.getPages().stream())
	.flatMap(e -> e.getContents().stream())
	.filter(e -> e.getVisibilityChanged())
	.filter(e -> !e.getIsHidden())
	.collect(Collectors.toList());

Bez zmiany modelu prościej się nie da.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
3

Problem polega na tym że próbujesz zrobić logikę domenową na DTOsach zamiast na obiektach domenowych i dlatego wychodzi taka kupa. Powinieneś pracować na obiektach które zawierają logikę i wtedy taki problem w ogóle nie występuje.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.