SqueakByExample:2.7

From 흡혈양파의 번역工房
Revision as of 03:16, 11 January 2013 by Onionmixer (talk | contribs) (문장 수정)
Jump to navigation Jump to search

프로토콜에 메서드를 구성하기

우리가 좀 더 다양한 메서드를 정의하기 전에, 브라우저의 상단에 있는 세번째 패널을 잠시 보겠습니다. 브라우저의 첫 번째 패널은, 클래스를 카테고리화해서, 두 번째 패널에 있는 매우 긴 클래스 목록에 여러분이 압도당하지 않게 해주며, 동일한 방식으로 세 번째 패널은 네 번째 패널에 있는 매우 긴 메서드 목록에 압도당하지 않게 해줍니다. 이러한 메서드의 카테고리를 "프로토콜" 이라고 부릅니다.


클래스에 단지 몇 개의 메서드만 존재한다면, 프로토콜이 제공하는 계층형 추가 레벨은 정말로 필요하지 않습니다. 이것이 브라우저가 우리가 배울 때 놀라지 않을 --all-- 가상 프로토콜을 제공하는 이유이며, 이 가상의 프로토콜은 선택한 클래스의 모든 메서드를 포함하고 있습니다.


그림 2.10: 모든 카테고리화되지 않은 메서드를 카테고리화 하기


여러분께서 이 예제를 따라 하셨다면, 세 번째 패널은 아직 분류되지 않은 프로토콜을 포함하고 있을 가능성이 높습니다.


Squeak comment.png노랑-버튼 메뉴 아이템을 선택하고 이 아이템을 수정하기 위해 categorize all uncategorized를 클릭한 후, initialization으로 불리는 새로운 프로토콜에 initialize 메서드를 이동하십시오.


어떻게 해야 이것이 올바른 프로토콜인지 스퀵이 알 수 있을까요? 일반적인 경우에 스퀵은 알 방법이 없지만, 이번 경우에는 상위 클래스에 initialize 메서드가 있기때문에, 스퀵은 우리의 initialize 메서드가 재지정하는 카테고리와 동일한 카테고리로 이동하게 됩니다.


여러분은 스퀵이 이미 initialize 메서드를, initialization 프로토콜 안에 집어 넣었다는 것을 발견할 것입니다. 그렇게 되었다면, 여러분이 AutomaticMethodCategorizer라 불리는 패키지를 여러분의 이미지에 로드 하였기 때문입니다.


인쇄상의 관례. 스몰토크 사용자(smalltalkers)는 빈번하게 표기법 ">>"을 메서드가 속한 클래스를 알아내기 위해 사용합니다. 예를 들어, 클래스 SBEGame에 있는 cellsPerSide 메서드는 SBEGame>>cellsPerSide로 부를 것입니다. 이것이 스몰토크 구문이 아님을 나타내기 위해, 우리는 대신 특별한 표기법으로 >> 을 사용할 것이므로, 이 메서드는 SBEGame>>cellsPerSide로서 본문에 나타날 것입니다.


지금부터 이 책에서 여러분에게 메서드를 보여드릴 때, 이 양식으로 메서드의 이름을 작성할 것입니다 물론, 브라우저에 코드를 실제로 타이핑 할 때, 클래스 이름 또는 >> 기호를 입력할 필요가 없으며, 단지 클래스 패널에 적당한 클래스를 선택했는지 확인하면 됩니다.


자 이제, SBEGame>>initialize 메서드에 의해 사용되는 다른 두 개의 메서드를 정의하겠습니다. 둘 모두는 initialization 프로토콜 안으로 이동할 수 있습니다.


메서드 2.5 상수 메서드

SBEGame»cellsPerSide
  "The number of cells along each side of the game"
   10


이 메서드는 더 단순해 질 수 없습니다: 이 메서드는 상수 10을 답으로 제시합니다. 메서드로서 상수를 나타내는 장점은, 프로그램이 발전해서 상수가 몇 가지 다른 특성에 의존하는 경우 메서드는 이 값 10을 계산하기 위해 변경될 수 있습니다.


메서드 2.6 initialization helper(초기화 헬퍼) 메서드

SBEGame»newCellAt: i at: j
  "Create a cell for position (i,j) and add it to my on—screen
  representation at the appropriate screen position. Answer the new cell"
  | c origin |
  c := SBECell new.
  origin := self innerBounds origin.
  self addMorph: c.
  c position: ((i -- 1) * c width) @ ((j -- 1) * c height) + origin.
  c mouseAction: [self toggleNeighboursOfCellAt: i at: j].
  Add the methods SBEGame»cellsPerSide and SBEGame»newCellAt:at:.
  Confirm the spelling of the new selectors toggleNeighboursOfCellAt:at: and
  mouseAction:.


Squeak comment.png메서드 SBEGame»cellsPerSideSBEGame»newCellAt:at:를 추가하십시오.


