• 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

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

93,020 zapytań

141,982 odpowiedzi

321,283 komentarzy

62,366 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...