• 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

Fiszki IT
Fiszki IT
0 głosów
94 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,360 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ź 43 wizyt
pytanie zadane 23 marca w Python przez user125 Początkujący (400 p.)
0 głosów
1 odpowiedź 150 wizyt
pytanie zadane 2 września 2019 w C# przez XavRock Użytkownik (930 p.)
0 głosów
0 odpowiedzi 162 wizyt
pytanie zadane 7 sierpnia 2018 w C i C++ przez Huberti Gaduła (3,730 p.)
Porady nie od parady
Forum posiada swój własny serwer Discord, dzięki któremu będziesz mógł po prostu pogadać z innymi Pasjonatami lub zapytać o jakiś problem. Podstrona z chatem znajduje się w menu pod ikoną człowieka w dymku.IRC

84,721 zapytań

133,525 odpowiedzi

295,917 komentarzy

55,997 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...