새로운 선택자(selectors) toggleNeighboursOfCellAt:at:mouseAction: 의 스펠링을 확인합니다.


메서드 2.6은 셀의 배열중 특정위치(i,j)에 특별히 지정된 새로운 SBECell로 응답합니다. 마지막 라인은 블록 [self toggleNeighboursOfCellAt: i at: j ] 이 되도록 새로운 셀의 mouseAction을 정의합니다. 실제로, 이 정의는 마우스가 클릭될 때 실행할 콜백 동작을 정의합니다. 이에 대응하는 메서드 또한 정의할 필요가 있습니다.


메서드 2.7: 콜백 메서드

SBEGame»toggleNeighboursOfCellAt: i at: j
  (i > 1) ifTrue: [ (cells at: i -- 1 at: j ) toggleState].
  (i < self cellsPerSide) ifTrue: [ (cells at: i + 1 at: j) toggleState].
  (j > 1) ifTrue: [ (cells at: i at: j -- 1) toggleState].
  (j < self cellsPerSide) ifTrue: [ (cells at: i at: j + 1) toggleState].


메서드 2.7은 셀(i,j)의 사방에 4 개 셀의 상태를 토글합니다. 유일한 문제는 보드가 유한하므로, 우리가 셀의 상태를 토글 하기 전에, 이웃한 셀이 존재하도록 철저히 대비를 해두어야 한다는 것입니다.


Squeak comment.pnggame logic이라 불리는 새로운 프로토콜에 이 메서드를 배치하십시오.


메서드를 이동하려면, 단순히 그 메서드의 이름을 클릭하고 새롭게 만든 프로토콜(그림 2.11)로 드래그합니다.


그림 2.11 메서드를 프로토콜에 드래그하기


Quinto 게임을 완성하려면, 마우스 이벤트를 다루기 위해 클래스 SBEcell에서 두 개 이상의 메서드를 정의할 필요가 있습니다.


메서드 2.8: 전형적인 setter 메서드

SBECell»mouseAction: aBlock
   mouseAction := aBlock

메서드 2.8은 인수에 셀의 mouseAction 변수를 설정하고 새로운 값을 답하는 것 이외에 다른 어떤 역할도 하지 않습니다. 이러한 방식으로 인스턴스 변수의 값을 바꾸는 모든 메서드는 setter 메서드라 부르며, 인스턴스 변수의 현재 값을 답하는 메서드는 getter 메서드라 부릅니다.


여러분이 다른 프로그래밍 언어로 getters와 setters를 사용하셨다면, setmouseAction과 getmouseAction으로 이 메서드를 지칭하였을 것입니다. 스몰토크 관례는 다릅니다. getter는 변수가 갖는 이름과 같은 동일한 이름으로 지어져야 하며, setter는 유사한 이름으로 만들어지지만, 마지막에 ":"를 갖고 있으므로, mouseAction과 'mouseAction:' 메서드는 getter 메서드라 불리는 인스턴스 변수의 현재 값으로 대답합니다.


정리해보자면, setters와 getters는 접근자 메서드라고 불리며, 관례적으로, accessing 프로토콜 안에 배치되어야 합니다. 스몰토크에서, 모든 인스턴스 변수는 해당 변수를 가진 오브젝트 전용이며, 스몰토크 언어에서 이러한 변수를 읽거나 작성하기 위한 다른 오브젝트는 이 인스턴스 변수와 같은 접근자가 유일한 메서드[1]입니다.


Squeak comment.png클래스 SBECell로 가서, Cell>>mouseAction을 정의하고 그것을 accessing프로토콜에 넣으십시오.


마지막으로 우리는 메서드 mouseUp:을 정의할 필요가 있으며, 이 메서드는 화면에서 셀 위에 마우스가 머무는 동안 마우스 버튼이 릴리스되면, GUI 프레임워크에 의해 자동으로 호출되게 될 것입니다.


메서드 2.9 이벤트 핸들러 (An event handler)

SBECell»mouseUp: anEvent
mouseAction value


Squeak comment.png메서드 SBECell>>mouseUp: 추가하고, 모든 카테고리화 되지 않은 메서드의 카테고리를 만드십시오.


이 메서드가 하는 작업은 인스턴스 변수 mouseAction에 저장되어 있는 오브젝트에 메시지 값을 보내는 것입니다. 우리가, 뒤이은 코드부분을 mouseAction에 할당했던, SBEGame»newCellAt: i at:에서 그 메서드를 다시 불러냅니다:

[self toggleNeighboursOfCellAt: i at: j ]

Value 메시지를 보내는 작업은 이 코드 조각을 실행하고, 결론적으로 셀의 상태의 토글하도록 만듭니다.

Notes

  1. 사실 인스턴스 변수는 서브클래스 안에서도 접근할 수 있습니다.