<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Test Driven Dev</title>
	<atom:link href="http://tddguide.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://tddguide.wordpress.com</link>
	<description>Petunjuk bagaimana membangun applikasi yang diguide dengan test</description>
	<lastBuildDate>Mon, 03 Nov 2008 04:03:20 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>id</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='tddguide.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/538d6a5104d34fd6ab81c2860380e986?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Test Driven Dev</title>
		<link>http://tddguide.wordpress.com</link>
	</image>
			<item>
		<title>Hubungan TDD dengan Objects</title>
		<link>http://tddguide.wordpress.com/2008/11/03/hubungan-tdd-dengan-objects/</link>
		<comments>http://tddguide.wordpress.com/2008/11/03/hubungan-tdd-dengan-objects/#comments</comments>
		<pubDate>Mon, 03 Nov 2008 04:03:20 +0000</pubDate>
		<dc:creator>mfathur</dc:creator>
				<category><![CDATA[NMock]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Unit Test]]></category>
		<category><![CDATA[Mock]]></category>
		<category><![CDATA[Object]]></category>
		<category><![CDATA[Test Driven Development]]></category>

		<guid isPermaLink="false">http://tddguide.wordpress.com/?p=186</guid>
		<description><![CDATA[Jejaring Object
Pemprograman berorentasi object adalah teknik membuat program dengan object sebagai titik-titik perhatian. Object pada umumnya adalah wakil dari sebuah benda atau keadaan dalam sebuah sistem sesungguhnya. Namun demikian, fokus utama dari &#8216;berorentasi object&#8221; adalah komunikasi antar object bukan pada diri object.
Sebuah object dalam berkomunikasi menerima pesan dari object lain dan kemudian menjawab pesan itu [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tddguide.wordpress.com&blog=4695936&post=186&subd=tddguide&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>Jejaring Object</strong></p>
<p>Pemprograman berorentasi object adalah teknik membuat program dengan object sebagai titik-titik perhatian. Object pada umumnya adalah wakil dari sebuah benda atau keadaan dalam sebuah sistem sesungguhnya. Namun demikian, fokus utama dari &#8216;berorentasi object&#8221; adalah komunikasi antar object bukan pada diri object.</p>
<p>Sebuah object dalam berkomunikasi menerima pesan dari object lain dan kemudian menjawab pesan itu dengan memberikan pesan pada object lain atau mengembalikan sebuah nilai atau malah mungkin pesan error pada object pengirim pesan. Kirim mengirim pesan ini dalam sebuah object diwakili oleh perintah yang diberinama &#8220;Method&#8221;. Didalam method inilah pesan kemudian diterjemahkan, state diubah, pesan ke object lain dipanggil dan lain sebagainya.</p>
<p>Dalam sebuah system berorentasi object, object-object tersusun dan terhubung seperti jaring, sedemikian hingga object-object saling bisa berkomunikasi. Perilaku dari system seperti ini tergantung pada pilihan object yang disusun. Sekali seubah object didalam sistem diganti, maka perilaku dari sistem itu juga berubah.</p>
<div id="attachment_187" class="wp-caption alignnone" style="width: 302px"><a href="http://www.mockobjects.com/book/figures/web-of-objects.png"><img class="size-full wp-image-187" title="web-of-objects" src="http://tddguide.files.wordpress.com/2008/11/web-of-objects.png?w=292&#038;h=219" alt="Jejaring Objects" width="292" height="219" /></a><p class="wp-caption-text">Jejaring Objects</p></div>
<p><em>Gambar. Jejaring Object</em></p>
<p>Karena perilaku dari sebuah sistem dapat kita ubah-ubah hanya dengan mengganti object, dengan demikian untuk mengatur object-object kita cukup mendeklarasikan saja. Artinya kita hanya fokus pada apa yang akan dilakukan object bukan pada bagaimana sebuah pesan dikerjakan.</p>
<p><strong>Tell Don&#8217;t Ask</strong></p>
<p>Ok. Object-object sekarang sudah saling terhubung, bagaimana sih sesungguhnya mereka berkomunikasi? Dalam berkomunikasi object akan mendeskrispsikan apa yang diinginkannya pada object lain, tentu saja sesuai dengan aturan dari object lain itu. Sesuai tugasnya object lain tersebut kemudian melaksanakan apa yang diperintahkan.</p>
<p>Alec Sharp dalam bukunya <a href="http://www.pragprog.com/articles/tell-dont-ask"><em>Smalltalk by Example</em></a>, mengatakan:</p>
<blockquote><p><em> Procedural code gets information then makes decisions.      Object-oriented code tells objects to do things. </em><br />
<strong>— Alec Sharp</strong></p></blockquote>
<p>Cara berkomunikasi seperti ini umumnya disebut sebagai model &#8220;tell don&#8217;t ask&#8221;, yang merupakan hukum Demeter. Tell berarti object memerintahkan object lain untuk melakukan sesuatu&#8211;sesuai rule-nya tentu. Sedangkan ask berarti object meminta state object lain dan berdasarkan state itu object memutuskan sesuatu terhadap object lain. Maksudnya, daripada mengquery state sebuah object, yang bisa jadi nanti malah kehilangan makna, lebih baik langsung memerintahkan object lain itu. Biarkan object lain memutuskan sendiri apa yang harus dilakukan berdasarkan state yang dia punyai.</p>
<p>Berdasarkan hukum Demeter, method dalam sebuah object hanya boleh memanggil hal-hal yang dimiliki oleh:</p>
<ul>
<li>object itu sendiri.</li>
<li>parameter-parameter yang dikirim melalui method tersebut.</li>
<li>object-object yang dicreate oleh object itu sendiri.</li>
<li>komposisi object.</li>
</ul>
<p>Mengikuti hukum ini, perubahan terhadap sebuah object tidak akan mempengaruhi object lain, dengan demikian tercapailah tujuan agar memanage object-object itu cukup dengan &#8220;declaratif&#8221;. Jadi hukum ini akan membuat object-object tidak saling tergantung.</p>
<p>Nat dan Steve memberikan contoh dalam bukunya,<em> <a href="http://www.mockobjects.com/book/tdd-with-objects-intro.html">Growing Object-Oriented Software, Guided by Tests</a></em><a href="http://www.mockobjects.com/book/tdd-with-objects-intro.html">,</a><br />
mengenai apa yang akan terjadi jika kita tidak mengikuti hukum ini, mereka menyebutnya &#8220;<span class="quote"><em class="glossterm">train wreck code</em></span>&#8220;, kereta yang celaka:</p>
<pre class="programlisting">((EditSaveCustomizer) master.getModelisable()
  .getDockablePanel()
    .getCustomizer())
      .getSaveItem().setEnabled(Boolean.FALSE.booleanValue());</pre>
<p>Setelah dipikir sejenak mengikuti hukum Demeter, maka code ini seharusnya:</p>
<p>master.allowSavingOfCustomisations();</p>
<p>Jadi pemanggilan yang mirip rangkain kereta itu cukup diwrap dalam satu method yang bisa dimengerti saja. Sebagai pengguna object master, kita tidak perlu tahu apa yang diperbuat oleh object master.</p>
<p>Tentu, tidak semua kita &#8220;tell&#8221; ada beberapa hal yang tetep harus kita &#8220;ask&#8221;, seperti jika kita berhubungan dengan Value Object, Collection, dan juga dataset.</p>
<p><strong>Object Unit Testing</strong></p>
<p><em>Mengisolasi Object</em></p>
<p>Lantas bagaimana melakukan unit test agar state dari sebuah object tidak terekspose keluar? Pertama-tama object harus kita isolasi. Kembali pada gambar yang dibuat oleh Nat dan Steve, <a href="http://www.mockobjects.com/book/figures/how-to-test-one-object.png">object in isolation</a>, salah satu object, yang dilingkari merah, menerima pesan dari dua object dan megirim pesan ke tiga object disekitarnya. Kelima object penerima dan pengirim pesan akan kita singkirkan dan tinggallah satu object dalam lingkaran merah.</p>
<p><img src="///tmp/moz-screenshot.jpg" alt="" /></p>
<p><strong></strong></p>
<div id="attachment_197" class="wp-caption alignnone" style="width: 358px"><strong><strong><a href="http://www.mockobjects.com/book/figures/how-to-test-one-object.png"><img class="size-full wp-image-197" title="Bagaimana mengetest sebuah object" src="http://tddguide.files.wordpress.com/2008/11/how-to-test-one-object.png?w=348&#038;h=261" alt="how to test one object" width="348" height="261" /></a></strong></strong><p class="wp-caption-text">how to test one object</p></div>
<p><strong></strong>menjadi,</p>
<div id="attachment_198" class="wp-caption alignnone" style="width: 362px"><a href="http://www.mockobjects.com/book/figures/mock-objects.png"><img class="size-full wp-image-198" title="mock objects" src="http://tddguide.files.wordpress.com/2008/11/mock-objects.png?w=352&#038;h=263" alt="Mock Objects" width="352" height="263" />.</a><p class="wp-caption-text">Mock Objects</p></div>
<p>Kalau kawan-kawannya kita singkirkan, lalu kawan-kawannya kita ganti dengan apa? Kita akan ganti dengan mock atau stub atau apalah yang jelas bukan object sebenarnya. Pada saat melakukan test class-class pembentuk object sebenarnya juga tidak harus ada, cukup diwakili oleh sebuah interface yang menggambarkan apa tugas object yang diwakilinya. Dengan cara seperti ini sebetulnya pada saat yang sama kita juga sedang mencari bentuk object seperti apa yang bisa  mewakili.&#8212;lebih jauh kita akan bahas dengan sebuah contoh(MVC Calculator).</p>
<p><em>Mocking Object</em></p>
<p>Lantas jika object-object disekitarnya tidak ada, bagaimana kolaborasi itu bisa dilaksanakan? Caranya adalah dengan mengganti object-object tadi dengan object <em>Mock</em>. Apa yang dikerjakan <em>Mock</em>? Sebagai wakil dari object sesungguhnya, Mock akan mengeluarkan kemampuan yang  diinginkan test atau disebut <em>Expectation</em>. Jadi setiap kali sebuah object yang kita test membutuhkan respon dari object lain, maka kita tambahkan <em>Expectation</em> didalam <em>Mock</em>. Sekali lagi saya gunakan gambar Nat dan Steve:</p>
<p><a href="http://www.mockobjects.com/book/figures/mockery-and-expectations.png"><img class="alignnone size-full wp-image-200" title="mockery and expectations" src="http://tddguide.files.wordpress.com/2008/11/mockery-and-expectations.png?w=355&#038;h=236" alt="" width="355" height="236" /></a></p>
<p><em>Mockery</em> adalah factory dari object-object yang kita mock. Apa yang kita mock? Yang kita mock adalah <em>interface</em>.</p>
<p>Berikut ini adalah langkah-langkah membuat test (khusus untuk object-object yang sudah jelas):</p>
<ol>
<li>Mock semua object yang dibutuhkan (object-object disekitar).</li>
<li>Buat object yang akan ditest (kongkrit object).</li>
<li>Setup semua <em>Expectation</em> yang diinginkan.</li>
<li>Triger event dari object yang ditest.</li>
<li>Uji semua yang hendak ditest dan cek semua ekspektasi telah dipenuhi.</li>
</ol>
<p>Ini adalah urutan jika kita sudah tahu semua yang terlibat. Jika belum, saya biasanya bergerak dari bawah keatas (5&#8211;&gt;4&#8211;&gt;3&#8211;&gt;2&#8211;&gt;1).</p>
<p>Kita akan bahas lebih lanjut mengenai mock dengan contoh.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tddguide.wordpress.com/186/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tddguide.wordpress.com/186/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tddguide.wordpress.com/186/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tddguide.wordpress.com/186/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tddguide.wordpress.com/186/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tddguide.wordpress.com/186/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tddguide.wordpress.com/186/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tddguide.wordpress.com/186/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tddguide.wordpress.com/186/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tddguide.wordpress.com/186/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tddguide.wordpress.com&blog=4695936&post=186&subd=tddguide&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://tddguide.wordpress.com/2008/11/03/hubungan-tdd-dengan-objects/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fatur</media:title>
		</media:content>

		<media:content url="http://tddguide.files.wordpress.com/2008/11/web-of-objects.png" medium="image">
			<media:title type="html">web-of-objects</media:title>
		</media:content>

		<media:content url="///tmp/moz-screenshot.jpg" medium="image" />

		<media:content url="http://tddguide.files.wordpress.com/2008/11/how-to-test-one-object.png" medium="image">
			<media:title type="html">Bagaimana mengetest sebuah object</media:title>
		</media:content>

		<media:content url="http://tddguide.files.wordpress.com/2008/11/mock-objects.png" medium="image">
			<media:title type="html">mock objects</media:title>
		</media:content>

		<media:content url="http://tddguide.files.wordpress.com/2008/11/mockery-and-expectations.png" medium="image">
			<media:title type="html">mockery and expectations</media:title>
		</media:content>
	</item>
		<item>
		<title>Studi Kasus: Eksepsi (15)</title>
		<link>http://tddguide.wordpress.com/2008/10/29/studi-kasus-eksepsi-15/</link>
		<comments>http://tddguide.wordpress.com/2008/10/29/studi-kasus-eksepsi-15/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 05:09:00 +0000</pubDate>
		<dc:creator>mfathur</dc:creator>
				<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://tddguide.wordpress.com/?p=180</guid>
		<description><![CDATA[Eksepsi
Test berikut ini bertujuan untuk mengantisipasi agar user tidak memasukkan huruf.

[Test]
[ExpectedException(typeof(ApplicationException),&#34;Expression A not supported&#34;)]
public void EksepsiMasukanBentukHuruf()
{
	string input=&#34;100 - 2A0 + 1 - 10&#34;;
	IExpressionConverter exConverter=new ExpressionConverter();
	exConverter.Convert(input);
}

Jadi jika didalam ekspresi ada huruf, converter akan menthrow exception.
       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tddguide.wordpress.com&blog=4695936&post=180&subd=tddguide&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>Eksepsi</strong></p>
<p>Test berikut ini bertujuan untuk mengantisipasi agar user tidak memasukkan huruf.</p>
<pre class="brush: csharp;">
[Test]
[ExpectedException(typeof(ApplicationException),&quot;Expression A not supported&quot;)]
public void EksepsiMasukanBentukHuruf()
{
	string input=&quot;100 - 2A0 + 1 - 10&quot;;
	IExpressionConverter exConverter=new ExpressionConverter();
	exConverter.Convert(input);
}
</pre>
<p>Jadi jika didalam ekspresi ada huruf, converter akan menthrow exception.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tddguide.wordpress.com/180/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tddguide.wordpress.com/180/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tddguide.wordpress.com/180/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tddguide.wordpress.com/180/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tddguide.wordpress.com/180/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tddguide.wordpress.com/180/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tddguide.wordpress.com/180/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tddguide.wordpress.com/180/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tddguide.wordpress.com/180/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tddguide.wordpress.com/180/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tddguide.wordpress.com&blog=4695936&post=180&subd=tddguide&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://tddguide.wordpress.com/2008/10/29/studi-kasus-eksepsi-15/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fatur</media:title>
		</media:content>
	</item>
		<item>
		<title>Studi Kasus: Ratusan(14)</title>
		<link>http://tddguide.wordpress.com/2008/10/29/studi-kasus-ratusan14/</link>
		<comments>http://tddguide.wordpress.com/2008/10/29/studi-kasus-ratusan14/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 04:59:51 +0000</pubDate>
		<dc:creator>mfathur</dc:creator>
				<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://tddguide.wordpress.com/?p=176</guid>
		<description><![CDATA[Ratusan




Object ratusan

Ekspresi ratusan (200)

121

100+100

100 + 20 +1

100-20+1-10

Eksepsi jika tidak ada ekspresi yang bersesuaian



Ratusan adalah komposisi puluhan, tunggal dan ratusan itu sendiri. 
Gambar. Komposisi Ratusan.
Untuk membentuk ratusan, terlebih dahulu kita harus membangun komposisi puluhan. Berikut ini adalah test untuk membentuk komposisi ratusan.

[Test]
public void MembuatKomposisiRatusan()
{
	IExpression dua=Number.CreateNewNumber(&#34;2&#34;);
	IExpression nol=Number.CreateNewNumber(&#34;0&#34;);
	IExpression duaNol=new Puluhan(dua,nol);
	IExpression nol2=Number.CreateNewNumber(&#34;0&#34;);
	IExpression ratusan=new Ratusan(duanol,nol2);
	Assert.AreEqual(&#34;200&#34;,ratusan.Expression);
}

Mencontek puluhan kita bisa mendapatkan calss [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tddguide.wordpress.com&blog=4695936&post=176&subd=tddguide&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>Ratusan</strong></p>
<table width="400" border="1" cellspacing="0" cellpadding="0">
<tr>
<td>
<p>
<strong>Object ratusan</strong>
<p>
Ekspresi ratusan (200)
<p>
121
<p>
100+100
<p>
100 + 20 +1
<p>
100-20+1-10
<p>
Eksepsi jika tidak ada ekspresi yang bersesuaian
</td>
</tr>
</table>
<p>Ratusan adalah komposisi puluhan, tunggal dan ratusan itu sendiri. </p>
<p><em>Gambar. Komposisi Ratusan.</em></p>
<p>Untuk membentuk ratusan, terlebih dahulu kita harus membangun komposisi puluhan. Berikut ini adalah test untuk membentuk komposisi ratusan.</p>
<pre class="brush: csharp;">
[Test]
public void MembuatKomposisiRatusan()
{
	IExpression dua=Number.CreateNewNumber(&quot;2&quot;);
	IExpression nol=Number.CreateNewNumber(&quot;0&quot;);
	IExpression duaNol=new Puluhan(dua,nol);
	IExpression nol2=Number.CreateNewNumber(&quot;0&quot;);
	IExpression ratusan=new Ratusan(duanol,nol2);
	Assert.AreEqual(&quot;200&quot;,ratusan.Expression);
}
</pre>
<p>Mencontek puluhan kita bisa mendapatkan calss Ratusan,</p>
<pre class="brush: csharp;">
public class Ratusan:IExpression
{
	private IExpression m_puluhan;
	private IExpression m_ratusan;
	public Ratusan(IExpression ratusan, IExpression puluhan)
	{
		this.m_puluhan=puluhan;
		this.m_ratusan=ratusan;
	}
	public string Expression{
		get{
			return this.m_ratusan.Expression + this.m_puluhan.Expression;
		}
	}
	public object Value {
		get {
			return (int)this.m_ratusan.Value * 100 + (int)this.m_puluhan.Value;
		}
	}
}
</pre>
<p>Tidak memerlukan red, implementasi ini langsung membuat test kita menjadi hijau.</p>
<p>Berikutnya kita buat test untuk ekspresi,</p>
<pre class="brush: csharp;">
[Test]
public void Konversi121KeRatusan()
{
	string input=&quot;121&quot;;
	IExpressionConverter exConverter=new ExpressionConverter();
	IExpression ex=exConverter.Convert(input);
	Assert.AreEqual(&quot;121&quot;,ex.Expression);
	Assert.AreEqual(121,ex.Value);
}
</pre>
<p>Pesan dari test: Expression 121 not supported. </p>
<p>Seperti dapat diduga kita belum mensupport ratusan didalam method <em>Number.CreateNewNumber</em>. Untuk itu method ini kita ubah menjadi,</p>
<pre class="brush: csharp;">
public static IExpression CreateNewNumber(string ekspresi)
{
	if(ekspresi.Length==1)
		return createSingleNumber(ekspresi);
	else if(ekspresi.Length==2)
		return createPuluhan(ekspresi);
	else if(ekspresi.Length==3)
		return createRatusan(ekspresi);
	else
		throw new ApplicationException(String.Format(&quot;Expression {0} not supported&quot;,ekspresi)); 

}
</pre>
<p>Jadi kita tambahkan blok if ketiga untuk menghandle string yang panjangnya 3 karakter. Kemudian method createRatusan kita definisikan sebagai berikut:</p>
<pre class="brush: csharp;">
private static IExpression createRatusan(string ekspresi)
{
	char[] exs=ekspresi.ToCharArray();
	IExpression ratusan=Number.CreateNewNumber(exs[0].ToString());
	IExpression puluhan=createPuluhan(String.Format(&quot;{0}{1}&quot;,exs[1],exs[2]));
	return new Ratusan(ratusan,puluhan);
}
</pre>
<p>Yaitu cukup dengan mengambil karakter pertama sebagai ratusan dan karakter sisanya sebagai puluhan. Impelementasi ini cukup membuat test kita memberi warna hijau, sehingga kita bisa melangkah menuju test selanjutnya.</p>
<p>Berikutnya adalah test penjumlahan 100 + 100,</p>
<pre class="brush: csharp;">
[Test]
public void Penjumlahan100dengan100()
{
	string input=&quot;100 + 100&quot;;
	IExpressionConverter exConverter=new ExpressionConverter();
	IExpression ex=exConverter.Convert(input);
	Assert.AreEqual(&quot;100 + 100&quot;,ex.Expression);
	Assert.AreEqual(200,ex.Value);
}
</pre>
<p>Test ini juga lewat.</p>
<p>Beriktunya test penjumlahan 100 + 20 + 1,</p>
<pre class="brush: csharp;">
[Test]
public void Penjumlahan100dengan20dengan1()
{
	string input=&quot;100 + 20 + 1&quot;;
	IExpressionConverter exConverter=new ExpressionConverter();
	IExpression ex=exConverter.Convert(input);
	Assert.AreEqual(&quot;100 + 20 + 1&quot;,ex.Expression);
	Assert.AreEqual(121,ex.Value);
}
	&lt;p&gt;Test ini juga lewat.&lt;/p&gt;
	&lt;p&gt;Berikutnya test penjumlahan dan pengurangan 100-20+1-10,&lt;/p&gt;
[sourcecode language='csharp']
[Test]
public void PenjumlahanDanPengurangan100dengan20dengan1()
{
	string input=&quot;100 - 20 + 1 - 10&quot;;
	IExpressionConverter exConverter=new ExpressionConverter();
	IExpression ex=exConverter.Convert(input);
	Assert.AreEqual(&quot;100 - 20 + 1 - 10&quot;,ex.Expression);
	Assert.AreEqual(71,ex.Value);
}
</pre>
<p>Ini juga lewat.</p>
<table width="400" border="1" cellspacing="0" cellpadding="0">
<tr>
<td>
<p>
<span style="text-decoration:line-through;">Object ratusan</span>
<p>
<span style="text-decoration:line-through;">Ekspresi ratusan (200)</span>
<p>
<span style="text-decoration:line-through;">121</span>
<p>
<span style="text-decoration:line-through;">100+100</span>
<p>
<span style="text-decoration:line-through;">100 + 20 +1</span>
<p>
<span style="text-decoration:line-through;">100-20+1-10</span>
<p>
Eksepsi jika tidak ada ekspresi yang bersesuaian
</td>
</tr>
</table>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tddguide.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tddguide.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tddguide.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tddguide.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tddguide.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tddguide.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tddguide.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tddguide.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tddguide.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tddguide.wordpress.com/176/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tddguide.wordpress.com&blog=4695936&post=176&subd=tddguide&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://tddguide.wordpress.com/2008/10/29/studi-kasus-ratusan14/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fatur</media:title>
		</media:content>
	</item>
		<item>
		<title>Studi Kasus: Tujuan Utama Kita!!(13)</title>
		<link>http://tddguide.wordpress.com/2008/10/29/studi-kasus-tujuan-utama-kita13/</link>
		<comments>http://tddguide.wordpress.com/2008/10/29/studi-kasus-tujuan-utama-kita13/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 04:39:17 +0000</pubDate>
		<dc:creator>mfathur</dc:creator>
				<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://tddguide.wordpress.com/?p=174</guid>
		<description><![CDATA[Tujuan utama kita



5+2+4-3+10-2=?

20 + 30

1 + 1 + 1

10 + 20 + 30 + 40 + 51

Minus

Object ratusan

Eksepsi jika tidak ada ekspresi yang bersesuaian



Eksepsi jika tidak ada ekspresi yang bersesuaian
Minus telah kita selesaikan dengan baik. Sekarang bagaimana dengan tujuan pertama kita :5+2+4-3+10-2=?
Tidak ada cara lain kecuali mencobanya,

[Test]
public void PenjumlahanDanPengurangan()
{
	string input=&#34;5+2+4-3+10-2&#34;;
	IExpressionConverter exConverter=new ExpressionConverter();
	IExpression ex=exConverter.Convert(input);
	Assert.AreEqual(&#34;5 + 2 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tddguide.wordpress.com&blog=4695936&post=174&subd=tddguide&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>Tujuan utama kita</strong></p>
<table width="400" border="1" cellspacing="0" cellpadding="0">
<tr>
<td>
<p><strong>5+2+4-3+10-2=?</strong>
<p>
<span style="text-decoration:line-through;">20 + 30</span>
<p>
<span style="text-decoration:line-through;">1 + 1 + 1</span>
<p>
<span style="text-decoration:line-through;">10 + 20 + 30 + 40 + 51</span>
<p>
<span style="text-decoration:line-through;">Minus</span>
<p>
Object ratusan
<p>
Eksepsi jika tidak ada ekspresi yang bersesuaian
</td>
</tr>
</table>
<p>Eksepsi jika tidak ada ekspresi yang bersesuaian</p>
<p>Minus telah kita selesaikan dengan baik. Sekarang bagaimana dengan tujuan pertama kita :5+2+4-3+10-2=?</p>
<p>Tidak ada cara lain kecuali mencobanya,</p>
<pre class="brush: csharp;">
[Test]
public void PenjumlahanDanPengurangan()
{
	string input=&quot;5+2+4-3+10-2&quot;;
	IExpressionConverter exConverter=new ExpressionConverter();
	IExpression ex=exConverter.Convert(input);
	Assert.AreEqual(&quot;5 + 2 + 4 - 3 + 10 - 2&quot;,ex.Expression);
	Assert.AreEqual(16,ex.Value);
}
</pre>
<p>Sekali lagi tidak ada yang perlu diubah. Semuanya green.</p>
<table width="400" border="1" cellspacing="0" cellpadding="0">
<tr>
<td>
<p><span style="text-decoration:line-through;">5+2+4-3+10-2=?</span>
<p>
<span style="text-decoration:line-through;">20 + 30</span>
<p>
<span style="text-decoration:line-through;">1 + 1 + 1</span>
<p>
<span style="text-decoration:line-through;">10 + 20 + 30 + 40 + 51</span>
<p>
<span style="text-decoration:line-through;">Minus</span>
<p>
Object ratusan
<p>
Eksepsi jika tidak ada ekspresi yang bersesuaian
</td>
</tr>
</table>
<p>Masih ada dua task tersisa. Ratusan dan eksepsi-eksepsi. Ratusan kaitannya dengan bagaimana kita membuat mehod <em>CreateNewNumber</em>. Sedangkan eksepsi katiannya dengan input-input yang salah dimasukkan oleh user, huruf misalnya.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tddguide.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tddguide.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tddguide.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tddguide.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tddguide.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tddguide.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tddguide.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tddguide.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tddguide.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tddguide.wordpress.com/174/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tddguide.wordpress.com&blog=4695936&post=174&subd=tddguide&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://tddguide.wordpress.com/2008/10/29/studi-kasus-tujuan-utama-kita13/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fatur</media:title>
		</media:content>
	</item>
		<item>
		<title>Studi Kasus: Minus(12)</title>
		<link>http://tddguide.wordpress.com/2008/10/29/studi-kasus-minus12/</link>
		<comments>http://tddguide.wordpress.com/2008/10/29/studi-kasus-minus12/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 02:34:51 +0000</pubDate>
		<dc:creator>mfathur</dc:creator>
				<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://tddguide.wordpress.com/?p=168</guid>
		<description><![CDATA[Minus



5+2+4-3+10-2=?

20 + 30

1 + 1 + 1

10 + 20 + 30 + 40 + 51

Minus

Object ratusan

Eksepsi jika tidak ada ekspresi yang bersesuaian



Penjumlahan telah kita selesaikan dengan baik. Untuk pengurangan pastinya lebih mudah. Pertama-tama kita harus membuat komposisi dari operasi minus. Mencontek dari test komposisi plus, berikut ini adalah test untuk komposisi minus.

[Test]
public void KomposisiMinus()
{
	IExpression puluhan=Number.CreateNewNumber(&#34;2&#34;);
	IExpression [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tddguide.wordpress.com&blog=4695936&post=168&subd=tddguide&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>Minus</strong></p>
<table width="400" border="1" cellspacing="0" cellpadding="0">
<tr>
<td>
<p>5+2+4-3+10-2=?
<p>
<span style="text-decoration:line-through;">20 + 30</span>
<p>
<span style="text-decoration:line-through;">1 + 1 + 1</span>
<p>
<span style="text-decoration:line-through;">10 + 20 + 30 + 40 + 51</span>
<p>
<strong>Minus</strong>
<p>
Object ratusan
<p>
Eksepsi jika tidak ada ekspresi yang bersesuaian
</td>
</tr>
</table>
<p>Penjumlahan telah kita selesaikan dengan baik. Untuk pengurangan pastinya lebih mudah. Pertama-tama kita harus membuat komposisi dari operasi minus. Mencontek dari test komposisi plus, berikut ini adalah test untuk komposisi minus.</p>
<pre class="brush: csharp;">
[Test]
public void KomposisiMinus()
{
	IExpression puluhan=Number.CreateNewNumber(&quot;2&quot;);
	IExpression satuan=Number.CreateNewNumber(&quot;0&quot;);
	IExpression asal=new Puluhan(puluhan,satuan);
	IExpression pengurang=Number.CreateNewNumber(&quot;1&quot;);
	IExpression minus=new Minus(asal, tambahan);
	Assert.AreEqual(&quot;20 - 1&quot;,minus.Expression);
	Assert.AreEqual(19,minus.Value);
}
</pre>
<p>Disini kita ingin mengurangi 1 dari 20. Agar test bisa dikompile kita harus membuat class Minus. Mencontek dari class Plus, test diatas langsung green.</p>
<pre class="brush: csharp;">
public class Minus:IExpression
{
	private IExpression m_asal;
	private IExpression m_pengurang;
	public Minus(IExpression asal, IExpression pengurang)
	{
		this.m_asal= asal;
		this.m_pengurang = pengurang;
	}
	public string Expression {
		get {
			return String.Format(&quot;{0} - {1}&quot;,this.m_asal.Expression,this.m_pengurang.Expression);
		}
	}
	public object Value {
		get {
			return (int)this.m_asal.Value - (int)this.m_pengurang.Value;
		}
	}
}
</pre>
<p>Langkah berikutnya adalah membangun ekspresi minus, jadi kita harus bisa mengkonversi “20 -1”. Berikut ini adalah test hasil contekan dari test ekspresi plus.</p>
<pre class="brush: csharp;">
[Test]
public void EkspresiMinus(){
	string input=&quot;1 - 1&quot;;
	IExpressionConverter exConverter=new ExpressionConverter();
	IExpression ex=exConverter.Convert(input);
	Assert.AreEqual(&quot;1 - 1&quot;,ex.Expression);
	Assert.AreEqual(0,ex.Value);
}
</pre>
<p>Pesan yang muncul : Expression &#8211; not supported. Good! Memang minus belum kita support. Todo that&#8230;. gampang tambahkan sesuatu di method getOperator.</p>
<pre class="brush: csharp;">
private IExpression getOperator(string ekspresi,IExpression exp1, IExpression exp2)
{
	int oprIndex=getOperatorPosition(1,ekspresi);
	string opr=ekspresi.Substring(oprIndex,1); 

	if(opr.Equals(PLUS.ToString()))
		return new Plus(exp1,exp2);
	else if(opr.Equals(MINUS.ToString()))
		return new Minus(exp1,exp2);
	else
		throw new ApplicationException(String.Format(&quot;Expression {0} not operator&quot;,opr));
}
</pre>
<p>Perhatikan blok kedua dari if. Sesimpel itu. Semua test kita menjadi green. Bagaiman dengan 20-1 dan 1-20? Ok. Mari kita buat test,</p>
<pre class="brush: csharp;">
public void Kurangkan1dari20(){
	string input=&quot;20 - 1&quot;;
	IExpressionConverter exConverter=new ExpressionConverter();
	IExpression ex=exConverter.Convert(input);
	Assert.AreEqual(&quot;20 - 1&quot;,ex.Expression);
	Assert.AreEqual(19,ex.Value);
}
</pre>
<pre class="brush: csharp;">
[Test]
public void Kurangkan20dari1(){
	string input=&quot;1 - 20&quot;;
	IExpressionConverter exConverter=new ExpressionConverter();
	IExpression ex=exConverter.Convert(input);
	Assert.AreEqual(&quot;1 - 20&quot;,ex.Expression);
	Assert.AreEqual(-19,ex.Value);
}
</pre>
<p>Tak ada yang perlu diaubah, semuanya green. Bagaimaan dengan 10-20-30-40-51? Ayo kita buat testnya,</p>
<pre class="brush: csharp;">
[Test]
public void OperatorMinusLebihDari3(){
	string input=&quot;10 - 20 - 30 - 40 - 51&quot;;
	IExpressionConverter exConverter=new ExpressionConverter();
	IExpression ex=exConverter.Convert(input);
	Assert.AreEqual(&quot;10 - 20 - 30 - 40 - 51&quot;,ex.Expression);
	Assert.AreEqual(-131,ex.Value);
}
</pre>
<p>Tetap OK. Tidak ada masalah. Kita coret task kita.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tddguide.wordpress.com/168/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tddguide.wordpress.com/168/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tddguide.wordpress.com/168/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tddguide.wordpress.com/168/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tddguide.wordpress.com/168/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tddguide.wordpress.com/168/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tddguide.wordpress.com/168/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tddguide.wordpress.com/168/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tddguide.wordpress.com/168/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tddguide.wordpress.com/168/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tddguide.wordpress.com&blog=4695936&post=168&subd=tddguide&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://tddguide.wordpress.com/2008/10/29/studi-kasus-minus12/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fatur</media:title>
		</media:content>
	</item>
		<item>
		<title>Studi Kasus: Penjumlahan 20 + 30 (11)</title>
		<link>http://tddguide.wordpress.com/2008/10/29/studi-kasus-penjumlahan-20-30-11/</link>
		<comments>http://tddguide.wordpress.com/2008/10/29/studi-kasus-penjumlahan-20-30-11/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 01:56:47 +0000</pubDate>
		<dc:creator>mfathur</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://tddguide.wordpress.com/?p=166</guid>
		<description><![CDATA[Penjumlahan 20 + 30



5+2+4-3+10-2=?

20 + 30

1 + 1 + 1

Object ratusan

Eksepsi jika tidak ada ekspresi yang bersesuaian



Sebelum melangkah lebih jauh kita harus menguji apakah ekspresi ke dua bisa menerima puluhan. Berikut ini adalah contoh test untuk hal ini,

[Test]
public void Penjumlahan20dengan30(){
	string input=&#34;20 + 30&#34;;
	IExpressionConverter exConverter=new ExpressionConverter();
	IExpression ex=exConverter.Convert(input);
	Assert.AreEqual(&#34;20 + 30&#34;,ex.Expression);
	Assert.AreEqual(50,ex.Value);
}

Good! Test kita bisa jalan. Dengan demikian puluhan [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tddguide.wordpress.com&blog=4695936&post=166&subd=tddguide&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>Penjumlahan 20 + 30</strong></p>
<table width="400" border="1" cellspacing="0" cellpadding="0">
<tr>
<td>
<p>5+2+4-3+10-2=?
<p>
<strong>20 + 30</strong>
<p>
1 + 1 + 1
<p>
Object ratusan
<p>
Eksepsi jika tidak ada ekspresi yang bersesuaian
</td>
</tr>
</table>
<p>Sebelum melangkah lebih jauh kita harus menguji apakah ekspresi ke dua bisa menerima puluhan. Berikut ini adalah contoh test untuk hal ini,</p>
<pre class="brush: csharp;">
[Test]
public void Penjumlahan20dengan30(){
	string input=&quot;20 + 30&quot;;
	IExpressionConverter exConverter=new ExpressionConverter();
	IExpression ex=exConverter.Convert(input);
	Assert.AreEqual(&quot;20 + 30&quot;,ex.Expression);
	Assert.AreEqual(50,ex.Value);
}
</pre>
<p>Good! Test kita bisa jalan. Dengan demikian puluhan di ekspresi kedua bisa diterima.</p>
<p>Sampai disini sebetulnya kita telah melangkah 75% sisa yang 25% hanyalah perulangan. 1+1+1 boleh kita tulis ([1+1] + 1). Kunci dari keberhasilan konversi kita selanjutnya terletak pada seberapa pintar kita melakukan pemotongan. Daripada banyak teori, kita langsung test saja,</p>
<pre class="brush: csharp;">
[Test]
public void Penjumlahan1dengan1dengan1(){
	string input=&quot;1 + 1 + 1&quot;;
	IExpressionConverter exConverter=new ExpressionConverter();
	IExpression ex=exConverter.Convert(input);
	Assert.AreEqual(&quot;1 + 1 + 1&quot;,ex.Expression);
	Assert.AreEqual(3,ex.Value);
}
</pre>
<p>Test ini berakhir red, dengan pesan: <em>expected “1 + 1 + 1” but was “1 + 1”</em>. Dengan demikian kita sebetulnya telah mengenali pola pertama kita tinggal mengulang lagi pola yang kedua. Caranya adalah dengan mengetahui letak atau posisi masing-masing operator. Nah, kita melakukan looping didalam string dan memotong-motongnya. Kita melakukan loop sebanyak operator yang ada. Tantangannya adalah kita harus tahu jumlah operator dan juga posisi. Jumlah operator adalah sebanyak jumlah number dikurang satu: opr=angka -1. Untuk sementara test kita diatas kita ignore. Kita akan mencoba melakukan pencarian jumlah operator dan posisi terlebih dahulu.</p>
<p>Berikut ini adalah test untuk mencari jumlah operator,</p>
<pre class="brush: csharp;">
[Test]
public void HitungJumlahOperator()
{
	string input=&quot;1 + 1 + 1 - 5 -60 + 10&quot;;
	string[] opr=input.Split('+','-');
	Assert.AreEqual(5,opr.Length-1);
}
</pre>
<p>Dengan demikian untuk mengetahui jumlah operator kita gunakan method <em>Split()</em>.</p>
<p>Dan berikut ini adalah test method untuk mendapatkan posisi dari operator,</p>
<pre class="brush: csharp;">
[Test]
public void DapatkanPosisiOperatorDalamExpresi()
{
	string input=&quot;1 + 1 + 1 - 5 -60 + 10&quot;;
	Assert.AreEqual(2,getOperatorPosition(1,input));
	Assert.AreEqual(6,getOperatorPosition(2,input));
	Assert.AreEqual(10,getOperatorPosition(3,input));
	Assert.AreEqual(14,getOperatorPosition(4,input));
}
</pre>
<p>Jadi kita harus mensupplay nomor operator dan ekspresi input.</p>
<pre class="brush: csharp;">
private int getOperatorPosition(int number,string input)
{
	string[] opr=input.Split('+','-');
	int result=0;
	for(int i=0; i&lt;number;i++)
	{
		result +=opr[i].Length;
	}
	result +=number-1;
	return result;
}
</pre>
<p>Sekalilagi kita menggunakan split. Lalu kita susun sebanyak operator yang diinginkan. Apa yang kita dapatkan disini akan kita terapkan di program. </p>
<p>Sekarang hapus Ignore dan kembali ke test sebelumnya. Lalu saya rubah method interpret menjadi,</p>
<pre class="brush: csharp;">
private IExpression interpret(string ekspresi)
{
	ekspresi=ekspresi.Trim();
	ekspresi=ekspresi.Trim(PLUS,MINUS);
	if(!(ekspresi.Contains(PLUS.ToString())||ekspresi.Contains(MINUS.ToString())))
		return Number.CreateNewNumber(ekspresi);
	else{
		int totalOperator=getTotalOperator(ekspresi);
		IExpression exp1=getExp1(ekspresi);
		string subEkspresi=ekspresi;
		for(int i=0;i&lt;totalOperator;i++){
			exp1=composeOperation(exp1,subEkspresi);
			subEkspresi=getNextExpression(i+1,ekspresi);
		}
		return exp1;
	}
}
</pre>
<p>Pertama, saya harus mendapatkan jumlah operator didalam ekspresi. Cara untuk mendapatkannya sudah kita riset sebelumnya.</p>
<p>Kedua, saya harus mendapatkan ekspresi 1 (exp1). Jadi untuk ekspresi “5+4+1+3” perulangannya akan seperti ini. </p>
<pre>
Langkah 1: exp1=5. Exp2=4. Operator=+. SubEkspresi=”5+4+1+3”
Langkah 2: exp1=5+4. Exp2=1 Operator=+. SubEkspresi=”4+1+3”
Langkah 3: exp1=5+4+1. Exp2=3 Operator=+. SubEkspresi=”1+3”
</pre>
<p>Perhatikan disini ada perubahan dari string menjadi komposisi. Exp1 adalah komposisi yang selalu kita suntikkan sebagai pembentuk komposisi berikutnya.</p>
<p>Method  getNextExpression saya maksudkan untuk menapatkan ekspresi berikutnya yang akan saya suntikkan ke dalam komposisi.</p>
<pre class="brush: csharp;">
private int getTotalOperator(string ekspresi)
{
	string[] opr=ekspresi.Split(PLUS,MINUS);
	return opr.Length-1;
}
</pre>
<p>Perhatikan, getTotalOperator sama persis dengan yang ada didalam test. Jadi, saya akan membuat test semua asumsi yang tidak jelas dalam kepala saya menjadi code yang lebih jelas. Hasilnya bisa langsung kita kopikan. Ini lebih aman dari pada saya buat didalam program.</p>
<p>Untuk kasus seperti ini biasanya para pengguna IDE melakukan debugging dengan melihat apa hasilnya didalam IDE pada saat program dirun. Disini kita hanya menukil sebagian kecil dari fungsi yang kita inginkan.</p>
<pre class="brush: csharp;">
private string getNextExpression(int next,string ekspresi)
{
	int oprIndex=getOperatorPosition(next,ekspresi);
	return ekspresi.Substring(oprIndex+1);
}
</pre>
<p>Method <em>getNextExpression</em> saya masksudkan untuk mendapatkan ekspresi berikutnya  (subekspresi) seperti yang telah saya jelaskan diatas. Jadi saya harus mendapatkan index ke-n dari operator tersebut. Dari situ kemudian dipotong sampai ke belakang.</p>
<pre class="brush: csharp;">
private int getOperatorPosition(int number,string input)
{
	string[] opr=input.Split(PLUS,MINUS);
	int result=0;
	for(int i=0; i&lt;number;i++)
	{
		result +=opr[i].Length;
	}
	result +=number-1;
	return result;
}
</pre>
<p>Perhatikan, sama persis dengan yang kita riset.</p>
<p>Nah, bagaimana dengan komposisi,</p>
<pre class="brush: csharp;">
private IExpression composeOperation(IExpression exp1,string ekspresi)
{
	IExpression exp2=getExp2(ekspresi);
	return getOperator(ekspresi,exp1,exp2);
}
</pre>
<p>Ternyata sederhana saja dan merupakan kopian dari code sebelumnya he he he. Jadi sebetulnya saya hanya memotong bagian yang mesti diulang-ulang. Itu saja.</p>
<p>Sekarang kita jalankan test. Ups!! Pesan kesalahannya : Expression 0 not operator.</p>
<p>Pesan ini mengindikasikan kegagalan untuk mendapatkan operator. Sayangnya tidak jelas operataor keberapa. Buntu.</p>
<p>Para newbie dalam TDD biasanya akan membuat applikasi konsole, lalu membuat method Main(). Membuat code yang bersesuaian didalam Main. Menandaiknya dengan tanda merah. Kemudian menjalankan program. Ketika tanda kuning sudah jatuh didalam tanda merah. Kursor mouse diarahkan disalah satu variabel kemudian dilihat value-nya. Setelah itu ambil keputusan. Diubah dan diulang lagi.</p>
<p>Saya tidak akan mengajarkan seperti itu. Saya lebih suka meletakkan Console.Writeline() kemudian melihat hasilnya di console NUnit. Setelah semuanya selesai, Console.Writeline itu akan saya hapus.</p>
<p>Jadi saya akan letakkan Console.WriteLine didalam method getOperator,</p>
<pre class="brush: csharp;">
private IExpression getOperator(string ekspresi,IExpression exp1, IExpression exp2)
{
	string afterExp1=ekspresi.Substring(exp1.Expression.Length).Trim();
	Console.WriteLine(&quot;exp1 {0}, exp2 {1}, ekspresi {2}, afterExp1 {3}&quot;,
	                  exp1.Expression,exp2.Expression,ekspresi,afterExp1);
	string opr=afterExp1.Substring(0,1);
	if(opr.Equals(PLUS.ToString())){
		return new Plus(exp1,exp2);
	}else
		throw new ApplicationException(String.Format(&quot;Expression {0} not operator&quot;,opr));
}
</pre>
<p>Output dari console ini adalah:</p>
<pre class="brush: csharp;">
	exp1 10, exp2 20, ekspresi 10 + 20 + 30 + 40 + 51, afterExp1 + 20 + 30 + 40 + 51
	exp1 10 + 20, exp2 30, ekspresi  20 + 30 + 40 + 51, afterExp1 0 + 40 + 51
</pre>
<p>Dari data diatas, terlihat kita gagal dilooping kedua. Baik exp1 dan exp2 serta subekspresi sudah benar. Tetapi logika untuk mendapatkan operator berikutnya salah.</p>
<p>Sebelumnya, untuk mendapatkan operator kita lakukan dengan memotong subekspresi dengan ekspresi pertama sehingga harapannya afterExp1 tinggal + 30 + 40 + 51. Karena ekspresi pertama kini bukan lagi ekspresi tunggal tapi sudah komposisi, akibatnya pemotongannya terlalu panjang.</p>
<p>Maka, tidak ada cara lain kecuali mengubah algoritma pemotongan. Pertama, kita harus mendapatkan posisi operator pertama dalam subekspresi. Untungnya kita telah memiliki method untuk mendapatkan posisi itu. Index posisi yang dihasilkan kemudian kita pakai untuk mendapatkan operator. Jadi saya ubah menjadi,</p>
<pre class="brush: csharp;">
private IExpression getOperator(string ekspresi,IExpression exp1, IExpression exp2)
{
	int oprIndex=getOperatorPosition(1,ekspresi);
	string opr=ekspresi.Substring(oprIndex,1);
	Console.WriteLine(&quot;exp1 {0}, exp2 {1}, ekspresi {2}, afterExp1 {3}&quot;,
	                  exp1.Expression,exp2.Expression,ekspresi,ekspresi.Substring(oprIndex)); 

	if(opr.Equals(PLUS.ToString())){
		return new Plus(exp1,exp2);
	}else
		throw new ApplicationException(String.Format(&quot;Expression {0} not operator&quot;,opr));
}
</pre>
<p>Perhatikan angka 1 dalam method<em> getOperatorPosition(1,ekspresi)</em>. Jadi saya hanya ambil posisi yang pertama. Console out yang dihasilkan,</p>
<pre class="brush: csharp;">
	exp1 10, exp2 20, ekspresi 10 + 20 + 30 + 40 + 51, afterExp1 + 20 + 30 + 40 + 51
	exp1 10 + 20, exp2 30, ekspresi  20 + 30 + 40 + 51, afterExp1 + 30 + 40 + 51
	exp1 10 + 20 + 30, exp2 40, ekspresi  30 + 40 + 51, afterExp1 + 40 + 51
	exp1 10 + 20 + 30 + 40, exp2 51, ekspresi  40 + 51, afterExp1 + 51
</pre>
<p>Setelah perubahan ini afterExp1 menunjukkan nilai yang benar. Jadi cukup memotong satu karakter diujung, didapatlah operator.</p>
<p>Console.WriteLine saya hapus. Semua test berjalan dengan benar.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tddguide.wordpress.com/166/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tddguide.wordpress.com/166/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tddguide.wordpress.com/166/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tddguide.wordpress.com/166/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tddguide.wordpress.com/166/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tddguide.wordpress.com/166/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tddguide.wordpress.com/166/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tddguide.wordpress.com/166/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tddguide.wordpress.com/166/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tddguide.wordpress.com/166/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tddguide.wordpress.com&blog=4695936&post=166&subd=tddguide&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://tddguide.wordpress.com/2008/10/29/studi-kasus-penjumlahan-20-30-11/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fatur</media:title>
		</media:content>
	</item>
		<item>
		<title>Studi Kasus: Ubah + dan – dengan konstanta(10)</title>
		<link>http://tddguide.wordpress.com/2008/10/28/studi-kasus-ubah-dan-%e2%80%93-dengan-konstanta10/</link>
		<comments>http://tddguide.wordpress.com/2008/10/28/studi-kasus-ubah-dan-%e2%80%93-dengan-konstanta10/#comments</comments>
		<pubDate>Tue, 28 Oct 2008 15:41:00 +0000</pubDate>
		<dc:creator>mfathur</dc:creator>
				<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://tddguide.wordpress.com/?p=164</guid>
		<description><![CDATA[Ubah + dan – dengan konstanta.



5+2+4-3+10-2=?

Konversi string 1 ke object Satu.

Konversi string 2 ke object Dua.

Konversi string 3 ke object Tiga.

&#8230;dst sampai Sembilan.

Object puluhan

Value dalam komposisi puluhan

Object ratusan

Object penjumlahan

Buat Number.CreateNewNumber bisa menerima puluhan

Refactor Convert untuk kondisi panjang ekspresi ==2

Panggil interpret saja untuk convert

Ubah + dan – dengan konstanta

Eksepsi jika tidak ada ekspresi yang bersesuaian



Tambahkan konstanta [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tddguide.wordpress.com&blog=4695936&post=164&subd=tddguide&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>Ubah + dan – dengan konstanta.</strong></p>
<table width="400" border="1" cellspacing="0" cellpadding="0">
<tr>
<td>
<p>5+2+4-3+10-2=?
<p>
<span style="text-decoration:line-through;">Konversi string 1 ke object Satu.</span>
<p>
<span style="text-decoration:line-through;">Konversi string 2 ke object Dua.</span>
<p>
<span style="text-decoration:line-through;">Konversi string 3 ke object Tiga.</span>
<p>
<span style="text-decoration:line-through;">&#8230;dst sampai Sembilan.</span>
<p>
<span style="text-decoration:line-through;">Object puluhan</span>
<p>
<span style="text-decoration:line-through;">Value dalam komposisi puluhan</span>
<p>
Object ratusan
<p>
<span style="text-decoration:line-through;">Object penjumlahan</span>
<p>
<span style="text-decoration:line-through;">Buat Number.CreateNewNumber bisa menerima puluhan</span>
<p>
<span style="text-decoration:line-through;">Refactor Convert untuk kondisi panjang ekspresi ==2</span>
<p>
<span style="text-decoration:line-through;">Panggil interpret saja untuk convert</span>
<p>
<strong>Ubah + dan – dengan konstanta</strong>
<p>
Eksepsi jika tidak ada ekspresi yang bersesuaian
</td>
</tr>
</table>
<p>Tambahkan konstanta berikut ini kedalam class <em>ExpressionConverter</em>,</p>
<pre class="brush: csharp;">
public class ExpressionConverter:IExpressionConverter
{
	private const char PLUS='+';
	private const char MINUS='-';
	private const string NOL=&quot;0&quot;;
	...
}
</pre>
<p>Setelah itu ubah semua magic karakter ke konstanta diatas. Sebagai contoh anda bisa lihat yang berikut ini,</p>
<pre class="brush: csharp;">
private IExpression interpret(string ekspresi)
{
	ekspresi=ekspresi.Trim();
	ekspresi=ekspresi.Trim(PLUS,MINUS);
	if(!(ekspresi.Contains(PLUS.ToString())||ekspresi.Contains(MINUS.ToString())))
		return Number.CreateNewNumber(ekspresi);
	else{
		IExpression exp1=getExp1(ekspresi);
		IExpression exp2=getExp2(ekspresi);
		return getOperator(ekspresi,exp1,exp2);
	}
}
</pre>
<p>Perhatikan PLUS dan MINUS bertipe Char, jadi untuk string anda harus mengubahnya ke tipe string dengan method <em>PLUS.ToString()</em>.</p>
<p>All Green.</p>
<table width="400" border="1" cellspacing="0" cellpadding="0">
<tr>
<td>
<p>5+2+4-3+10-2=?
<p>
<span style="text-decoration:line-through;">Konversi string 1 ke object Satu.</span>
<p>
<span style="text-decoration:line-through;">Konversi string 2 ke object Dua.</span>
<p>
<span style="text-decoration:line-through;">Konversi string 3 ke object Tiga.</span>
<p>
<span style="text-decoration:line-through;">&#8230;dst sampai Sembilan.</span>
<p>
<span style="text-decoration:line-through;">Object puluhan</span>
<p>
<span style="text-decoration:line-through;">Value dalam komposisi puluhan</span>
<p>
Object ratusan
<p>
<span style="text-decoration:line-through;">Object penjumlahan</span>
<p>
<span style="text-decoration:line-through;">Buat Number.CreateNewNumber bisa menerima puluhan</span>
<p>
<span style="text-decoration:line-through;">Refactor Convert untuk kondisi panjang ekspresi ==2</span>
<p>
<span style="text-decoration:line-through;">Panggil interpret saja untuk convert</span>
<p>
<span style="text-decoration:line-through;">Ubah + dan – dengan konstanta</span>
<p>
Eksepsi jika tidak ada ekspresi yang bersesuaian
</td>
</tr>
</table>
<p>Kita sudah separuh jalan. List kita juga semakin panjang. Ambil kertas, pindahkan yang belum dicoret. Simpan yang lama.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tddguide.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tddguide.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tddguide.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tddguide.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tddguide.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tddguide.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tddguide.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tddguide.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tddguide.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tddguide.wordpress.com/164/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tddguide.wordpress.com&blog=4695936&post=164&subd=tddguide&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://tddguide.wordpress.com/2008/10/28/studi-kasus-ubah-dan-%e2%80%93-dengan-konstanta10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fatur</media:title>
		</media:content>
	</item>
		<item>
		<title>Studi Kasus: Panggil saja aku Interpret(9)</title>
		<link>http://tddguide.wordpress.com/2008/10/28/studi-kasus-panggil-saja-aku-interpret9/</link>
		<comments>http://tddguide.wordpress.com/2008/10/28/studi-kasus-panggil-saja-aku-interpret9/#comments</comments>
		<pubDate>Tue, 28 Oct 2008 15:28:54 +0000</pubDate>
		<dc:creator>mfathur</dc:creator>
				<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://tddguide.wordpress.com/?p=162</guid>
		<description><![CDATA[Panggil saja aku Interpret



5+2+4-3+10-2=?

Konversi string 1 ke object Satu.

Konversi string 2 ke object Dua.

Konversi string 3 ke object Tiga.

&#8230;dst sampai Sembilan.

Object puluhan

Value dalam komposisi puluhan

Object ratusan

Object penjumlahan

Buat Number.CreateNewNumber bisa menerima puluhan

Refactor Convert untuk kondisi panjang ekspresi ==2

Panggil interpret saja untuk convert

Eksepsi jika tidak ada ekspresi yang bersesuaian



Bagian pertama dan kedua dari blok if didalam method [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tddguide.wordpress.com&blog=4695936&post=162&subd=tddguide&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>Panggil saja aku Interpret</strong></p>
<table width="400" border="1" cellspacing="0" cellpadding="0">
<tr>
<td>
<p>5+2+4-3+10-2=?
<p>
<span style="text-decoration:line-through;">Konversi string 1 ke object Satu.</span>
<p>
<span style="text-decoration:line-through;">Konversi string 2 ke object Dua.</span>
<p>
<span style="text-decoration:line-through;">Konversi string 3 ke object Tiga.</span>
<p>
<span style="text-decoration:line-through;">&#8230;dst sampai Sembilan.</span>
<p>
<span style="text-decoration:line-through;">Object puluhan</span>
<p>
<span style="text-decoration:line-through;">Value dalam komposisi puluhan</span>
<p>
Object ratusan
<p>
<span style="text-decoration:line-through;">Object penjumlahan</span>
<p>
<span style="text-decoration:line-through;">Buat Number.CreateNewNumber bisa menerima puluhan</span>
<p>
<span style="text-decoration:line-through;">Refactor Convert untuk kondisi panjang ekspresi ==2</span>
<p>
<strong>Panggil interpret saja untuk convert</strong>
<p>
Eksepsi jika tidak ada ekspresi yang bersesuaian
</td>
</tr>
</table>
<p>Bagian pertama dan kedua dari blok if didalam method <em>Convert</em>, sebetulnya dimaksudkan untuk menginterpretasi jika didalam ekspresi tidak ada operator. Maka, untuk memindahkan blok ini kedalam  method <em>Interpret</em> adalah cukup dengan memeriksa apakah didalam ekspresi ada operator + atau tidak.</P></p>
<pre class="brush: csharp;">
private IExpression interpret(string ekspresi)
{
	ekspresi=ekspresi.Trim();
	ekspresi=ekspresi.Trim('+','-');
	if(!(ekspresi.Contains(&quot;+&quot;)||ekspresi.Contains(&quot;-&quot;)))
		return Number.CreateNewNumber(ekspresi);
	else{
		IExpression exp1=getExp1(ekspresi);
		IExpression exp2=getExp2(ekspresi);
		return getOperator(ekspresi,exp1,exp2);
	}
}
</pre>
<p>Perubahan ini tidak mempengaruhi test. NUnit tetap green. Karena itu method <em>Convert</em> saya ubah menjadi,</p>
<pre class="brush: csharp;">
public IExpression Convert (string ekspresi)
{
	if(ekspresi.Length==1)
		return interpret(ekspresi);
	else if (ekspresi.Length == 2)
		return interpret(ekspresi);
	else if(ekspresi.Length&gt;2)
	    return interpret(ekspresi);
	else
		return interpret(ekspresi);
}
	&lt;p&gt;Semua blok if memanggil method yang sama : interpret. Dengan demikian if boleh kita hilangkan,&lt;/p&gt;
[sourcecode language='csharp']
public IExpression Convert (string ekspresi)
{
		return interpret(ekspresi);
}
</pre>
<p>Lebih sederhana dan mudah dibaca. Agar lebih mudah dibaca lagi, kia akan ganti + dan – yang bertebaran dimana-mana itu dengan enum operator.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tddguide.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tddguide.wordpress.com/162/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tddguide.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tddguide.wordpress.com/162/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tddguide.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tddguide.wordpress.com/162/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tddguide.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tddguide.wordpress.com/162/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tddguide.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tddguide.wordpress.com/162/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tddguide.wordpress.com&blog=4695936&post=162&subd=tddguide&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://tddguide.wordpress.com/2008/10/28/studi-kasus-panggil-saja-aku-interpret9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fatur</media:title>
		</media:content>
	</item>
		<item>
		<title>Studi Kasus: Refactoring CreateNumber (8)</title>
		<link>http://tddguide.wordpress.com/2008/10/28/studi-kasus-refactoring-createnumber-8/</link>
		<comments>http://tddguide.wordpress.com/2008/10/28/studi-kasus-refactoring-createnumber-8/#comments</comments>
		<pubDate>Tue, 28 Oct 2008 14:49:57 +0000</pubDate>
		<dc:creator>mfathur</dc:creator>
				<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://tddguide.wordpress.com/?p=160</guid>
		<description><![CDATA[Refactoring CreateNumber



5+2+4-3+10-2=?

Konversi string 1 ke object Satu.

Konversi string 2 ke object Dua.

Konversi string 3 ke object Tiga.

&#8230;dst sampai Sembilan.

Object puluhan

Value dalam komposisi puluhan

Object ratusan

Object penjumlahan

Buat Number.CreateNewNumber bisa menerima puluhan

Refactor Convert untuk kondisi panjang ekspresi ==2

Eksepsi jika tidak ada ekspresi yang bersesuaian



Agar Number bisa mengcreate puluhan kita harus merubah sedikit cara mengenali ekspresi. Jika panjangnya 1, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tddguide.wordpress.com&blog=4695936&post=160&subd=tddguide&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>Refactoring CreateNumber</strong></p>
<table width="400" border="1" cellspacing="0" cellpadding="0">
<tr>
<td>
<p>5+2+4-3+10-2=?
<p>
<span style="text-decoration:line-through;">Konversi string 1 ke object Satu.</span>
<p>
<span style="text-decoration:line-through;">Konversi string 2 ke object Dua.</span>
<p>
<span style="text-decoration:line-through;">Konversi string 3 ke object Tiga.</span>
<p>
<span style="text-decoration:line-through;">&#8230;dst sampai Sembilan.</span>
<p>
<span style="text-decoration:line-through;">Object puluhan</span>
<p>
<span style="text-decoration:line-through;">Value dalam komposisi puluhan</span>
<p>
Object ratusan
<p>
<span style="text-decoration:line-through;">Object penjumlahan</span>
<p>
<strong>Buat Number.CreateNewNumber bisa menerima puluhan</strong>
<p>
Refactor Convert untuk kondisi panjang ekspresi ==2
<p>
Eksepsi jika tidak ada ekspresi yang bersesuaian
</td>
</tr>
</table>
<p>Agar Number bisa mengcreate puluhan kita harus merubah sedikit cara mengenali ekspresi. Jika panjangnya 1, tetap dibuat seperti biasa. Jika panjangnya 2, panggil method pembuat puluhan,</p>
<pre class="brush: csharp;">
public static IExpression CreateNewNumber(string ekspresi)
{
	if(ekspresi.Length==1)
		return createSingleNumber(ekspresi);
	else if(ekspresi.Length==2)
		return createPuluhan(ekspresi);
	else
		throw new ApplicationException(String.Format(&quot;Expression {0} not supported&quot;,ekspresi)); 

}
</pre>
<p>Disini <em>createSingleNumber</em> adalah method yang menanggil kode sebelumnya—jadi saya pindahkan agar enak dilihat. Sedangkan <em>createPuluhan</em> adalah method yang akan kita gunakan untuk membuat <em>Puluhan</em>. Isi dari method ini sebetulnya hanya mencontek yang ada di mehod <em>Convert</em> untuk kondisi ekspresi dengan panjang 2. Ini merupakan kandidat untuk kita refaktor nantinya karena muncul duplikasi, sementara kita catat dulu.</p>
<pre class="brush: csharp;">
private static IExpression createPuluhan(string ekspresi)
{
	char[] exs=ekspresi.ToCharArray();
	IExpression puluhan=Number.CreateNewNumber(exs[0].ToString());
	IExpression satuan=Number.CreateNewNumber(exs[1].ToString());
	return new Puluhan(puluhan,satuan);
}
</pre>
<p>Test saya jalankan. Satu test break: <em>FactoryNumberException</em>. Ini muncul karena method <em>CreateNewNumber</em> yang tadinya tidak bisa menerima puluhan sekarang bisa. Sehingga agar green kembali, eksepsinya saya ganti menjadi ratusan.</p>
<pre class="brush: csharp;">
[Test]
[ExpectedException(typeof(ApplicationException),&quot;Expression 200 not supported&quot;)]
public void FactoryNumberException()
{
	Number.CreateNewNumber(&quot;200&quot;);
}
</pre>
<p>Test saya jalankan. Semuanya green.</p>
<p>Berikutnya kita ubah sedikit method <em>Convert</em>. Perhatikan code berikut ini,</p>
<pre class="brush: csharp;">
public IExpression Convert (string ekspresi)
{
	if(ekspresi.Length==1)
		return Number.CreateNewNumber(ekspresi);
	else if (ekspresi.Length == 2)
	{
		char[] exs=ekspresi.ToCharArray();
		IExpression puluhan=Number.CreateNewNumber(exs[0].ToString());
		IExpression satuan=Number.CreateNewNumber(exs[1].ToString());
		return new Puluhan(puluhan,satuan);
	}
	else if(ekspresi.Length&gt;2)
	    return interpret(ekspresi);
	else
		throw new ApplicationException(string.Format(&quot;Expression {0} not supported&quot;,ekspresi));
}
</pre>
<p>Bandingkan dengan method <em>createPuluhan</em> sebelumnya, sama bukan? Karena itu bagian kedua dari method ini bisa kita gantikan dengan <em>Number.CreateNewNumber</em>,</p>
<pre class="brush: csharp;">
public IExpression Convert (string ekspresi)
{
	if(ekspresi.Length==1)
		return Number.CreateNewNumber(ekspresi);
	else if (ekspresi.Length == 2)
	{
		return Number.CreateNewNumber(ekspresi);
	}
	else if(ekspresi.Length&gt;2)
	    return interpret(ekspresi);
	else
		throw new ApplicationException(string.Format(&quot;Expression {0} not supported&quot;,ekspresi));
}
</pre>
<p>Sehingga bagian 1 dan bagian 2 sama persis.</p>
<p>Test saya jalankan. Tidak ada yang berubah. Tadinya saya ingin merefactor bagian 1 dan 2 menjadi satu bagian saja, tapi saya melihat ada kemungkinan untuk melenyapkan semuanya menjadi interpret saja. Sebab, bagian eksepsi itu sudah tidak ada gunanya karena jika lebih besar dari 2 semua akan lari kebagian 3 dan tidak akan pernah sampai ke bagian 4.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tddguide.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tddguide.wordpress.com/160/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tddguide.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tddguide.wordpress.com/160/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tddguide.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tddguide.wordpress.com/160/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tddguide.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tddguide.wordpress.com/160/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tddguide.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tddguide.wordpress.com/160/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tddguide.wordpress.com&blog=4695936&post=160&subd=tddguide&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://tddguide.wordpress.com/2008/10/28/studi-kasus-refactoring-createnumber-8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fatur</media:title>
		</media:content>
	</item>
		<item>
		<title>Studi Kasus: Ekspresi Penjumlahan (7)</title>
		<link>http://tddguide.wordpress.com/2008/10/28/studi-kasus-ekspresi-penjumlahan-7/</link>
		<comments>http://tddguide.wordpress.com/2008/10/28/studi-kasus-ekspresi-penjumlahan-7/#comments</comments>
		<pubDate>Tue, 28 Oct 2008 11:31:45 +0000</pubDate>
		<dc:creator>mfathur</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://tddguide.wordpress.com/?p=156</guid>
		<description><![CDATA[Ekspresi Penjumlahan



5+2+4-3+10-2=?

Konversi string 1 ke object Satu.

Konversi string 2 ke object Dua.

Konversi string 3 ke object Tiga.

&#8230;dst sampai Sembilan.

Object puluhan

Value dalam komposisi puluhan

Object ratusan

Object penjumlahan

Eksepsi jika tidak ada ekspresi yang bersesuaian



Ekspresi penjumlahan adalah “+”. Ekspresi ini merupakan komposisi dua ekspresi, satu sebagai tambahan dan yang satu sebagai yang ditambah, yang bisa kita nyatakan sebagai:”x + [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tddguide.wordpress.com&blog=4695936&post=156&subd=tddguide&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>Ekspresi Penjumlahan</strong></p>
<table width="400" border="1" cellspacing="0" cellpadding="0">
<tr>
<td>
<p>5+2+4-3+10-2=?
<p>
<span style="text-decoration:line-through;">Konversi string 1 ke object Satu.</span>
<p>
<span style="text-decoration:line-through;">Konversi string 2 ke object Dua.</span>
<p>
<span style="text-decoration:line-through;">Konversi string 3 ke object Tiga.</span>
<p>
<span style="text-decoration:line-through;">&#8230;dst sampai Sembilan.</span>
<p>
<span style="text-decoration:line-through;">Object puluhan</span>
<p>
<span style="text-decoration:line-through;">Value dalam komposisi puluhan</span>
<p>
Object ratusan
<p>
<strong>Object penjumlahan</strong>
<p>
Eksepsi jika tidak ada ekspresi yang bersesuaian
</td>
</tr>
</table>
<p>Ekspresi penjumlahan adalah “+”. Ekspresi ini merupakan komposisi dua ekspresi, satu sebagai tambahan dan yang satu sebagai yang ditambah, yang bisa kita nyatakan sebagai:”x + y”.</p>
<p>Sebelum kita membuat konversi ekspresi penjumlahan, kita harus membuat komposisi penjumlahan. Komposisi ini saya sebut sebagai komposisi <em>Plus</em>.</p>
<p>Berikut ini adalah test untuk komposisi <em>Plus</em>,</p>
<pre class="brush: csharp;">
[Test]
public void KomposisiPlus()
{
	IExpression puluhan=Number.CreateNewNumber(&quot;2&quot;);
	IExpression satuan=Number.CreateNewNumber(&quot;0&quot;);
	IExpression asal=new Puluhan(puluhan,satuan);
	IExpression tambahan=Number.CreateNewNumber(&quot;0&quot;);
	IExpression plus=new Plus(asal, tambahan);
	Assert.AreEqual(&quot;20 + 0&quot;,plus.Expression);
	Assert.AreEqual(20,plus.Value);
}
</pre>
<p>Komposisi ini terbuat dari 20 dan 0 yang masing-masing dinyatakan dengan komposisi Puluhan dan Number 0. Komposisi puluhan terbuat dari Numer 2 dan Number 0. Kesemuanya adalah ekspresi.</p>
<p>Agar test bisa berjalan kita harus membuat class <em>Plus</em>,</p>
<pre class="brush: csharp;">
public class Plus:IExpression
{
	private IExpression m_asal;
	private IExpression m_tambahan;
	public Plus(IExpression asal, IExpression tambahan)
	{
		this.m_asal= asal;
		this.m_tambahan = tambahan;
	}
	public string Expression {
		get {
			return &quot;&quot;;
		}
	}
	public object Value {
		get {
			return 0;
		}
	}
}
</pre>
<p>Konstruktor dari class <em>Plus</em> berparameter dua buah ekspresi number, yang satu sebagai nilai awal dan yang kedua sebagai nilai tambah. Test diatas masih memberi keluaran red. Namun demikian implementasi keduanya adalah sangat jelas. Untuk property Expres<em></em>sion kita cukup menggabungkan ekspresi pembentuknya dan untuk <em>Value</em> kita juga cukup menjumlahkan kedua value dari ekspresi pembentuknya.</p>
<pre class="brush: csharp;">
public class Plus:IExpression
{ 

	public string Expression {
		get {
			return String.Format(&quot;{0} + {1}&quot;,this.m_asal.Expression,this.m_tambahan.Expression);
		}
	}
	public object Value {
		get {
			return (int)this.m_asal.Value + (int)this.m_tambahan.Value;
		}
	}
}
</pre>
<p>Implementasi sederhana yang cukup membuat test kita menjadi green.</p>
<p>Sekarang kita buat konversi ekspresi plus. Berikut ini adalah test konversi “1 + 1” ke object Plus.</p>
<pre class="brush: csharp;">
[Test]
public void Ekspresiplus(){
	string input=&quot;1 + 1&quot;;
	IExpressionConverter exConverter=new ExpressionConverter();
	IExpression ex=exConverter.Convert(input);
	Assert.AreEqual(&quot;1 + 1&quot;,ex.Expression);
	Assert.AreEqual(2,ex.Value);
}
</pre>
<p>Jika test kita jalankan, kita akan menetapkan pesan bahwa ekspresi “1 + 1” tidak disupport. Jadi, apa yang akan kita lakukan? Tidak ada implementasi yang jelas yang langsung bisa kita implementasikan.</p>
<p>Saya punya usul. Ekspresi ini kita pecah-pecah menurut komponennya, ada 3 komponen. Ekspresi 1, komposisi Plus dan ekspresi 1. Ekspresi 1 + 1, kita masukkan dulu kedalam array, kemudian kita baca baris demi baris, jika ketemu 1 buat ekspresi 1 dan jika ketemu + buat ekspresi plus.</p>
<p>Kita berikan implementasi konstant dulu,</p>
<pre class="brush: csharp;">
public IExpression Convert (string ekspresi)
{
	if(ekspresi.Length==1)
		return Number.CreateNewNumber(ekspresi);
	else if (ekspresi.Length == 2)
	{
		char[] exs=ekspresi.ToCharArray();
		IExpression puluhan=Number.CreateNewNumber(exs[0].ToString());
		IExpression satuan=Number.CreateNewNumber(exs[1].ToString());
		return new Puluhan(puluhan,satuan);
	}
	else if(ekspresi.Equals(&quot;1 + 1&quot;))
	    return Number.CreateNewNumber(&quot;1&quot;) ;
	else
		throw new ApplicationException(string.Format(&quot;Expression {0} not supported&quot;,ekspresi));
}
</pre>
<p>Perhatikan statement “else if(ekspresi.Equals(&#8220;1 + 1&#8243;)) ”, saya berikan implementasi konstan disini. Dan ini langsung menimbulkan duplikasi data, didalam test dan didalam program.</p>
<p>Agar test ini menjadi green, cara termudah adalah dengan memberikan impelemantasi Plus,</p>
<pre class="brush: csharp;">
public IExpression Convert (string ekspresi)
{
	if(ekspresi.Length==1)
		return Number.CreateNewNumber(ekspresi);
	else if (ekspresi.Length == 2)
	{
		char[] exs=ekspresi.ToCharArray();
		IExpression puluhan=Number.CreateNewNumber(exs[0].ToString());
		IExpression satuan=Number.CreateNewNumber(exs[1].ToString());
		return new Puluhan(puluhan,satuan);
	}
	else if(ekspresi.Equals(&quot;1 + 1&quot;))
	    return new Plus(Number.CreateNewNumber(&quot;1&quot;),Number.CreateNewNumber(&quot;1&quot;));
	else
		throw new ApplicationException(string.Format(&quot;Expression {0} not supported&quot;,ekspresi));
}
</pre>
<p>Test kita sudah green. Langkah berikutnya kita harus bisa menghilangkan duplikasi. Kita pindahkan terlebih daulu new Plus() ke dalam method baru katakanlah method interpret.</p>
<pre class="brush: csharp;">
	else if(ekspresi.Equals(&quot;1 + 1&quot;))
			    return interpret(ekspresi);
</pre>
<p>dan method interprete,</p>
<pre class="brush: csharp;">
private IExpression interpret(string ekspresi)
{
	return new Plus(Number.CreateNewNumber(&quot;1&quot;),Number.CreateNewNumber(&quot;1&quot;));
}
</pre>
<p>kita tidak akan membatasi seberapa panjang ekspresi yang masuk, maka kita ubah jika panjang ekspresi lebih dari 2 eksekusi interpret,</p>
<pre class="brush: csharp;">
public IExpression Convert (string ekspresi)
{
	if(ekspresi.Length==1)
		return Number.CreateNewNumber(ekspresi);
	else if (ekspresi.Length == 2)
	{
		char[] exs=ekspresi.ToCharArray();
		IExpression puluhan=Number.CreateNewNumber(exs[0].ToString());
		IExpression satuan=Number.CreateNewNumber(exs[1].ToString());
		return new Puluhan(puluhan,satuan);
	}
	else if(ekspresi.Length&gt;2)
	    return interpret(ekspresi);
	else
		throw new ApplicationException(string.Format(&quot;Expression {0} not supported&quot;,ekspresi));
}
</pre>
<p>Test tetap green.</p>
<p>Sekarang kita siap mengoprek interpret. Seperti ide kita semula, kita buat ekspresi masing-masing,</p>
<pre class="brush: csharp;">
private IExpression interpret(string ekspresi)
{
	IExpression exp1=getExp1(ekspresi);
	IExpression exp2=getExp2(ekspresi);
	return getOperator(ekspresi,exp1,exp2);
}
</pre>
<p>Method getExp1 ditujukan untuk mengambil ekpresi pertama dari penjumlahan. Kemudian getExp2 ditujukan untuk menngambil ekspresi kedua penyusun penjumlahan. Sedangkan getOperator, diguanakan untuk mendapatkan operator apa, kebetulan saat ini penjumlahan.</p>
<p>Method getExp1,</p>
<pre class="brush: csharp;">
private IExpression getExp1(string exs)
{
	string[] splitedStr=exs.Split('+');
	string number= splitedStr[0].Trim();
	return Number.CreateNewNumber(number);
}
</pre>
<p>Pertama-tama string ekspresi kita split berdasarkan karakter +, sementara kita abaikan kemungkinan operator lain. Hasil dari split ini adalah array string, str[0] =”1” dan str[2]=”1”. Dengan demikian ekspresi pertama adalah str[0]. Untuk menghilangkan white space kita panggil trim. Kemudian kita panggil Number.</p>
<p>Method getExp2,</p>
<pre class="brush: csharp;">
private IExpression getExp2(string exs)
{
	string[] splitedStr=exs.Split('+');
	string number= splitedStr[1].Trim();
	return Number.CreateNewNumber(number);
}
</pre>
<p>Tidak berbeda dari getExp1, kecuali pada saat mengambil array. Disini kita ambil array yang ke dua. Ini kandidat untuk bisa kita satukan.</p>
<p>Dan getOperator,</p>
<pre class="brush: csharp;">
private IExpression getOperator(string ekspresi,IExpression exp1, IExpression exp2)
{
	string afterExp1=ekspresi.Substring(exp1.Expression.Length).Trim();
	string opr=afterExp1.Substring(0,1);
	if(opr.Equals(&quot;+&quot;)){
		return new Plus(exp1,exp2);
	}else
		throw new ApplicationException(String.Format(&quot;Expression {0} not operator&quot;,opr));
}
</pre>
<p>Logikanya adalah kita ambil substring yang dimulai dari karakter setelah ekspresi pertama. Jadi untuk 1 + 1, substringnya adalah + 1. Setelah itu kita ambil karakter pertama dari substring. Kemudian kita uji karakter itu + atau bukan. Jika plus buat ekspresi plus, jika bukan keluarkan eksepsi.</p>
<p>Dengan cara ini test sudah green. Karena getExp1 dan getExp2 modelnya sama kita bisa satukan, yaitu dengan memanggil getExp. Sufix 1 dan 2 kita pertahankan. Penting sebagai tanda bahwa komposisi kita kesemuanya membutuhkan ekspresi 1 dan ekspresi 2.</p>
<pre class="brush: csharp;">
private IExpression getExp(int oprNumber,string exs)
{
	string[] splitedStr=exs.Split('+');
	if(splitedStr.Length &lt;=oprNumber)
		return Number.CreateNewNumber(&quot;0&quot;);
	string number= splitedStr[oprNumber].Trim();
	return Number.CreateNewNumber(number);
}
</pre>
<p>Jika operator number yang kita inginkan ternyata lebih besar dari array yang ada kita return number &#8216;0&#8242;.</p>
<p>Dan getExp1 dan getExp2 berubah menjadi,</p>
<pre class="brush: csharp;">
private IExpression getExp1(string exs)
{
	return getExp(0,exs);
}
private IExpression getExp2(string exs)
{
	return getExp(1,exs);
}
</pre>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tddguide.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tddguide.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tddguide.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tddguide.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tddguide.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tddguide.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tddguide.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tddguide.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tddguide.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tddguide.wordpress.com/156/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tddguide.wordpress.com&blog=4695936&post=156&subd=tddguide&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://tddguide.wordpress.com/2008/10/28/studi-kasus-ekspresi-penjumlahan-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fatur</media:title>
		</media:content>
	</item>
	</channel>
</rss>