SmalltalkBestPracticePatterns:8.5

From 흡혈양파의 번역工房
Jump to navigation Jump to search
8.5 통합(Integration)

통합(Integration)

MoneySum이 실제로 Money에 대한 Impostor가 되려면 모든 동일한 메시지들을 지원해야 한다. Moneys와 MoneySums의 모든 조합은 함께 작업해야만 한다. 따라서 이를 구현하기 위해 우리는 Double Dispatch를 사용할 계획이다. Double Dispatch는 다음과 같이 나타낸다: "Argument로 메시지를 전송하시오. 수신자의 클래스명을 선택자 앞에 붙이시오. 수신자를 argument로서 전달하시오." Money 추가는 아래와 같이 된다:

Money>> + aMoney
    ^aMoney addMoney: self


기존 Money>>+는 Money>>addMoney가 된다:

Money>>addMoney: aMoney
    ^currency = aMoney currency
        ifTrue:
            [self species
                amount: amount + aMoney amount
                currency: currency]
        ifFalse:
            [MoneySum monies: (Array
                with: self
                with: aMoney)]


MoneySum 산술은 Double Dispatch 패턴도 따른다:

MoneySum>> + aMoney
    ^aMoney addMoneySum: self


MoneySum이 Money를 추가할 경우, Monies 리스트에 Money가 추가되면서 새로운 MoneySum을 생성해야 한다:

MoneySum>>addMoney: aMoney
    ^self species monies: (monies copyWith: aMoney)


이제 MoneySum을 argument로 하여 Money에 "+"를 전송할 수 있다:

| m1 m2 |
m1 := Money
    amount: 5
    currency: #USD.
m2 := Money
    amount: 7
    currency: #GBP.
m1 + (m2 + m1) 5 USD + 7 GBP + 5 USD


Double Dispatch를 완료하기 위해선 Money와 MoneySum에 addMoneySum:을 구현해야 한다. Money의 구현은 간단하므로 기존 구현부가 작동할 것이란 믿음을 갖고 앞 단계로 되돌아가 addMoney: 를 MoneySum으로 전송하기만 하면 된다:

Money>> addMoneySum: aMoneySum
    ^aMoneySum addMoney: self


위의 코드는 아래와 같이 시험해볼 수 있다:

| m1 m2 |
m1 := Money
    amount: 5
    currency: #USD.
m2 := Money
    amount: 7
    currency: #GBP.
m1 + m2 + m1 7 GBP + 5 USD + 5 USD


최종 조합은 MoneySum을 MoneySum으로 추가하는 것이다. 이는 두 가지 돈을 결합시킴으로써 실행한다:

MoneySum>>addMoneySum: aMoneySum
    ^MoneySum monies: monies , aMoneySum monies


이는 아래와 같이 시험할 수 있다:

| m1 m2 |
m1 := Money
    amount: 5
    currency: #USD.
m2 := Money
    amount: 7
    currency: #GBP.
(m1 + m2) + (m1 + m2) 7 GBP + 5 USD + 7 GBP + 5 USD


Notes