'objektmanager'

hallo.

folgendes problem:
es gibt zwei instanzen einer klasse K1: A und B.
diese können über eine memberfunktion set_x(int y) unabhängig voneinander eine speicherstelle a bzw. b schreiben`, die ihnen bei der instanziierung mitgeteilt wird.

jetzt kann es aber beispielsweise so sein, daß b speziell vor oder nach a geschrieben werden muß, wenn bestimmte voraussetzungen erfüllt sind.

ich hätte jetzt eine instanz M einer klasse K2 als „manager“ von A und B erstellt. diese instanz soll o.g. bestimmte voraussetzungen prüfen und das schreiben der speicherstellen in der richtigen reihenfolge übernehmen.

A und B würden sich dazu bei M mittels einer „Register“-funktion anmelden.
je nachdem, ob sie bei M angemeldet sind, schreiben sie selbst a bzw. b (über den aufruf der entsprechenden memberfunktion),
oder M übernimmt das, wobei in diesem fall o.g. bestimmte voraussetzungen geprüft würden.

damit M A und B kennt, bekäme die „Register“-funktion als parameter einen zeiger auf A bzw. B.
die implementierung in M sähe dann z.b. so aus:

if (registered(A) && registered(B))
{
if (*A_ptr.get_i() == 0)
{ /* a vor b schreiben */
*A_ptr.set_x(4);
*B_ptr.set_x(6);
}
else
{`/* B vor A schreiben */
*B_ptr.set_x(6);
*A_ptr.set_x(4);
}
}

das würde wohl funktionieren. aber gibt’s bessere methoden für sowas?

gruß

michael

Hallo,

welchen Grund gibt es denn, dass du in zwei unterschiedlichen Instanzen die Werte in einer bestimmten Reihenfolge speichern musst.

Eigentlich solltest du eher dein Klassendesign überdenken, weil die Werte ja offensichtlich zusammengehören.

Grüße,

hallo.

welchen Grund gibt es denn, dass du in zwei unterschiedlichen
Instanzen die Werte in einer bestimmten Reihenfolge speichern
musst.

können wir das nicht einfach als gegeben hinnehmen?

Eigentlich solltest du eher dein Klassendesign überdenken,
weil die Werte ja offensichtlich zusammengehören.

um mal bei den schönen bildlichen beispielen aus den lehrbüchern zu bleiben:

du hast zwei kleine söhne. das sind zwei instanzen desselben objekts „kind“.
beide wollen gleichzeitig fahrrad fahren. es gibt aber nur ein fahrrad für beide.
außerdem gibt’s einen großen sohn, der sein eigenes fahrrad hat.

dann gibt’s eine übergeordnete instanz „mimon“ einer klasse „vater“.
diese empfängt nun die requests beider söhne:
sohnA.willfahrradfahren == TRUE
sohnB.willfahrradfahren == TRUE.

vater sagt jetzt zum beispiel:
„sohnA ist älter als sohnB, also darf sohnA zuerst fahren“
-> sohnA.use_fahrrad = TRUE
-> sohnB.use_fahrrad = FALSE

sohnA soll nicht selber sein use_fahrrad auf TRUE setzen dürfen, weil er sich dann mit sohnB kloppt, wenn der dasselbe machen will.

der request von sohnC kann hingegen an der instanz „mimon“ vorbeigehen, weil sohnC ja sein eigenes fahrrad hat.

statt söhne kannst du jetzt einen treiber nehmen, und für’s fahrrad ein stück hardware.

gruß

michael

allo michael,

statt söhne kannst du jetzt einen treiber nehmen, und für’s
fahrrad ein stück hardware.

Für so etwas gibts auch Semaphoren.

MfG Peter(TOO)

hallo peter.

statt söhne kannst du jetzt einen treiber nehmen, und für’s
fahrrad ein stück hardware.

Für so etwas gibts auch Semaphoren.

ja. dann war das wohl ein blödes beispiel.
also nochmal anders:

