9.4

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

9.4
Wie ging das mit dem Nebeneffekten vermeiden??
Ich habs einfach nicht geschafft. Hat es was mit clone zu tun? oder Reference, Referenceable?
Ich hab ein Loch in die oracle Seite gebrannt. So lange hab ich drauf geschaut und einfach nichts gefunden:(
Hat es vielleicht was mit inneren Klassen zu tun? Ernsthaft jetzt wie kann ich Daten abspeichern in Stechuhr ohne das
Objekt für alle darauf zeigenden Referenzen zu ändern.

Meine Idee war(falls es überhaupt geht), dass ich innerhalb der Methoden ein neues Objekt erzeuge, in diesen Objekt
dann die Änderungen vornehme und anschließend eine Referenz erstelle die auf diese neue Adresse zeigt und sie
nur mit der aktuellen Referenz stechuhr vertausche und archivuhr unberührt lasse. Aber es hat nicht so geklappt.


Da hast du eigentlich schon viel zu kompliziert gedacht…
Die Idee ist einfach, die verschiedenen Einträge der Stechuhr so zu verketten, dass sich die Stechuhr-Instanz, auf der [m]einbuchen[/m] oder [m]ausbuchen[/m] aufgerufen wird dadurch nicht verändert.

Zurück gibt man dann die neue Instanz, die selbst den neuen Eintrag repräsentiert und mit der bisherigen “Stechuhrkette” verbunden ist.


Ehrlich gesagt leuchtet mir das nicht ein.
Heißt das ich mach eine Liste von Objekten und überprüfe den Namen der aktuellen Referenz um
zu entscheiden welcher Zustand zurückgegeben wird? Dann müsste halt der Name der Referenz eindeutig sein.
Ich stelle mir halt immer 2 “Zeiger” die auf eine Zelle im Speicher zeigen vor.
Somit ist es praktisch unvermeidbar, dass archivuhr.arbeitszeit != stechuhr.arbeitszeit ist.
Meine einzige erklärung ist halt das ich jedesmal ein Objekt in einer neuen Zelle erstelle
und die aktuelle Referenz quasi umpole.


Nein, du kannst ja gar nicht wissen, welcher Variable dein return-Wert irgendwann zugewiesen wird.

Jede Stechuhr kennt immer nur ihre “Vorgänger”, also Vorgänge, die früher schon durchgeführt wurden. Vielleicht wirds mit einem Beispiel analog dem Test klarer: Nachdem sich Mitarbeiter A an- und wieder abgemeldet hat sieht die Stechuhrkette folgendermaßen aus:

[abmelden-A-10:30 Uhr] → [anmelden-A-08:00 Uhr]
^
unsere Variable [m]stechuhr[/m] zeigt hier hin.

Jetz sichern wir die Referenz, die in [m]stechuhr[/m] steht zusätzlich in [m]archivUhr[/m] und machen weiter (wobei [m]stechuhr[/m] wie im Beispielcode jeweils immer den neuesten return-Wert zugewiesen bekommt).

[abmelden-A-17:00 Uhr] → [anmelden-A-12:00 Uhr] → [abmelden-A-10:30 Uhr] → [anmelden-A-08:00 Uhr]
^ ^
[m]stechuhr[/m] zeigt hier hin [m]archivUhr[/m] zeigt immer noch hier hin

Richten wir jetzt Anfragen an [m]archivUhr[/m], so ist nur der “Datenbestand” zu dem Zeitpunkt, zu dem die Referenz gesichert wurde vorhanden. Anfragen an [m]stechuhr[/m] können auch die neuen Einträge berücksichtigen.