SmalltalkBestPracticePatterns:8.3

From 흡혈양파의 번역工房
Jump to navigation Jump to search
8.3 시작하기

시작하기

첫 번째로 Money에 Simple Superclass Name(간단한 슈퍼클래스명)를 적용한다. 이는 가치를 단일 화폐로 표시한다.

Class: Money
    superclass: Object
    instance variables: amount currency


Role Suggesting Instance Variable Name를 이용한 변수 "amount"는 어떤 오래된 Number도 보유할 것이다. 이는 숫자의 정확성과 안정성 문제를 Number 클래스로 미루도록 해준다. 뛰어나게 정확하지만 속도는 느린 Money를 원할 경우 Amount를 FixedPoint로 만들 수 있다. 정확성은 떨어지지만 빠른 속도를 원할 경우 Double을 사용할 수 있다. 양이 숫자와 같은 메시지에 응답하는 한 Money는 신경 쓰지 않을 것이다.


"currency" 변수는 이제 화폐의 이름, Symbol을 보유할 것이다. 외환 딜러는 세계 화폐에 표준 세 자리 축약어를 사용한다ㅡ예를 들어, 미국 달러에 USD. 완전한 통화체계는 실제 Currency 객체를 필요로 하는데, 서로 다른 통화는 계산적으로 서로 다르게 행위하지만 현재 우리의 관심사는 두 개의 통화가 동일한지 아닌지에 그치기 때문이다.


Money는 어떻게 생성할까? 여기엔 Constructor Method(생성자 메서드)가 필요하다.

Money class>>amount: aNumber currency: aSymbol
    ^self new
        setAmount: aNumber
        currency: aSymbol


메서드는 Type Suggesting Parameter Names(타입을 제안하는 파라미터명)으로 그 파라미터들의 타입에 대한 정보를 전달한다. 메서드 body는 Indented Control Flow(들여쓴 제어 흐름)를 이용해 Constructor Parameter Method(생성자 파라미터 메서드)가 두 개의 argument를 취한다는 사실을 독자에게 분명하게 알린다. Constructor Method(생성자 메서드)는 Interesting Return Value(흥미로운 리턴 값) 또한 항상 갖고 있다.


이제 인스턴스 변수를 Constructor Method에 제공되는 객체들에게 설정할 필요가 있다. Constructor Parameter Method를 작성한다:

Money>>setAmount: aNumber currency: aSymbol
    amount := aNumber.
    currency := aSymbol


코드가 작동하는지 확인하고 싶다면 Debug Print Method(디버그 인쇄 메서드)가 필요할 것이다.

Money>>printOn: aStream
    aStream
        print: amount;
        space;
        nextPutAll: currency


이 메서드는 Cascade를 이용해 3개의 메시지가 동일한 Stream으로 전송되고 있음을 보여준다는 사실에 주목하라.


이제 작업공간에 코드를 시도해볼 수 있다 (이탤릭체는 결과로 인쇄되는 내용이다):

Money
    amount: 5
    currency: #USD 5 USD


Notes