Objekt in Klassendiagramm an fremdes Objekt weiterreichen?

berndoa

Top Contributor
Klassendiagramm.png

Hallo, ich habe folgende Situation:
Es gebe Klassen so wie sie in obigem Baumdiagramm dargestellt sind.
Und es gebe für jede der Klassen A,B1,B2,...,C5 jeweils genau ein Objekt dieses Typs.
Jedes dieser Objekt besitze Referenzen auf die Objekte der anderen mit ihr verbundenen Klassen.
Also bspw. ein B1 Objekt hat Referenzen auf C1 und C2 Objekte und auch umgekehrte Richtung.


jetzt stehe ich vor einem Grundsätzlichen Problem:
Sagen wir das Objekt der Klasse C3 habe gerade eine Methode met1() ausgeführt und als Rückgabewert bspw. ein String Array erhalten.
Und die davon ganz entfernte Klasse B3 (bzw. dessen Objekt) habe eine Methode met2(String[] a).
Nun würde ich gerne dafür sorgen dass in im B3 Objekt die met2 benutzt wird mit jenem String Array, dass die Methode des C3 Objekts als Rückhgabewert produziert hat.

Wie könnte man das machen?

Mein Grundgedanke wäre gewesen, erst dieses Ergebnis (das String Array) sowie die Info, dass die met2 Methode damit auszuführen ist, erst der Baumwurzel A zukommen zu lassen.
Und die müsste es dann irgendwie nach unten bis zu B3 runtersinken lassen.

Nur wie das Ganze umzusetzen ist die Frage.
Wie schicke ich die Methode und Co. bis anch oben zu A?
Und wie weiß A, dass B3 die gewünshcte Methopde hat und wie lässt er es genau dahin runtersinken?

Ich habe da gerade keinen guten Plan wie ich das irgendwie hinkriegen könnte :-/

Nur kurz um Missverständnisse zu vermeiden: Die miteinander verbundenen Klassen sind keine Sub/SUperklasssen voneinander vererben sich nichts und sind rein dadurch verbunden dass die eine eine Referenz auf die Andere hat.

Ich habe shcon gelesen dass Manchs mit Reflektion gehen soll, aber erscheint mir recht kompliziert.
Schließlich soll es am Ende vom Lied ja keine 10 Sekunden dauern bis die nächste Methode gefunden und ausgeführt wird...
 
So wie Du das beschreibst ist das einfach nur ein Zeichen für ein schlechtes Design. Wenn etwas aus einem Teilbaum so direkt für ein Element eines anderen Teilbaums wichtig ist, dann ist diese Struktur vermutlich schlicht schlecht gewählt. Wenn etwas direkten Einfluss hat, dann sollte man auch schauen, dass man dies direkter abbildet.

A hat nur ein B1, B2 und B3. Wie diese genau aussehen, ist für A uninteressant. A kennt also keine C Elemente! Und wenn da dann etwas von einem C Element für ein anderes kommt, dann ist es für A schlicht in der Form uninteressant.

Wenn die Struktur richtig wäre, dann würde das C Element das an das B Element geben. Das B Element würde das im Detail auswerten und würde daraus etwas machen, das für A interessant ist. A weiss dann, dass dies so vom Prinzip für ein anderes B wichtig ist.

Konkretes Beispiel (Solltest Du auch bringen, das würde es vereinfachen):
Ein Auto hat ein Motor. Der Motor hat irgendwelche anderen Bauteile und da wird auch einiges gesteuert, z.B. Einspritzanlage, Ventile, ....
Das sind aber interne Dinge. Wenn nun ein Ventil ein Problem hat, dann wertet das der Motor erst einmal aus. Da kommt dann aber nicht dieses Detail hoch sondern der Motor packt das in eine eigene Nachricht, die Universell ist für den Motor. (Das Auto kennt keine Ventile oder so! Damit könnte es also auch gar nichts anfangen!) Daraus kann dann das Auto irgendwas folgern. Von mir aus wird der Motor ausgekoppelt:
  • Motor: Gas weg / aus
  • Kupplung: Auskuppeln
  • Warnblinkanlage: ein

Was das jeweils bedeutet, weiss das Auto nicht. Ein Automatikgetriebe geht auf Normal, ein Schaltgetriebe nimmt den Gang raus.
Warnblinkanlage: Was für Blinker es alles gibt, interessiert das Auto nicht. Die Anlage weiss es aber: vorne/hinten jeweils links/rechts ein Blinker. In den Außenspiegeln recht/links, In dem Kotflügel. Hinten oben evtl ...

Wenn nun die Warnblickanlage feststellt: Bei einer der Lampen gibt es eine Exception, dann kann das auch wieder signalisiert werden an das Auto. Das ist aber dann wieder universell verpackt. Die Implementationsdetails interessieren das Auto nicht.

Das nur einmal kurz als Erläuterung.
 
Sagen wir das Objekt der Klasse C3 habe gerade eine Methode met1() ausgeführt und als Rückgabewert bspw. ein String Array erhalten.
Und die davon ganz entfernte Klasse B3 (bzw. dessen Objekt) habe eine Methode met2(String[] a).
Nun würde ich gerne dafür sorgen dass in im B3 Objekt die met2 benutzt wird mit jenem String Array, dass die Methode des C3 Objekts als Rückhgabewert produziert hat.
Vielleicht wäre es besser, wenn deine Methoden keine Rückgabewerte hätten, sondern stattdessen Ereignisse auslösen würden, mit denen sie ihre Ergebnisse an einen Ereignisbus senden.
 
Das sagt mir jetzt noch gar nichts, wie macht man sowas? :O
Man könnte ein fertiges Produkt einsetzen oder selbst etwas Rudimentäres basteln. Ich gehe jetzt von Letzterem aus und dann könnte es ungefähr so aussehen, dass dem C3-Objekt bei der Erzeugung eine Veröffentlichsmethode eines Ereignisbusses übergeben wird, über die es seine Ereignisse publiziert, z.B. so ähnlich:
Java:
public record C3Event(String[] data) { }
Java:
import java.util.function.Consumer;

public class C3 {
    private final Consumer<C3Event> eventPublisher;
    
    public C3(Consumer<C3Event> eventPublisher) {
        this.eventPublisher = eventPublisher;
    }

    public void met1() {
        String[] result = new String[]{"aa", "bb", "cc"};
        C3Event event = new C3Event(result);
        eventPublisher.accept(event);
    }
}
B3-Objekte bekommen eine Methode, über die sie solche Ereignisse empfangen können:
Java:
public class B3 {
    
    public void onC3Event(C3Event event) {
        met2(event.data());
    }
    
    private void met2(String[] data) {
        System.out.println(Arrays.toString(data));
    }
}
Man könnte es so benutzen:
Java:
public class Main {

    public static void main(String[] args) {
        EventBus eventBus = new EventBus();
        
        B3 b3 = new B3();
        eventBus.subscribe(C3Event.class, b3::onC3Event);
        
        C3 c3 = new C3(eventBus::publish);
        c3.met1();
    }

}

Ob das insgesamt gut ist, weiß ich nicht. Deine Objekte hätten zwar ein Kommunikationsmittel, aber trotzdem müssen die Ereignissender- und empfänger ja irgendwie verdrahtet werden. Evtl. wird dann das Durchreichen des Ereignisbusses zum Problem. Außerdem könnte es die Verarbeitungslogik verschleiern, wenn Ergebnisse nie direkt verarbeitet werden sondern immer nur irgendwer irgendetwas an irgendjemanden versendet.
 

Zurück
Oben