8

私は Smalltalk を使ったことはありませんが、Smalltalk についてはよく読んでおり、常に興味をそそられてきました。プログラムが実行されていて、プログラムのオブジェクトが使用しているクラスのメソッドを変更するだけで、実行中のプログラムの動作が変わるクールなデモを見てきました。それは明らかに強力なものであり、それがどのように機能するかを理解しています. クラスのインスタンス変数を追加、削除、または名前変更するときに、そのクラスの既存のインスタンスがどうなるかは、はっきりとはわかりません。

実行中のプログラムですべてのクラスが使用しているインスタンス変数を変更し、そのクラスの既存のインスタンスが後で正しく機能することを期待する方法を想像できません。おそらく、初期化する必要があり、この変数に依存するように以前の既存のメソッドが変更された新しいインスタンス変数を追加しています。そのクラスのライブインスタンスを持つ実行中のコードの恐ろしい誤動作に終わることはありませんか? または、インスタンス変数の意味が変更され、以前とは異なる種類のオブジェクトがそこに格納されることを期待している場合はどうなるでしょうか? ある種の「アップグレード」メカニズムはありますか? それとも、以前のインスタンスをクラッシュさせて燃やすだけにするのが通常のやり方ですか? それとも、これは単に「私たちがしない」というケースですか

私が考えることができる唯一の合理的にクリーンなアプローチは、インスタンス変数の定義を変更すると、おそらく実際にはまったく新しいクラスが作成され、変更前の古いインスタンスは古いクラス定義で問題なく機能し続けるということです(現在は名前が新しいクラス定義に再定義されたため、名前でアクセスできません)。おそらくそれが最も論理的な説明ですが、このプロセスを直接説明するものは何も見つからなかったので、ここで質問して、どのような楽しい情報が得られたかを確認することにしました. :)

4

1 に答える 1

8

この論文によると、あなたが言ったようです:

また、クラスの再定義を自動的に管理し、オブジェクト構造に関してシステムの一貫性を保証し、名前の競合、特にインスタンス変数名の競合を防ぎます。クラス定義が変更されると、新しいクラスの定義と一致するように、既存のインスタンスを構造的に変更する必要があります。ClassBuilder は、既存のオブジェクトを変更する代わりに、正しい構造を持つ新しいオブジェクトを作成します (つまり、古いオブジェクトを置き換える新しいクラスから)。次に、この新しいオブジェクトに古いオブジェクトの値を入力します。ClassBuilder は、become: プリミティブ (2.1.1 を参照) を使用して、システム全体で古いオブジェクトを新しいオブジェクトに置き換えることにより、構造の変更を進めます。

于 2009-11-13T06:13:11.293 に答える