2009-11-13 4 views
8

Je n'ai jamais utilisé Smalltalk, mais j'en ai beaucoup lu et cela m'a toujours intrigué. J'ai vu les démos sympas où un programme s'exécute et simplement en modifiant les méthodes des classes utilisées par les objets du programme modifie le comportement du programme en cours d'exécution. Il s'agit clairement de choses puissantes et je comprends comment cela peut fonctionner comme il le fait. Ce que je n'arrive pas à comprendre est ce qui arrive aux instances existantes d'une classe lorsque vous voulez ajouter, supprimer ou renommer des variables d'instance de cette classe.Redéfinir les variables d'instance d'une classe Smalltalk

Je ne peux pas imaginer comment on peut modifier les variables d'instance que toutes les classes utilisent dans un programme en cours d'exécution et attendent toujours les instances existantes de cette classe à fonctionner correctement par la suite. Peut-être que j'ajoute une nouvelle variable d'instance que j'ai besoin d'initialiser et où les méthodes précédemment existantes ont été modifiées pour dépendre de cette variable. Est-ce que je ne pourrais pas finir avec un mauvais fonctionnement horrible de n'importe quel code courant qui a des instances de phase de cette classe? Ou que se passe-t-il si la signification d'une variable d'instance a changé et que je m'attends maintenant à ce qu'un type d'objet différent soit stocké là-bas? Y a-t-il une sorte de mécanisme de "mise à niveau"? Ou est-ce que la pratique habituelle consiste à laisser les instances précédentes s'écraser et brûler? Ou est-ce simplement un cas de "nous ne faisons pas ce genre de choses sur les programmes en cours et nous attendons à ce qu'ils survivent?" La seule approche raisonnablement propre que je peux penser est que lorsque vous modifiez les définitions de variable d'instance peut-être il crée réellement une classe entièrement nouvelle et les anciennes instances, avant le changement, continuent à fonctionner très bien avec l'ancienne définition de classe (qui est maintenant inaccessible par son nom puisque le nom a été redéfini à la nouvelle définition de classe). Peut-être que c'est l'explication la plus logique - mais puisque je n'ai rien trouvé qui explique directement ce processus, j'ai pensé que je demanderais ici et de voir quel genre d'informations amusantes qui m'a eu. :)

Répondre

7

Selon this paper, il est comme vous avez dit:

Il gère automatiquement la redéfinition de la classe, ce qui garantit la cohérence du système en termes de structures d'objet et de la prévention des conflits de nom, en particulier les conflits d'instance nom variable. Quand une définition de classe change, les instances existantes doivent être structurellement modifiées afin de correspondre à la définition de leur nouvelle classe. Au lieu de modifier un objet existant, ClassBuilder en crée un nouveau avec la structure correcte (c'est-à-dire, à partir de la nouvelle classe qui remplace l'ancien). Il remplit alors ce nouvel objet avec les valeurs de l'ancien. Le ClassBuilder utilise la primitive devenue: primitive (cf. 2.1.1) pour procéder aux modifications struturales, en remplaçant les anciens objets par les nouveaux dans tout le système.

+0

Génial! Merci pour ce lien. Je ne sais pas pourquoi mon Googlefu n'était pas assez fort pour trouver cette réponse. J'ai essayé pendant un certain temps avant de poster cette question! J'ai dû manquer un mot clé important. : P – Sean

Questions connexes