<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://trans.onionmixer.net/wiki/index.php?action=history&amp;feed=atom&amp;title=SmalltalkBestPracticePatterns%3A8.4</id>
	<title>SmalltalkBestPracticePatterns:8.4 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://trans.onionmixer.net/wiki/index.php?action=history&amp;feed=atom&amp;title=SmalltalkBestPracticePatterns%3A8.4"/>
	<link rel="alternate" type="text/html" href="https://trans.onionmixer.net/wiki/index.php?title=SmalltalkBestPracticePatterns:8.4&amp;action=history"/>
	<updated>2026-05-02T09:43:04Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://trans.onionmixer.net/wiki/index.php?title=SmalltalkBestPracticePatterns:8.4&amp;diff=3564&amp;oldid=prev</id>
		<title>Onionmixer: SBPP 8.4 Arithmetic (산술) 페이지 추가</title>
		<link rel="alternate" type="text/html" href="https://trans.onionmixer.net/wiki/index.php?title=SmalltalkBestPracticePatterns:8.4&amp;diff=3564&amp;oldid=prev"/>
		<updated>2013-07-29T10:32:50Z</updated>

		<summary type="html">&lt;p&gt;SBPP 8.4 Arithmetic (산술) 페이지 추가&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;;8.4 Arithmetic (산술)&lt;br /&gt;
&lt;br /&gt;
==Arithmetic (산술)==&lt;br /&gt;
&lt;br /&gt;
두 개의 Money를 어떻게 합칠까? 간단한 case, 즉 두 개의 Money에 동일한 통화를 가지는 경우를 먼저 올바르게 만들어보자. 동일한 통화로 된 두 개의 Money를 추가할 때는 결과적 Money는 첫 번째 두 개를 합한 금액만큼 가져야 한다. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
Money&amp;gt;&amp;gt;+ aMoney&lt;br /&gt;
    ^self species&lt;br /&gt;
        amount: amount + aMoney amount&lt;br /&gt;
        currency: currency&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이것이 작동하려면 &amp;quot;amount&amp;quot; 변수에 Getting Method가 필요하다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
Money&amp;gt;&amp;gt;amount&lt;br /&gt;
    ^amount&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
달러에 달러를 추가하고 있다면 올바른 해답을 얻는다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
| m1 m2 |&lt;br /&gt;
m1 := Money&lt;br /&gt;
    amount: 5&lt;br /&gt;
    currency: #USD.&lt;br /&gt;
m2 := Money&lt;br /&gt;
    amount: 7&lt;br /&gt;
    currency: #USD.&lt;br /&gt;
m1 + m2 12 USD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Moneys를 다른 통화로 변경할 경우 틀린 해답을 얻는다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
| m1 m2 |&lt;br /&gt;
m1 := Money&lt;br /&gt;
    amount: 5&lt;br /&gt;
    currency: #USD.&lt;br /&gt;
m2 := Money&lt;br /&gt;
    amount: 7&lt;br /&gt;
    currency: #GBP.&lt;br /&gt;
m1 + m2 12 USD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
5 달러와 7 파운드를 합하면 12 달러가 아니다. 산술에 간단한 &amp;quot;+&amp;quot; 프로토콜을 유지하면서 다수의 통화를 가진 case를 처리할 수 있는 방법으로 무엇이 있을까? 해답은 Money에 대해 Imposter를 (모델링 패턴) 도입하여 환율 변환을 따르는 것이다. 그것으로 MoneySum라는 Simple Superclass Name(간단한 슈퍼클래스명)을 제공한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
Class: MoneySum&lt;br /&gt;
    superclass: Object&lt;br /&gt;
    instance variables: monies&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Role Suggesting Instance Variable Name(역할을 제안하는 인스턴스 변수) &amp;quot;monies&amp;quot;를 이용한 변수는 Moneys의 Collection을 보유할 것이다. &lt;br /&gt;
Constructor Method(생성자 메서드)를 이용해 MoneySum을 생성한다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
MoneySum class&amp;gt;&amp;gt;monies: aCollection&lt;br /&gt;
    ^self new setMonies: aCollection&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
컬렉션은 Constructor Parameter Method(생성자 파라미터 메서드)로 옮겨간다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
MoneySum&amp;gt;&amp;gt;setMonies: aCollection&lt;br /&gt;
    monies := aCollection&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Debug Print Method(디버그 인쇄 메서드)를 MoneySum으로 추가하면 결과를 확인할 수 있다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
MoneySum&amp;gt;&amp;gt;printOn: aStream&lt;br /&gt;
    monies do:&lt;br /&gt;
        [:each |&lt;br /&gt;
        aStream&lt;br /&gt;
            print: each;&lt;br /&gt;
            nextPutAll: &amp;#039; + &amp;#039;].&lt;br /&gt;
    aStream skip: -3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 메서드에서는 꽤 많은 패턴들이 사용되었다: Direct Variable Access(직접 변수 접근), Role Suggesting Parameter Name(역할을 제안하는 파라미터명), Simple Enumeration Parameter(간단한 열거 파라미터), Rectangular Block(직사각형 블록), Indented Control Flow(들여쓴 제어 흐름), Do.&lt;br /&gt;
MoneySum을 사용할 수 있다면 두 개의 통화가 일치하지 않을 시 MoneySum을 리턴하도록 Money&amp;gt;&amp;gt;+를 수정할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
Money&amp;gt;&amp;gt;+ aMoney&lt;br /&gt;
    ^currency = aMoney currency&lt;br /&gt;
        ifTrue:&lt;br /&gt;
            [self species&lt;br /&gt;
                amount: amount + aMoney amount&lt;br /&gt;
                currency: currency]&lt;br /&gt;
        ifFalse:&lt;br /&gt;
            [MoneySum monies: (Array&lt;br /&gt;
                with: self&lt;br /&gt;
                with: aMoney)]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Money의 통화에 Getting Method가 필요하다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
Money&amp;gt;&amp;gt;currency&lt;br /&gt;
    ^currency&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 우리의 복수통화 예제가 작동한다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
| m1 m2 |&lt;br /&gt;
m1 := Money&lt;br /&gt;
    amount: 5&lt;br /&gt;
    currency: #USD.&lt;br /&gt;
m2 := Money&lt;br /&gt;
    amount: 7&lt;br /&gt;
    currency: #GBP.&lt;br /&gt;
m1 + m2 5 USD + 7 GBP&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
확인차 단일통화 예제를 시도해보니 작동한다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
| m1 m2 |&lt;br /&gt;
m1 := Money&lt;br /&gt;
    amount: 5&lt;br /&gt;
    currency: #USD.&lt;br /&gt;
m2 := Money&lt;br /&gt;
    amount: 7&lt;br /&gt;
    currency: #USD.&lt;br /&gt;
m1 + m2 12 USD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:SmalltalkBestPracticePatterns]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
	</entry>
</feed>