<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>빛을 담고 세상 넓히기 &#187; JMock</title>
	<atom:link href="http://fantazic.com/archives/tag/jmock/feed" rel="self" type="application/rss+xml" />
	<link>http://fantazic.com</link>
	<description>마음의 빛으로 넓은 세상을 비추고 싶다.</description>
	<lastBuildDate>Sun, 27 Nov 2011 23:52:11 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Embedded Domain-Specific Language</title>
		<link>http://fantazic.com/archives/75</link>
		<comments>http://fantazic.com/archives/75#comments</comments>
		<pubDate>Tue, 09 Jan 2007 03:08:00 +0000</pubDate>
		<dc:creator>따지크</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[DSL]]></category>
		<category><![CDATA[JMock]]></category>

		<guid isPermaLink="false">http://fantazic.com/archives/75</guid>
		<description><![CDATA[
Tweet

OOPSLA 발표장 옆에는 논문들을 전시해 놓고, 작성자와 토론할 수 있는 공간이 있었다. 그중에 &#8220;Embedded Domain-Specific Language&#8220;에 관한 논문이 있었는데, 그 당시 DDD에 대해서도 몰랐었고 왠지 특정 영역에서만 사용하는 언어가 뭐가 중요하지라는 생각에 그냥 지나쳤다. (더군다나 Embedded 라는 단어도 거부감이 느껴졌다.)
하지만 최근 Ruby를 공부하면서 Domain-Specific Language에 많은 관심이 생겼고, Java에서 DSL을 어떻게 사용할 수 있을까 고민하면서 [...]]]></description>
			<content:encoded><![CDATA[<div style="display:block;margin-left: 10px; margin-bottom: 10px;">
<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://fantazic.com/archives/75" data-text="Embedded Domain-Specific Language" data-count="horizontal" >Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
</div>
<p>OOPSLA 발표장 옆에는 논문들을 전시해 놓고, 작성자와 토론할 수 있는 공간이 있었다. 그중에 &#8220;<a href="www.mockobjects.com/files/evolving_an_edsl.ooplsa2006.pdf">Embedded Domain-Specific Language</a>&#8220;에 관한 논문이 있었는데, 그 당시 DDD에 대해서도 몰랐었고 왠지 특정 영역에서만 사용하는 언어가 뭐가 중요하지라는 생각에 그냥 지나쳤다. (더군다나 Embedded 라는 단어도 거부감이 느껴졌다.)</p>
<p>하지만 최근 Ruby를 공부하면서 Domain-Specific Language에 많은 관심이 생겼고, Java에서 DSL을 어떻게 사용할 수 있을까 고민하면서 이 논문을 다시 읽어보게 되었다.</p>
<pre>
Mock mainframe = mock(Mainframe.class);
Mock auditing = mock(Auditing.class);
Agent agent =
  new Agent( QUANTITY,
            (MainFrame)mainframe.proxy(),
            (Auditing)auditing.proxy() );

public void testBuysWhenPriceEqualsThreshold() {
  mainframe.expects(once())
    .method("buy").with(eq(QUANTITY))
    .will(returnValue(TICKET));
  auditing.expects(once())
    .method("bought").with(same(TICKET));
  agent.onPriceChange(THRESHOLD);
}

public void testDoesNotBuyIfMainframeUnavailable() {
  mainframe.stubs().method("buy")
    .will(throwException(
      new NotAvailableException());
  auditing.expects(never()).method("bought");
  agent.onPriceChange(THRESHOLD);
}
</pre>
<p>도저히 자바 문법으로 보이지 않는 JMock의 테스팅 기법(&#8220;call-chain&#8221; syntax)은 &#8220;Testing with Mock Object&#8221;라는 영역을 자바 문법안에 포함시킨 훌륭한 예임이 분명하다.</p>
<p>JMock이 이런 형태를 갖추기 까지는 여러 단계를 거쳐왔다. 관련 내용은 논문을 읽어보기를 권한다.</p>
<p>가장 기본 개념은 다음과 같다.</p>
<ul>
<li>Separate syntax and interpretation into layers</li>
<p>문법을 정의하기 위해 인터페이스를 사용한다. 각각의 인터페이스는 하나의 구문(clause)을 정의하고 다음 구문을 정의하는 인터페이스를 리턴한다.</p>
<p>또한 선택사항인 구문을 정의하기 위해서 인터페이스 상속을 사용한다.</p>
<p>Builder를 통해 문법 인터페이스를 구현한다.</p>
<li>Use, and abuse, the host language</li>
<p>자바(host language)의 언어적 장점을 활용한다. (GC, reflection, dynamic proxied 등)</p>
<p>반면 EDSL 구현에 있어서 자바의 규칙을 과감히 깰 필요가 있다. OOP에서 피하는 &#8220;train-wreck&#8221; (ex order.getParty().getAddress().getPhoneNumber()) 활용, 선언적 성향이 되기 위해 클래스와 메소드 명명 형식 파괴 등 특정 영역의 사용성을 증대시키기 위한 노력이 필요하다.
</ul>
]]></content:encoded>
			<wfw:commentRss>http://fantazic.com/archives/75/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

