2009-11-13 19 views
8

Non ho mai usato Smalltalk, ma ne ho letto molto e mi ha sempre intrigato. Ho visto le demo interessanti su cui è in esecuzione un programma e semplicemente modificando i metodi delle classi utilizzate dagli oggetti del programma altera il comportamento del programma in esecuzione. È roba chiaramente potente e capisco come possa funzionare così. Quello che non riesco a definire con certezza è cosa succede alle istanze esistenti di una classe quando si desidera aggiungere, rimuovere o rinominare le variabili di istanza di quella classe.Ridefinizione delle variabili di istanza di una classe Smalltalk

Non riesco a immaginare come sia possibile modificare le variabili di istanza che tutte le classi utilizzano in un programma in esecuzione e si aspettano ancora che le istanze esistenti di quella classe funzionino correttamente in seguito. Forse sto aggiungendo una nuova variabile di istanza che ho bisogno di inizializzare e dove i metodi precedentemente esistenti sono stati modificati per dipendere da questa variabile. Non potrei finire con un orribile malfunzionamento di qualsiasi codice in esecuzione che ha istanze live di quella classe? O cosa succede se il significato di una variabile di istanza è cambiato e ora mi aspetto che un tipo diverso di oggetto sia memorizzato lì rispetto a prima? Esiste una sorta di meccanismo di "upgrade"? O è la solita pratica semplicemente lasciare che le istanze precedenti si blocchino e brucino? O è semplicemente un caso di "non facciamo quel genere di cose sui programmi in esecuzione e aspettiamo che sopravvivano?"

L'unico approccio ragionevolmente pulito che riesco a pensare è che quando si modificano le definizioni delle variabili di istanza si crea effettivamente una classe completamente nuova e le vecchie istanze, prima della modifica, continuano a funzionare correttamente con la definizione della vecchia classe (che ora è inaccessibile per nome poiché il nome è stato ridefinito nella nuova definizione di classe). Forse questa è la spiegazione più logica - ma dal momento che non ho trovato nulla che spieghi direttamente questo processo, ho pensato di chiedere qui e vedere che tipo di informazioni divertenti mi hanno preso. :)

risposta

7

Secondo this paper, è come se detto:

Inoltre gestisce automaticamente classe ridefinizione, garantendo la coerenza del sistema in termini di strutture degli oggetti e prevenire conflitti di nomi, specialmente nome della variabile istanza conflitti. Quando una definizione di classe cambia, le istanze esistenti devono essere modificate strutturalmente per corrispondere alla definizione della loro nuova classe. Invece di modificare un oggetto esistente, ClassBuilder ne crea uno nuovo con la struttura corretta (ad esempio, dalla nuova classe che sostituisce quella precedente). Quindi riempie questo nuovo oggetto con i valori di quello vecchio. Il ClassBuilder usa il diventare: primitivo (cfr. 2.1.1) per procedere con le modifiche struttural, sostituendo i vecchi oggetti con quelli nuovi nell'intero sistema.

+0

Impressionante! Grazie per questo link. Non so perché il mio Googlefu non fosse abbastanza forte da trovare questa risposta. Ho provato per un bel po 'prima di pubblicare questa domanda! Dovevo mancare una parola chiave importante. : P – Sean

Problemi correlati