Jak żyć bez singeltona?

Odpowiedz Nowy wątek
2020-06-29 19:47

Rejestracja: 4 miesiące temu

Ostatnio: 2 tygodnie temu

0

Witam.
Jak w dużych projektach dajecie rade nie popaść w paranoje?
Posiadam główną klasę a w niej dostęp do klasy jakże super nazwanej Database a w niej kolekcje z mongodb.
Następnie mam obiekt A w którym jest trzymany obiekt B w którym trzymany jest obiekt C.
I teraz chcąc mieć dostęp z klasy C -> Database muszę wykonać getB().getA(),getMain().getDatabase();
Wygląda to dziwnie ale co ja mogę zrobić?

Pozostało 580 znaków

2020-06-29 19:57

Rejestracja: 1 rok temu

Ostatnio: 45 minut temu

2

poczytaj o regule TDA (Tell, don't ask)
nie powinieneś "pytać" o obiekt B, z niego o A, z niego o Main i z niego o Database, a raczej "powiedzieć" obiektowi B żeby coś zapisał, ten może to samo oddelegować do A itd. Generalnie nie powinno Cię interesować jak "B" to zrobi a implementacja może się łatwo zmienić w czasie.

Jeśli chcesz zrezygnować z singletonów to żeby nie popaść w paranoje musisz mieć jakiś mechanizm dependency injection... nie wyobrażam sobie zrezygnować ze staticów, singletonów, dependency injection i service locatora w tym samym czasie - potrzebujesz co najmniej jednego z tych mechanizmów i sugeruję postawić na DI


edytowany 1x, ostatnio: obscurity, 2020-06-29 19:58
Dzięki jutro zabiorę się za czytanie. Masz może coś godnego polecenia? - MarekMareckiPL 2020-06-29 20:46
ogólnie polecam książki od "uncle boba", ale mówiąc o TDA miałem na myśli parominutowe artykuły które znajdziesz w googlach, to nie jest obszerny temat - obscurity 2020-06-29 20:52

Pozostało 580 znaków

2020-06-29 20:45

Rejestracja: 6 lat temu

Ostatnio: 2 godziny temu

Lokalizacja: Warszawa

2

Jest coś takiego jak konstruktor. A jesli potrzebujesz wywołac getB() getC() itd to masz jakiś dziwny projekt, bo obiektów się używa do zrobienia rzeczy np. wczytaj dane z bazy danych, wyślij emaila, itp


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
edytowany 1x, ostatnio: scibi92, 2020-06-29 20:52
Przeczytaj jeszcze raz. - MarekMareckiPL 2020-06-29 20:49

Pozostało 580 znaków

2020-06-29 22:22

Rejestracja: 4 lata temu

Ostatnio: 1 minuta temu

Lokalizacja: U krasnoludów - pod górą

1

Zgadzam się z poprzednikiem - problem polega na tym, że trzeba powiedzieć coś więcej o obiekcie C. Co to za gość?
Wtedy można powidzieć jakie jest rozwiązanie.
Sugerowane wcześniej DI jest często dobrym rozwiązaniem - z tym, że wbrew temu co większość javowców myśli, nie potrzeba do tego żadnych frameworków - wystarczą konstruktory.
(choć w kotlinie ładniej to troche wygląda).


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 2x, ostatnio: jarekr000000, 2020-06-29 22:23

Pozostało 580 znaków

2020-06-29 22:27
Moderator

Rejestracja: 16 lat temu

Ostatnio: 15 minut temu

2

I teraz chcąc mieć dostęp z klasy C -> Database muszę wykonać getB().getA(),getMain().getDatabase();

Albo przekazujesz do klasy C obiekt Database, jeśli koniecznie faktycznie go tam potrzebujesz (np. przez konstruktor), albo jw. delegujesz wywołania. Kod musi operować na odpowiednich poziomach abstrakcji. Na poziomie jakiejś biznesowej operacji często wcale nie chcesz wiedzieć ze tam pod spodem jest jakaś baza danych. Chcesz np. pobrać wszystkie raporty z ostatniego tygodnia. Skąd te raporty idą jest zupełnie nie istotne. Tak samo nie interesuje cię jak na podstawie tabel w bazie powstanie ta lista obiektów Raport. Ty chcesz operować jakims biznesowym repozytorium i zrobić List<Raport> raports = raportRepository.getLastWeekRaports();


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2020-06-30 00:19

Rejestracja: 4 lata temu

Ostatnio: 1 minuta temu

0
MarekMareckiPL napisał(a):

Jak w dużych projektach dajecie rade nie popaść w paranoje?

Ja tam po prostu nie jestem fanatykiem kodowania, i jak widzę g*wno kod, to po prostu go ignoruję, robię swoje i idę dalej :D nie zamartwiam się tym - nie mam ambicji ratować świata

Pozostało 580 znaków

2020-06-30 00:52

Rejestracja: 4 lata temu

Ostatnio: 15 minut temu

1

Odnośnie tego co pisali przedmówcy ;)
https://pl.wikipedia.org/wiki/Prawo_Demeter
https://alvinalexander.com/ja[...]law-of-demeter-java-examples/

