• 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

Object Storage Arubacloud
0 głosów
349 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,280 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ź 243 wizyt
pytanie zadane 23 marca 2021 w Python przez user125 Początkujący (400 p.)
0 głosów
0 odpowiedzi 280 wizyt
0 głosów
1 odpowiedź 337 wizyt
pytanie zadane 2 września 2019 w C# przez XavRock Obywatel (1,390 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 pasjonatów

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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...