SmalltalkBestPracticePatterns:8.5
Revision as of 10:40, 29 July 2013 by Onionmixer (talk | contribs) (SBPP 8.5 통합(Integration) 페이지 추가)
- 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