Instanzvariablen einer Smalltalk-Klasse neu definieren

8

Ich habe Smalltalk noch nie benutzt, aber ich habe viel darüber gelesen und es hat mich immer fasziniert. Ich habe die coolen Demos gesehen, auf denen ein Programm läuft, und indem ich einfach die Methoden der Klassen ändere, die die Objekte des Programms benutzen, ändert sich das Verhalten des laufenden Programms. Es ist eindeutig kraftvolles Zeug und ich verstehe, wie das funktionieren kann. Was ich nicht sicher feststellen kann, ist, was mit den vorhandenen Instanzen einer Klasse geschieht, wenn Sie Instanzvariablen dieser Klasse hinzufügen, entfernen oder umbenennen wollen.

Ich kann mir nicht vorstellen, wie man die Instanzvariablen, die alle Klassen in einem laufenden Programm verwenden, verändern kann und trotzdem erwartet, dass die vorhandenen Instanzen dieser Klasse später korrekt funktionieren. Vielleicht füge ich eine neue Instanzvariable hinzu, die ich initialisiert haben muss, und wo zuvor vorhandene Methoden geändert wurden, um von dieser Variablen abhängig zu sein. Könnte es nicht zu einer schrecklichen Fehlfunktion von laufendem Code mit Live-Instanzen dieser Klasse kommen? Oder was ist, wenn sich die Bedeutung einer Instanzvariable geändert hat und ich nun erwarte, dass dort ein anderes Objekt gespeichert wird als zuvor? Gibt es eine Art "Upgrade" -Mechanismus? Oder ist es üblich, die vorherigen Instanzen einfach abstürzen zu lassen und zu brennen? Oder ist das einfach ein Fall von "wir machen so etwas nicht mit laufenden Programmen und erwarten, dass sie überleben?"

Der einzig vernünftige Ansatz, den ich mir vorstellen kann, ist, dass wenn Sie die Definitionen der Instanzvariablen ändern, vielleicht eine völlig neue Klasse erstellt wird und die alten Instanzen vor der Änderung weiterhin gut mit der alten Klassendefinition funktionieren ( welches nun nicht mehr namentlich zugänglich ist, da der Name in der neuen Klassendefinition neu definiert wurde). Vielleicht ist das die logischste Erklärung - aber da ich nichts gefunden habe, was diesen Prozess direkt erklärt, dachte ich mir, ich würde hier nachfragen und herausfinden, welche Art von spaßigen Informationen ich bekommen habe. :)

    
Sean 13.11.2009, 06:07
quelle

1 Antwort

7

Laut diesem Papier ist es wie bei Ihnen sagte:

  

Es verwaltet auch automatisch die Klassenredefinition, garantiert die Systemkonsistenz in Bezug auf Objektstrukturen und verhindert Namenskonflikte, insbesondere Namenskonflikte von Instanzvariablen. Wenn sich eine Klassendefinition ändert, müssen vorhandene Instanzen strukturell geändert werden, um der Definition ihrer neuen Klasse zu entsprechen. Anstatt ein vorhandenes Objekt zu ändern, erstellt der ClassBuilder einen neuen mit der korrekten Struktur (d. H. Aus der neuen Klasse, die die alte ersetzt). Es füllt dann dieses neue Objekt mit den Werten des alten. Der ClassBuilder verwendet das primitive: (siehe 2.1.1), um mit den grundlegenden Änderungen fortzufahren, indem die alten Objekte durch die neuen Objekte im gesamten System ersetzt werden.

    
Suppressingfire 13.11.2009, 06:13
quelle

Tags und Links