2014-12-26 3 views
3

클래스 사이드 초기화 메시지가 스몰 토크 (Pharo and Squeak)에서 전송되는시기가 궁금합니다. 지정된 순서가 있습니까? 적어도 다른 클래스가 이미로드되고 컴파일 된 것으로 가정하는 것이 안전합니까? 아니면 시스템을 열심히 초기화합니다 (다른 클래스의로드 및 컴파일을 완료하기 전에 초기화를 보냅니다). 당신이로드 및 컴파일에 대한 질문으로클래스 측 초기화가 전송되는시기는 언제입니까?

답변

3

, 나는 모든 코드가 (1)를 설치 한 후

패키지 또는 변경 집합을로드 클래스 측 #initialize 방법이라고 ... 코드를로드 할 때 의미 있으리라 믿고있어. 특정 주문을 믿을 수는 없지만 해당 패키지의 모든 클래스와 메소드가로드되었다고 가정 할 수 있습니다.

Bert는로드하지 않고 을 구현하는 경우 클래스 측 # 초기화를 구현하면 메시지를 직접 보내야합니다.

+0

나는 이것이 일반적인 경우라고 확신하지 않습니다. 예를 들어, Monticello는 포스트로드'# initialize'를 명시 적으로 수행하는데, 이는 "내부"로딩 로직에 의해 처리되지 않는다는 것을 의미합니다. 코드를 어떻게 로딩 하느냐에 따라'# initialize'가 보내지지 않을 수도 있습니다. (대부분의 사람들에게는 그렇지 않을 수도 있습니다.) –

4

클래스 측 initialize은 절대로 시스템에서 보내지 않습니다. 개발 중에는 수동으로 처리합니다 (많은 메소드에 "self initialize" 주석이있는 이유는 무엇입니까?)

변경 집합으로 코드를 내보낼 때 내보내기는 initialize의 송신을 맨 마지막에 넣으므로 실행됩니다. 클래스가 다른 시스템에로드되었습니다.

이 동작은 Monticello에 의해 모방됩니다. 처음 클래스를로드하거나 initialize 메서드의 코드가 변경되면 실행됩니다. 이는 개념적으로 MC가 이미 이미지에있는 것의 차이와로드 할 패키지의 차이를 포함하는 즉석에서의 변경 집합입니다. diff에 클래스 측 initialize 메서드가 포함되어 있으면 해당 패키지를로드 할 때 실행됩니다 나이 버전.

1

확실히 알 수있는 한 가지 방법은 직접 테스트하는 것입니다. 스몰 토크 시스템은 이런 종류의 것을 다른 많은 시스템보다 좀 더 친근하게 만듭니다. 그냥 자신의 MyTestClass 정의하고 그것을 발사 할 때 자신을 발견 할 수 있도록 다음 자신의 클래스 측 (즉, 중요) initialize 메시지를 구현, 그것은 화재 빈도 등

initialize 
    Transcript show: 'i have been INITIALIZED!!! Muwahahahah!!!' 

그것을 확인 Workspace에서

MyTestClass initialize 

Transcript를 열고 실행하여 작동합니다. 이제 Monticello를 로딩하거나, 언제, 무엇을, 언제 실행하는지보고 할 수 있습니다.