Studi Kasus: Refactoring CreateNumber (8)

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.

…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, tetap dibuat seperti biasa. Jika panjangnya 2, panggil method pembuat puluhan,

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("Expression {0} not supported",ekspresi)); 
	 
}

Disini createSingleNumber adalah method yang menanggil kode sebelumnya—jadi saya pindahkan agar enak dilihat. Sedangkan createPuluhan adalah method yang akan kita gunakan untuk membuat Puluhan. Isi dari method ini sebetulnya hanya mencontek yang ada di mehod Convert untuk kondisi ekspresi dengan panjang 2. Ini merupakan kandidat untuk kita refaktor nantinya karena muncul duplikasi, sementara kita catat dulu.

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); 
}

Test saya jalankan. Satu test break: FactoryNumberException. Ini muncul karena method CreateNewNumber yang tadinya tidak bisa menerima puluhan sekarang bisa. Sehingga agar green kembali, eksepsinya saya ganti menjadi ratusan.

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

Test saya jalankan. Semuanya green.

Berikutnya kita ubah sedikit method Convert. Perhatikan code berikut 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 if(ekspresi.Length>2) 
	    return interpret(ekspresi); 
	else 
		throw new ApplicationException(string.Format("Expression {0} not supported",ekspresi)); 
}

Bandingkan dengan method createPuluhan sebelumnya, sama bukan? Karena itu bagian kedua dari method ini bisa kita gantikan dengan Number.CreateNewNumber,

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>2) 
	    return interpret(ekspresi); 
	else 
		throw new ApplicationException(string.Format("Expression {0} not supported",ekspresi)); 
}

Sehingga bagian 1 dan bagian 2 sama persis.

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.

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: