2009-11-13 1 views
8

스몰 토크는 한번도 사용하지 않았지만 많은 것을 읽었으며 항상 흥미로 웠습니다. 프로그램이 실행되고있는 곳에서 멋진 데모를 보았고 단순히 프로그램의 객체가 사용하는 클래스의 메서드를 변경하여 실행중인 프로그램의 동작을 변경했습니다. 그것은 분명히 강력한 것들이며 그것이 어떻게 작동하는지 이해합니다. 특정 클래스의 인스턴스 변수를 추가, 제거 또는 이름을 바꿀 때 클래스의 기존 인스턴스에 어떤 일이 발생하는지 확실하게 파악할 수 없습니다.스몰 토크 클래스의 인스턴스 변수 재정의

실행중인 프로그램에서 모든 클래스가 사용하고있는 인스턴스 변수를 변경하는 방법을 상상할 수는 없지만 나중에 해당 클래스의 기존 인스턴스가 올바르게 작동 할 것으로 기대합니다. 아마도 내가 초기화해야 할 새로운 인스턴스 변수를 추가하고, 기존의 메소드가이 변수에 의존하도록 변경되었을 수도 있습니다. 그 클래스의 실제 인스턴스가있는 실행 코드의 끔찍한 오작동으로 끝날 수 없습니까? 또는 인스턴스 변수의 의미가 변경된 경우 이전에 비해 다른 종류의 객체가 거기에 저장 될 것으로 예상됩니까? 어떤 종류의 "업그레이드"메커니즘이 있습니까? 아니면 이전 인스턴스가 충돌하고 화상을 입게하는 일반적인 방법입니까? 아니면 간단히 말해서 "우리는 프로그램을 운영하는 데 그런 종류의 일을하지 않고 그들이 살아남을 것이라고 기대합니까?"

내가 생각할 수있는 유일한 합리적인 접근법은 인스턴스 변수 정의를 변경할 때 실제로 완전히 새로운 클래스를 만들고 변경 전의 이전 인스턴스를 이전 클래스 정의로 계속해서 잘 작동시키는 것입니다 (이름이 새 클래스 정의로 다시 정의되었으므로 이름으로 액세스 할 수 없습니다). 아마도 이것이 가장 논리적 인 설명 일 것입니다. 그러나이 과정을 직접 설명하는 것을 발견하지 못했기 때문에 나는 여기에 묻고 어떤 종류의 재미있는 정보가 있는지 알아 냈습니다. : 당신이 말한 것처럼

답변

7

this paper에 따르면,이 :

또한 자동으로 객체 구조의 측면에서 시스템의 일관성을 보장하고 이름이 충돌, 특히 예 변수 이름 충돌을 방지 수준의 재정을 관리합니다. 클래스 정의가 변경되면 기존 인스턴스가 새로운 클래스의 정의와 일치하도록 구조적으로 수정되어야합니다. ClassBuilder는 기존 객체를 수정하는 대신 올바른 구조 (예 : 이전 클래스를 대체하는 새 클래스)로 새 객체를 만듭니다. 그런 다음이 새 객체를 이전 객체의 값으로 채 웁니다. ClassBuilder는 전체 : 시스템 전체에서 오래된 객체를 새로운 것으로 대체하여 구조 변경을 진행하기 위해 become : primitive (2.1.1 참조)를 사용합니다.

+0

굉장! 그 링크를 가져 주셔서 감사합니다. 나는 왜 내 Googlefu가이 대답을 찾을 정도로 강하지는 않은지 모르겠다. 나는이 질문을 게시하기 전에 꽤 잠시 동안 노력했다! 나는 중요한 키워드가 빠졌음에 틀림 없다. :피 – Sean