• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dwustronna zależność między klasami

0 głosów
584 wizyt
pytanie zadane 30 kwietnia 2020 w Java przez DawidyBankowe Nowicjusz (150 p.)

Cześć wszystkim. Szukam jak najlepszego rozwiązania z punktu widzenia architektonicznego następującego problemu:

Otóż jest klasa nazwę ją Class1, która korzysta z Class3 i Class4. Ja natomiast napisałem klasę Class2, która w podobny sposób skorzysta z Class3 i Class4, użyje tych samych metod, jednak wymaga, aby w metodach klas Class3 i Class4 było inne specjalne zachowanie dla Class2, jednocześnie, nie psując zachowania dla Class1, ale ta indywidualna zmiana specjalna dla Class2 jest w środku metod Class3 i Class4, które również wywołuje Class1. 

Rozwiązania, które wydają mi się kiepskim pomysłem to dodanie flagi boolean po której bym sprawdzał skąd jest wywołanie i dostosował zachowanie. Bądź napisać podobne osobne metody specjalnie dla Class2, ale to wiążę się z dużą redundancją kodu, a z tego powodu, że różnica w zachowaniu są w środku metod klas Class3 i Class4 powoduje, że nie bardzo da się je rozdzielić przez wyodrębnienie na mniejsze.

Pomysł jaki przyszedł mi do głowy to coś takiego:

JEDNA KLASA

public class Class2 {
    private Class2 class2 = this;
	
	.
	.
	.
	
	Class3 export = new Class3();
                byte[] data = export.metodaClass3(zmienna1, zmienna2, class2);
				
				
				

DRUGA KLASA

public class Class3 {
       
    private Class2 class2 = null;
	
	public byte[] metodaKlasy2(Long[] zmienna1, Long zmienna2, Class2 class2) throws SQLException {
        this.class2 = class2;
        
        return exportData(zmienna1, zmienna2);
    }
	
	
	private ByteArrayOutputStream exportData(Long[] zmienna1, Long zmienna2) throws Exception {
	.
	.
	.
		if(this.class2 != null) 
			Zrób jedno (jesli wywolanie bylo z class2)
		else 
			Zrób drugie (jesli wywołanie bylo z class1)
	}

Nie jestem przekonany co do tego pomysłu, m.in. dlatego, że jeśli Class2 nie będzie używana to w Class3 będzie ciągle śmieć w postaci instancji class2.. i to samo by było dla Class4 dlatego pytam o inne rozwiązanie.

Nad czym się zastanawiam to może użyć klasy abstrakcyjnej bądź interfejsu, ale tym sposobem również byłaby nie mała redundancja kodu, bo trzeba by było zaimpelmentować bardzo podobne metody w każdej podklasie wyspecjalizowanej osobno dla Class1 i Class2, oraz może być może byłby to przerost formy nad treścią, jeżeli to jest potrzebne tylko dla wywołań dwóch klas (Class1, Class2). Jeśli jednak tak będzie lepiej pod względem architektonicznym i czystego kodu to tak bym zrobił, ale nie wiem i pytam o radę. Mam nadzieje, że za bardzo nie zagmatwałem tej sprawy i Wy jako czytelnicy zrozumiecie o co mi chodzi i doradzicie dobre rozwiązanie. :)

2 odpowiedzi

0 głosów
odpowiedź 1 maja 2020 przez mibdbz Gaduła (4,300 p.)
Od razu na myśl przychodzi mi jakieś dziedziczenie a może nawet interfejs. W klasie nadrzędnej zgromadź wszystkie takie same metody. W klasach podrzędnych użyj może instrukcji super (), aby coś pozmieniać. A interfejs z klas 3 i 4 to też dobry pomysł. Po to jest aby używać.
0 głosów
odpowiedź 1 maja 2020 przez mbabane Szeryf (79,260 p.)

Być może wzorzec strategia tutaj będzie pasował lub metoda szablonowa.

napisałem klasę Class2, która w podobny sposób skorzysta z Class3 i Class4, użyje tych samych metod, jednak wymaga, aby w metodach klas Class3 i Class4 było inne specjalne zachowanie dla Class2, jednocześnie, nie psując zachowania dla Class1

Czyli, Class2 nie korzysta już z Class3 i Class4, tylko z czegoś innego. Co może oznaczać, że jeśli byś tak zrobił to Class3 i Class4 robiłyby zbyt dużo. Dlaczego nie zrobić jeszcze Class5  i Class6? Dodatkowo jeśli Class1 i Class2 będą korzystać z Class3 to masz ryzyko, że zmiana w Class3 uszkodzi Class1 i odwrotnie - tym bardziej, że, jak piszesz, nie korzystają one z Class3 w dokładnie taki sam sposób.

Podobne pytania

0 głosów
1 odpowiedź 509 wizyt
pytanie zadane 23 marca 2021 w Python przez user125 Początkujący (400 p.)
0 głosów
0 odpowiedzi 572 wizyt
0 głosów
1 odpowiedź 567 wizyt
pytanie zadane 2 września 2019 w C# przez XavRock Obywatel (1,390 p.)

93,632 zapytań

142,556 odpowiedzi

323,058 komentarzy

63,141 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 2900p. - dia-Chann
  2. 2870p. - DziarnowskiJ
  3. 2827p. - Łukasz Piwowar
  4. 2783p. - raydeal
  5. 2758p. - Adrian Wieprzkowicz
  6. 2713p. - rucin93
  7. 2579p. - Łukasz Eckert
  8. 2523p. - Maurycy W
  9. 2459p. - CC PL
  10. 2082p. - Michal Drewniak
  11. 1885p. - robwarsz
  12. 1851p. - Mariusz Fornal
  13. 1811p. - rafalszastok
  14. 1600p. - Rafał Trójniak
  15. 1588p. - Tomasz Bielak
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...