입문서 : Aspect 어댑터(Aspect Adaptor)
이것은 웹로그 어플리케이션의 로그파일 이름과 관련되어 있습니다. 파일 이름을 클릭할 때는 리스트 안의 선택이 변경되었다는 것을 의미하며, Hit카운트나 페이지 카운트(양방 입력 필드)의 변경에 따라 표시될 것입니다.
이 개념을 설명하기 위해, 현재 캔버스 위에 있는 위젯의 역할을 변경하겠습니다. 아래와 같이 실행되도록 프로그램을 수정하겠습니다.
- 맨 처음 버튼이 클릭되었을 때, 아래 입력 필드를 변경합니다.
- 두 번째 버튼이 클릭되었을 때, 아래 입력 필드를 변경합니다.
사소한 수정일지도 모르겠습니다만, 중요한 부분이 들어가 있습니다. 다른 버튼이 클릭되었을 경우, 메서드는 다른 클래스의 변수만 변경합니다. "다른" 클래스는 GUI 어플리케이션에 전혀 신경쓰지 않습니다.(완전히 분할) GUI 어플리케이션에 대해 아무것도 모릅니다. 데모를 실행하기 위해서는 약간의 작업이 필요합니다. Aspect 어댑터가 어떻게 동작하는지 예를 들겠습니다.
15. 타이핑 하는 시간을 절약하기 위해서, 이미 작성된 "다른" 클래스를 파일 인 합니다. VisualWorks메인 런처 윈도우에서 File>>File Browser 메뉴를 선택해주십시오.
16. File Browser 다이얼로그가 표시됩니다. 상단 입력 박스에 aa*를 입력하고, 리턴이나 엔터를 눌러주십시오.
VisualWorks는 aa로 시작하는 모든 파일을 검색합니다. 파일 목록창(오른쪽 창 첫 스크롤 영역)에 aa.st 파일이 표시됩니다. 이 파일이 표시되지 않는 경우, aa.st 파일을 VisualWorks "표준 디렉토리"에 복사하거나, 그 파일이 포함된 디렉토리를 이동시켜주십시오. 이 파일은 남은 튜토리얼 파일과 같은 곳에 있을 것입니다.
그래도 찾지 못할 경우에는 여기서 다운로드해주십시오.
17. aa.st 파일을 반전(선택)해서 <오퍼레이트 클릭>후 File In을 선택해주십시오.
18. VisualWorks 메인 런처 윈도우에서 툴바 세 번째 버튼을 클릭하거나, Browser>>시스템 메뉴를 선택해서 System Browser를 열어주십시오.
19. 그 이름에서부터, 카테고리목록의 첫 AA 카테고리가 표시됩니다. 선택해주십시오. AA 클래스를 확인합니다. 그리 많지 않습니다. 클래스에는 다섯 개의 메서드와 두 개의 인스턴스 변수(m1, m2)가 있습니다.
Smalltalk defineClass: #AA
superclass: #{Core.Object}
indexedType: #none
private: false
instanceVariableNames: 'm1 m2'
classInstanceVariableNames: ''
imports: ''
category: 'AA'
20. m1:이나 m2: 메서드중 아무거나 봐주십시오. 메서드의 맨 마지막 행은 매우 중요합니다. 그리고 양쪽의 메서드에 기술되어 있습니다.
m1: anM1
m1 := anM1.
self changed: #m1.
이 메소드의 마지막 행은 앞에서 언급 한 "norifier(알림)"입니다. 기본적으로 변수가 변경된 것을 시스템 전체에 통보합니다. 그렇다고 해서 걱정할것은 없습니다. 이 메소드는 시스템에 통보하는 일 뿐입니다.
21. initialize 메서드를 봐주십시오.
Smalltalk defineClass: #GUI102
superclass: #{UI.ApplicationModel}
indexedType: #none
private: false
instanceVariableNames: 'anAA messageInput messageOutput outputChoice'
classInstanceVariableNames: ''
imports: ''
category: 'UIApplications-New'
클래스가 인스턴스화(작성)되었을 때, m1변수의 내용은 그 유명한 "Hello World"로 설정됩니다. 이 클래스가 이 초기값으로 설정되는 것이 매우 중요한 부분입니다. 일단 지금은 기억해 두십시오.
22. System Browser를 닫고 캔버스로 돌아가주십시오. 캔버스상의 아무곳이나 클릭해서 위젯이 선택되지 않은 것을 확인해주십시오. GUI페인트 툴의 Browser 버튼을 클릭해주십시오.
23. System Browser가 표시되었을 때, 메서드 코드 창에 #GUI102의 defineClass 메서드가 표시됩니다. 인스턴스 변수를 추가합니다. anAA을 입력합니다. 새로운 defineClass 메서드는 아래와 같습니다.
Smalltalk defineClass: #GUI102
superclass: #{UI.ApplicationModel}
indexedType: #none
private: false
instanceVariableNames: 'anAA messageInput messageOutput outputChoice'
classInstanceVariableNames: ''
imports: ''
category: 'UIApplications-New'
24. 메서드 코드 창에서 <오퍼레이트 클릭>후 Accept를 클릭해주십시오.
25. actions 프로토콜을 클릭하고 아래의 메서드를 입력해주십시오.
initialize
anAA := AA new.
messageInput := (AspectAdaptor subject: anAA sendsUpdates: true)
forAspect: #m1.
messageOutput := (AspectAdaptor subject: anAA sendsUpdates: true)
forAspect: #m2.
26. 메서드 코드 창에서 <오퍼레이트 클릭>후 Accept를 클릭해주십시오.
여기서 AspectAdaptor 클래스를 도입합니다. 첫 행은 AA클래스의 인스턴스를 작성합니다. 여기서는 아무것도 하지 않습니다. 다음 2행은 벨류 홀더에서 Aspect 어댑터에 입력 필드를 변환합니다. 이 행들은 노티파이어식의 후반부분입니다. 이 행들은 두 개의 입력 필드가 AA 클래스의 m1과 m2 변수(각각)에 대한 값 변경에 "주의(관심)"을 가지는 시스템에 전달합니다. m1과 m2 변수가 변경되면 항시 messageInput과 messageOutput도 그렇게 됩니다.
27. sayMessage 메서드를 클릭하고 아래 코드를 입력해주십시오.
sayMessage
anAA m1: 'Hi'.
anAA m2: 'This is powerful stuff'.
28. 메서드 코드 창에 <오퍼레이트 클릭>후 Accept를 클릭해주십시오.
29. clearMessages 메서드를 클릭해서 아래와 같이 코드를 입력해주십시오.
clearMessages
anAA m1: 'Goodbye'.
anAA m2: 'All too cool'.
30. 메서드 코드 창에서 <오퍼레이트 클릭>후 Accept를 클릭해주십시오.
31. System Browser를 닫고 GUI페인터 툴로 돌아가주십시오. GUI페인터 툴의 "윈도우 열기"버튼을 클릭해주십시오.
32. 우선 "Hello World"가 입력 필드 첫부분부터 표시되는 것에 주의해주십시오. 떠올리십시오. AA클래스(initialize 메서드)가 실행되었기 때문입니다. 두 개의 버튼을 클릭해주십시오. 이 버튼들은 간접적으로 AA 클래스의 변수 값이 변경됨으로 인해 입력필드의 내용을 변경합니다. 주의가 필요한 중요한 부분은, 다른 무언가(아마도 다른 클래스)가 AA 클래스의 변수 값을 변경했다는 것이며, GUI는 항상 이것들의 변경을 반영시킵니다. 또한, 무엇인지 잘 모를 경우에는 이제부터 많은 GUI 어플리케이션을 작성함에 따라 위와 같은 중요성을 확실히 인식할 수 있게 될 것입니다.
축하드립니다. Aspect 어댑터를 사용해서 입력필드의 값을 취득/설정하는 VisualWorks GUI 어플리케이션 작성에 성공하였습니다. 벨류 홀더와 같이, Aspect 어댑터에도 여기서 설명한 것 이상으로 많은 기능이 있습니다만, 웹로그 어플리케이션에서는 이것만으로도 충분합니다.
|