Pozostało 580 znaków

2020-07-01 16:16

Rejestracja: 4 miesiące temu

Ostatnio: 2 tygodnie temu

0

Dobra panowie wróciłem.
Mam stworzona jakąś tam główną klasę, w niej trzymam zmienną od konfiguracji, następnie mam moduł, który służy do ładowania/przetwarzania użytkowników, więc w tym module trzymam zmienne do klasy od wykonywania bazodanowych rzeczy, dodatkowo posiadam klasę do przetrzymywania załadowanych użytkowników.
Teraz skoro posiadam takie ułożenie i potrzebuje w prawie każdej klasie odnośnik do pobierania konfiguracji to dodać odnośnik w głównej klasie modułu i do niej za każdym razem gdy chce pobrać coś z configu się odnosić czy lepiej dodać odniesienie do tych wszystkich klas gdzie w wielu metodach potrzebuje użyć tej konfiguracji.

Pozostało 580 znaków

2020-07-01 16:33

Rejestracja: 1 rok temu

Ostatnio: 45 minut temu

1
MarekMareckiPL napisał(a):

Teraz skoro posiadam takie ułożenie i potrzebuje w prawie każdej klasie odnośnik do pobierania konfiguracji to dodać odnośnik w głównej klasie modułu i do niej za każdym razem gdy chce pobrać coś z configu się odnosić czy lepiej dodać odniesienie do tych wszystkich klas gdzie w wielu metodach potrzebuje użyć tej konfiguracji.

Musisz sobie zadać jedno, ale to za to bardzo ważne pytanie: czy te klasy zależą od tej klasy czy od konfiguracji? A potem zacznij to robić.

W ogóle błąd już masz w pierwszym zdaniu - nie powinno istnieć coś takiego jak "główna klasa"


Pozostało 580 znaków

2020-07-01 17:05

Rejestracja: 12 lat temu

Ostatnio: 3 minuty temu

1
MarekMareckiPL napisał(a):

I teraz chcąc mieć dostęp z klasy C -> Database muszę wykonać getB().getA().getMain().getDatabase();

Takie coś to ma swoją nazwę: Train wreck
i nie powinno się pojawiać w kodzie.
Zauważ, że te wyrażenie powoduje, iż bieżąca klasa ma zależność do kolejnych klas użytych podczas kolejnych wywołań, co jest niepożądane.

Polecam przeczytać "Clean Code" Robert C Martin.

Zresztą sama metoda getDatabase jest dowodem na to, że masz architekturę postawioną bazo-centrycznie, co jest klasycznym błędem architektonicznym.
W centrum ma być coś, co obsługuję logikę biznesową, a baza danych ma być tylko pluginem do tej logiki.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 4x, ostatnio: MarekR22, 2020-07-01 17:10
Miałem już dawno w planach poczytać w lipcu wolne to się rzucę. Co do getDatabase jest to przykład mam rozdzieloną baze danych na klasy zarządzające Userami,teamama itd - MarekMareckiPL 2020-07-01 17:23
polecam, bardzo fajna książka i naprawdę w dużym stopniu odpowie ci na twoje pytanie. Nawet planuje jeszcze raz ją przeczytać (a poza przeczytaniem, obejrzałem ją w wersji wideo z Uncle Bobem). - MarekR22 2020-07-01 17:28
@MarekR22: wykupiłeś całą serię? ja oglądałem na pluralsight ale jest tylko część epizodów - obscurity 2020-07-01 17:37
@MarekR22: nie zakupiłem jeszcze był to po prostu plan a jako iż będzie wolne to pyknie - MarekMareckiPL 2020-07-01 17:42
firma mi wykupiła dostęp do Safari/O'Reilly i tam to obejrzałem (na pluralsight wtedy tego nie było, ale są inne fajne materiały). - MarekR22 2020-07-02 09:01

Pozostało 580 znaków

2020-07-01 17:19
Moderator

Rejestracja: 16 lat temu

Ostatnio: 15 minut temu

0

Teraz skoro posiadam takie ułożenie i potrzebuje w prawie każdej klasie odnośnik do pobierania konfiguracji to dodać odnośnik w głównej klasie modułu i do niej za każdym razem gdy chce pobrać coś z configu się odnosić czy lepiej dodać odniesienie do tych wszystkich klas gdzie w wielu metodach potrzebuje użyć tej konfiguracji.

Ani jedno ani drugie. Tworząc te obiekty domenowe używasz danych z konfiguracji i tyle. Odnośnik do obiektu który trzyma konfiguracje to jest potrzebny tylko gdzieś gdzie tą konfiguracje zmieniasz, albo jak chcesz mieć dostęp do "aktualnej" konfiguracji która może się zmieniać. Jeśli twoja konfiguracja jest statyczna, ustalana przy starcie, to nigdzie jej nie potrzebujesz.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
No właśnie moja konfiguracja nie jest statyczna. - MarekMareckiPL 2020-07-01 17:22

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0