es gibt zwei (oder mehr) signale, die in einer bestimmten reihenfolge geschaltet werden müssen, wenn man das möchte.
alternativ soll jedes signal für sich selbst schaltbar sein.
wenn’s auf die signalreihenfolge ankommt, hängt die schaltreihenfolge davon ab, wie die jeweiligen werte zueinander liegen.

diese analyse können die verschiedenen instanzen nicht selbst anstellen, weil sie ja nichts voneinander wissen.
deshalb sollen sie nur die schaltanforderung stellen, und eine übergeordnete instanz soll dafür sorgen, daß die signale tatsächlich in der richtigen reihenfolge geschaltet werden.

nochmal die frage:
ist die lösung mit funktionspointern auf die jeweilige instanz sauber oder gibt’s was viel besseres?

gruß

michael

Hallo michael,

ist die lösung mit funktionspointern auf die jeweilige instanz
sauber oder gibt’s was viel besseres?

Ich würde eine neues Objekt für set_x() erstellen.
Dies scheint ja der zentrale Punkt zu sein, wo der Verkehr geregelt werden muss.

MfG Peter(TOO)

Hallo.
Wenn ich dich richtig verstehe willst du das Vermittler Entfwurfsmuster implementieren. Vielleicht findest du bei weiterer Suche mit diesem Stichwort ob es das Richtige für dich darstellt bzw. Alternativen dazu.
Liebe Grüße.
Alex

hallo alex.

Wenn ich dich richtig verstehe willst du das VermittlerEntfwurfsmuster implementieren.

du meinst sowas hier?
http://sourcemaking.com/design_patterns/mediator/cpp/1

d.h. ich würde hier „_components“ durch meine objekte ersetzen, die über „handleEvent“ was auch immer anfordern können.
welches objekt was zu tun hat, kann man über mehrere parameter von „handleEvent“ auswählen.
der „_mediator“ könnte sich dann drum kümmern, daß am ende alle anforderungen berücksichtigt werden.
damit würde alles innerhalb des „_mediator“-objekts laufen.
richtig?

gruß

michael

hallo peter.

Ich würde eine neues Objekt für set_x() erstellen.
Dies scheint ja der zentrale Punkt zu sein, wo der Verkehr
geregelt werden muss.

da komm ich jetzt nicht ganz mit.
was soll dieses neue objekt machen?

gruß

michael

können wir das nicht einfach als gegeben hinnehmen?

gerade wenn man hilfe braucht sind ein paar Informationen schon nicht schlecht.
Und gerade beim Programmieren sollte man nie was als gegeben hinnehmen und wenn man mal nicht weiterkommt alternative Ansätze probieren. Damit meine ich nicht die Hardwaregegebenheiten, sondern die Art deiner Ansteuerungslogik.

um mal bei den schönen bildlichen beispielen aus den
lehrbüchern zu bleiben:

nicht alles was hinkt ist ein Vergleich :smile:. Dein Beispiel stellt die Situation ein wenig anders dar.

Aber jetzt mal zurück zum ernsten Teil. Wenn du auf jeden Fall nur zwei Member einer Klasse hast, dann kannst du diese doch dem Konstruktor ( oder setter ) der „Steuerklasse“ mitgeben. Dann kannst du Dir diesen Register Kram sparen.
Die Steuerklasse sagt dann deinen beiden K1, was sie wohin schreiben sollen. Dann hast du auch unter Kontrolle, wann sie das tun.

hallo.

nicht alles was hinkt ist ein Vergleich :smile:. Dein Beispiel
stellt die Situation ein wenig anders dar.

ja. das war wohl ein bißchen unglücklich.

Aber jetzt mal zurück zum ernsten Teil. Wenn du auf jeden Fall
nur zwei Member einer Klasse hast, dann kannst du diese doch
dem Konstruktor ( oder setter ) der „Steuerklasse“ mitgeben.

es sind aktuell nur zwei, können aber bis zu fünf sein.

Dann kannst du Dir diesen Register Kram sparen.
Die Steuerklasse sagt dann deinen beiden K1, was sie wohin
schreiben sollen. Dann hast du auch unter Kontrolle, wann sie
das tun.

ich werd’s mal so probieren.

danke & gruß

michael