Studi Kasus: Ekspresi Puluhan(5)

Ekspresi Puluhan

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

Konversi string 1 ke object Satu.

Konversi string 2 ke object Dua.

Konversi string 3 ke object Tiga.

…dst sampai Sembilan.

Object puluhan

Object ratusan

Object penjumlahan

Eksepsi jika tidak ada ekspresi yang bersesuaian

Task kita berikutnya adalah mengubah puluhan dan ratusan dari yang tadinya string menjadi komposisi Number dan Puluhan. Dan berikut ini adalah test kita,

[Test] 
public void Konversi20KeKomposisiPuluhan() 
{ 
	string input="20"; 
	IExpressionConverter exConverter=new ExpressionConverter(); 
	Assert.IsInstanceOfType(typeof(IExpression),exConverter.Convert(input)); 
	Assert.AreEqual("20",exConverter.Convert(input).Expression); 
}

Test ini jika kita jalankan, akan terjadi kesalahan karena keluaran dari exConverter adalah ekspresi Null. Darimana datangnya null? Gampang ditebak, ia berasal dari factory number. Sebelum kita mengerjakan test kita diatas, namapknya kita harus membuat test eksepsi terpebih dahulu untuk number. Jadi test kita diatas sementara kita Ignore,

[Test] 
[Ignore] 
public void Konversi20KeKomposisiPuluhan()

Jika test kita jalankan ia akan meninggalkan warna kuning.

Sekarang kita buat test untuk eksepsi,

[Test] 
[ExpectedException(typeof(ApplicationException),"Expression 20 not supported")] 
public void FactoryNumberException() 
{ 
	IExpression ex=Number.CreateNewNumber("20"); 
}

Jadi kita mengharapkan akan terjadi kesalahan jika kita supplay dengan string 20. Dan pesan errornya kita harapkan “Expression 20 not supported”.

Dan implementasinya,

public static IExpression CreateNewNumber(string ekspresi) 
{ 
	switch (ekspresi) { 
	 case "1": 
		return new Number(1); 
	 ... 
	default: 
	throw new ApplicationException(String.Format("Expression {0} not supported",ekspresi)); 
	} 
}

Implementasi yang cukup jelas.

Kembali ke test sebelumnya. Hapus attribute Ignore. Jalankan test. Kita mendapatkan pesan yang sangat jelas daripada pesan sebelumnya : “Object null reference” menjadi “Expression 20 not supported”. Jelas problem kita sekarang ada di method Convert.

Untuk membuat method Convert bisa mengeluarkan puluhan kita harus bisa mengkontruksi komposisi puluhan tidak cukup hanya mengkontruksi number. Untuk itu, kita terpaksa meng-Ignore kembali test, dan membuat test baru untuk Puluhan. Kok seperti main petak umpet ya!? Hi hi hi…

Dan ini adalah test untuk komposisi puluhan,

[Test] 
public void MembuatKomposisiPuluhan() 
{ 
	IExpression dua=Number.CreateNewNumber("2"); 
	IExpression nol=Number.CreateNewNumber("0"); 
		 
	IExpression duaNol=new Puluhan(dua,nol); 
	Assert.AreEqual("20",duaNol.Expression); 
}

Puluhan merupakan implementor IExpression. Di dalam konstruksinya Puluhan menerima dua ekspresi, yang pertama sebagai puluhan dan yang kedua sebagai satuan. Sehingga agar test bisa dikompilasi, class Puluhan saya buat seperti berikut ini,

public class Puluhan:IExpression 
{ 
	private IExpression m_puluhan; 
	private IExpression m_satuan; 
	public Puluhan(IExpression puluhan, IExpression satuan) 
	{ 
		
	} 
	public string Expression{ 
		get{ 
			return “”; 
		} 
	} 
}

Jadi punya dua parameter untuk konstruksi dan property Expression sebagai implementasi dari IExpression.

Test ini akan membuat NUnit merah. Untuk membuat NUnit menjadi hijau kita harus ubah class Puluhan menjadi,

public class Puluhan:IExpression 
{ 
	private IExpression m_puluhan; 
	private IExpression m_satuan; 
	public Puluhan(IExpression puluhan, IExpression satuan) 
	{ 
		this.m_puluhan=puluhan; 
		this.m_satuan=satuan; 
	} 
	public string Expression{ 
		get{ 
			return this.m_puluhan.Expression + this.m_satuan.Expression; 
		} 
	} 
}

Parameter yang disuntikkan lewat konstruktor kita simpan sebagai puluhan dan satuan yang bersifat private. Kemudian kita gabungkan pada saat property Expression dipanggil.

Inilah implementasi sementara untuk Puluhan. Test Green….

Kembali lagi ke test yang kita Ingnore. Hilangkan kembali Ignorenya. Kini kita siap menambahkan komposisi puluhan.

Idenya sederhana saja, tidak usah berfikir komplek dulu lah, kita cek berapa panjang string input yang masuk ke converter. Jika 1, maka cukup CreateNewNumber. Jika 2, maka create Puluhan. Jika lebih dari 2, kita return null saja untuk saat ini.

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 
		return null; 
}

Perhatikan, saya hanya memindahkan test untuk puluhan ke tempat ini. Test Green.

Iklan

There are no comments on this post.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: