Bagian 15. Blender

$5 + Rp 81.000=$ 14 jika $1=Rp 9000

Rp 10 + Rp 10=Rp 20

Perkalian uang dengan bilangan, sudah. Penjumlahan uang yang sama mata uangnya juga sudah. Sekarang kita ingin menjumlahkan dua uang dengan mata uang berbeda. Berapa rupiah penjumlahan 5 dollar dengan 10 rupiah. Tentu saja tergantung berapa kurs rupiah terhadap dollar. Untungnya kita juga telah menyelesaikan kasus jika dalam menjumlahkan itu kurs berperan. Untuk membuktikan itu kita terlebih dahulu harus membuat test. Berikut ini adalah sebuah contoh test yang berusaha menjumlahkan dua mata uang, dollar dan rupiah.

[Test]
public void MixAddition(){
	Money limaDollar=Money.US(5);
	Money delapanSatuRibuRupiah=Money.Rp(81000);
	IEkspression sum=limaDollar.Plus(delapanSatuRibuRupiah);
	Bank bank=new Bank();
	bank.AddRate("Rp","US",9000);
	Money hasilTukar=bank.Tukar(sum,"US");
	Assert.AreEqual(Money.US(14),hasilTukar);
}

Ternyata hasilnya tidak benar. Seharusnya US 14, hasilnya malah US 81.005. Darimana datangnya US 81.005? Hasilnya adalah penjumlahan dua amount kemudian matauang ditaruh bergitu saja tidak peduli perlu dikonversi atau tidak.

Pertama bank memanggil method Tukar() dari ekspresi, Sum. Ekspresi Sum ternyata tidak memperhitungkan kurs. Karena Sum adalah penjumlahan dua class Money, maka cukup kita ganti saja dengan memanggil tukar dari Money, baru kemudian kita jumlahkan.

public class Sum:IEkspression{
	...
	public Money Tukar(Bank bank,string ke){
		int amount=this.Tertambah.Amount+this.Penambah.Amount;
		return new Money(amount,ke);
	}
}

kita ubah menjadi,

public class Sum:IEkspression{
	...
	public Money Tukar(Bank bank,string ke){
		int amount=this.Tertambah.Tukar(bank,ke).Amount
			+ this.Penambah.Tukar(bank,ke).Amount;
		return new Money(amount,ke);
	}
}

Test kembali green. Sekarang kita ubah semua yang semestinya IEkspression dan sekarang masih Money. Pertama, field di Sum bisa kita ubah menjadi IEkspression,

public class Sum:IEkspression{
	private IEkspression m_tertambah;
	private IEkspression m_penambah;
	...
}

Kedua, konstruktor juga kita ubah,

public class Sum:IEkspression{
	...
	public Sum(IEkspression tertambah, IEkspression penambah){
		this.m_penambah=penambah;
		this.m_tertambah=tertambah;
}

Ketiga, property

public class Sum:IEkspression{
	...
	public IEkspression Penambah{
		get {
			return this.m_penambah;
		}
	}
	public IEkspression Tertambah{
		get {
			return this.m_tertambah;
		}
	}
}

Demikian juga dengan class Money. Pertama, argument Plus() bisa kita ubah ke bentuk IEkspression,

public  class Money:IEkspression{
	public IEkspression Plus(IEkspression addend){
		return new Sum(this,addend);
	}
}

Kedua, output method Times() bisa berupa IEkspression,

public  class Money:IEkspression{
	public IEkspression Times(int multiplier){
		return new Money(this.m_amount *multiplier, m_currency);;
	}
}

Kemudian di test juga kita ubah,

[Test]
		public void MixAddition(){
			Money limaDollar=Money.US(5);
			IEkspression delapanSatuRibuRupiah=Money.Rp(81000);
			IEkspression sum=limaDollar.Plus(delapanSatuRibuRupiah);
			Bank bank=new Bank();
			bank.AddRate("Rp","US",9000);
			Money hasilTukar=bank.Tukar(sum,"US");
			Assert.AreEqual(Money.US(14),hasilTukar); 

		}

Hanya yang delapanSatuRibuRupiah yang bisa kita ubah, limaDollar belum bisa, karena IEkspression tidak memiliki method Plus(). Agar limaDollar bisa kita ubah ke bentuk IEkspression, maka kita harus menaikkan Plus() ke IEkspression.

public interface IEkspression{
		Money Tukar(Bank bank,string ke);
		IEkspression Plus(IEkspression addend);
	}

Ini mengakibatkan Sum juga harus mengimlementasikan Plus(),

public class Sum:IEkspression{
	...
	public IEkspression Plus(IEkspression addend){
		return null;
	}
}

Untuk sementara kita berikan stub (return null). Nah, sekarang limaDollar bisa kita nyatakan dalam bentuk IEkspression,

[Test]
public void MixAddition(){
	IEkspression limaDollar=Money.US(5);
	IEkspression delapanSatuRibuRupiah=Money.Rp(81000);
	IEkspression sum=limaDollar.Plus(delapanSatuRibuRupiah);
	Bank bank=new Bank();
	bank.AddRate("Rp","US",9000);
	Money hasilTukar=bank.Tukar(sum,"US");
	Assert.AreEqual(Money.US(14),hasilTukar);
}

Ok. Semua test telah berjalan. Sekarang kita bisa coret. Sayangnya kita masih memiliki 3 task lagi yang harus kita selesaikan. Kita akan selesaikan ini dibagian selanjutnya.

$5 + Rp 10=Rp 45.010 jika $1=Rp 9000

Rp 10 + Rp 10=Rp 20

Kembalian Money untuk penjumlahan Rp 10 + Rp 10

Sum.Plus()

IEkspression.Times()

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: