<?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%3A7.10</id>
	<title>SmalltalkBestPracticePatterns:7.10 - 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%3A7.10"/>
	<link rel="alternate" type="text/html" href="https://trans.onionmixer.net/wiki/index.php?title=SmalltalkBestPracticePatterns:7.10&amp;action=history"/>
	<updated>2026-05-02T00:17:02Z</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:7.10&amp;diff=3559&amp;oldid=prev</id>
		<title>Onionmixer: SBPP 7.10 Yourself 페이지 추가</title>
		<link rel="alternate" type="text/html" href="https://trans.onionmixer.net/wiki/index.php?title=SmalltalkBestPracticePatterns:7.10&amp;diff=3559&amp;oldid=prev"/>
		<updated>2013-07-29T10:06:17Z</updated>

		<summary type="html">&lt;p&gt;SBPP 7.10 Yourself 페이지 추가&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;;7.10 Yourself&lt;br /&gt;
&lt;br /&gt;
==Yourself==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Cascade(p.183)의 값을 사용할 필요가 있다.&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* 마지막 메시지가 메시지의 수신자를 리턴하지 않을 경우 어떻게 Cascade의 값을 사용하는가?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
아마도 스몰토크에서 최고로 혼동을 주는 메서드가 아닐까 싶다. Object를 보면 모든 신규 스몰토커가 우연히 발견하는 내용이 있다:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
Object&amp;gt;&amp;gt;yourself&lt;br /&gt;
    ^self&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
혹 프로그래머가 매우 현명하다면 (그리고 Interesting Return Value를 모르고 있다면):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
Object&amp;gt;&amp;gt;yourself&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
무슨 일이 일어나고 있는가?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다수의 요소를 OrdredCollection으로 추가하길 원한다고 가정하자. Collection&amp;gt;&amp;gt;add: anObject는 메시지의 수신자가 아니라 anObject를 리턴하도록 정의되어 있다. Collection을 변수로 할당하길 원한다면:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
all := OrderedCollection new&lt;br /&gt;
    add: 5;&lt;br /&gt;
    add: 7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 코드는 모든 값이 7이 되는 결과를 야기할 것이다. 이 문제에 두 가지 해결방법이 있다. 첫 번째는 변수 할당을 괄호에 넣는 것이다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
(all := OrderedCollection new)&lt;br /&gt;
    add: 5;&lt;br /&gt;
    add: 7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Cascade의 값이 필요한데 마지막 메시지가 수신자를 리턴하지 않는 경우, &amp;quot;yourself&amp;quot; 메시지를 Cascade 앞에 덧붙여라. &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;
all := OrderedCollection new&lt;br /&gt;
    add: 5;&lt;br /&gt;
    add: 7;&lt;br /&gt;
    yourself&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;yourself&amp;quot;를 전송하면 수신자, OrderedCollection의 새 인스턴스를 리턴한다. 변수로 할당되는 것은 바로 이 객체이다. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
어떤 사람들은 &amp;quot;yourself&amp;quot;에 방어적인 자세를 취하여 그들이 작성하는 모든 Cascade마다 덧붙이곤 한다. 제발 그러지 말길 바란다. &amp;quot;yourself&amp;quot;는 당신이 메시지를 전송한 결과가 아니라 사용된 수신자의 값을 원하고 있음을 독자에게 전달하기 위해 존재한다. Cascade의 값을 사용하고 있지 않다면 &amp;quot;yourself&amp;quot;를 사용하지 말라. 예를 들어, Cascade의 값을 변수로 할당하거나 메서드의 값으로서 리턴하길 원하지 않는다면 &amp;quot;yourself&amp;quot;를 Point&amp;gt;&amp;gt;printOn:에서 사용하지 않을 것이다. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
Point&amp;gt;&amp;gt;printOn: aStream&lt;br /&gt;
    aStream&lt;br /&gt;
        print: self x;&lt;br /&gt;
        nextPut: $@;&lt;br /&gt;
        print: self y&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이를 작성하고 나니 괄호에 넣은 형태보다 Cascades를 선호하는 이유를 정확히 모르겠다. 아마도 괄호로 메서드를 파싱하는 것과 괄호 없이 파싱하는 것 사이에는 심리적인 차이가 크기 때문일지도 모른다. 괄호의 사용을 피했을 때 명확하게 읽히는 메서드가 있다면 그 방법을 택할 것이다. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;yourself&amp;quot;는 #inject:into:와 함께 사용되기도 한다. 부모의 컬렉션에 대한 모든 자녀들을 Set에 집어넣길 바란다고 가정하면, 아래와 같이 작성하고 싶을 것이다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
parents&lt;br /&gt;
    inject: Set new&lt;br /&gt;
    into: [:sum :each | sum addAll: each children]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
하지만 #addAll:을 전송한 결과가 수신자가 아니라 argument이기 때문에 (이번 사례에서는 자녀들을 의미) 위의 코드는 작동하지 않을 것이다. 예상대로 작동시키기 위해선 아래와 같이 작성해야 한다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
parents&lt;br /&gt;
    inject: Set new&lt;br /&gt;
    into: [:sum :each | sum addAll: each children; yourself]&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>