Bagian 6. Equality

Ok. Karena kamu tadi yang maksa, sekarang kamu yang pilih mana yang akan kita test terlebih dahulu? Equality.

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

Rp 10 * 2 = Rp 20

Efek perkalian terhadap object?

Amount harus private?

Pembulatan uang?

Equals()

GetHashCode()

Jenis object?

Null?

$10*2=$20

Duplikasi dolar dan rupiah

Equality yang lebih umum

Method Times() yang lebih umum

Caranya? Loh, kok malah saya yang ngajarin Pak? Bukannya bapak tadi yang berjanji untuk ngajarin. Tidak, tidak, biar terkesan komunikatif gitu. Masak saya terus yang ngomong. Alah alasan. Berani ya kamu sama guru. He he he.

Ok. Bagaimana kalau semua yang akan kita umumkan (bukan pengumuman: pemberitahuan atau sama saja?) kita kumpulkan di class baru, katakanlah bernama class Money. Rupiah dan Dollar kita anggap sebagai anak-anak atau turunan atau subclass dari Money.

Saya definisikan class Money,

public class Money{ 

}

Kemudian Rupiah saya anggap turunan dari Money,

public class Rupiah:Money{
		private int m_amount;
		...
}

Coba tebak test kita masih jalan gak setelah perubahan ini? Ngapain main tebak-tebakan jalankan aja. Test kita tetap jalan. Ayo terus….

public class Money{
		protected int m_amount;
}
public class Rupiah:Money{
		...
}

Kita pindahkan saja variabel m_amount dari Rupiah ke Money. Karena Rupiah masih membutuhkan m_amount kita terpaksa membuat aksesornya sebagai protected—agar bisa diakses langsung oleh anak-anaknya.

Apakah test kita tetap jalan? Tetap. Tidak ada yang berubah.

Nah, sekarang kita bersiap mengutak-atik method Equals(). Pertama kita pindahkan method ini ke Money, lalu kita ubah temporary variabel Rupiah menjadi Money.

public class Money{
		protected int m_amount;
		public override bool Equals(object obj){
			Money rupiah=(Money)obj;
			return this.m_amount==rupiah.m_amount;
		}
	}

Kita coba lagi jalankan test. Oh…tetap bisa jalan. Good. Good. Agar lebih komunikatif kata-kata rupiah kita ubah juga menjadi money.

public class Money{
		protected int m_amount;
		public override bool Equals(object obj){
			Money money=(Money)obj;
			return this.m_amount==money.m_amount;
		}
	}

Test saya jalankan, tetap OK juga.

Sekarang kita juga harus menghapus Equality dari Dollar. Sebelum melakukan itu, kita coba tengok terlebih dahulu Equality test kita.

[Test]
public void Equality(){
         Assert.IsTrue(new Rupiah(10).Equals(new Rupiah(10)),"10 rupiah TIDAK sama dengan 10 rupiah");
        Assert.IsFalse(new Rupiah(10).Equals(new Rupiah(5)),"10 rupiah sama dengan 5 rupiah");
}

Sayangnya semua test yang ada hanya terhadap Rupiah. Lah, kemana terhadap Dollar!! Inilah akibat kita melakukan copy dan paste. Dosa langsung terbalas!

Kita sering melakukan refactoring terhadap code yang kurang test seperti ini. Ketika test dijalankan, tidak terjadi apa-apa. Pada saat running sesungguhnya di production, error yang tidak tertest itu muncul. Kemudian kita menyalahkan test, menyalahkan refactoring. Kemudian menganggap refactoring sebagai pekerjaan yang menggelikan bahkan menjijikkan yang patut dihindari.

Tulislah test sebanyak yang kamu butuhkan, jika kamu ingin gigimu tetap bagus. Apa hubungannya dengan gigi? Begini, jika test yang kamu buat tidak cukup, ketika kamu melakukan refactoring dan terjadi kesalahan yang kamu tidak tahu. Test tetap jalan. Tetapi di customer programmu error. Gara-gara itu kamu kemudian dipecat. Trus pacarmu yang cantik itu meninggalkanmu. Kamu stress. Untuk menghilangkan stress, kamu banyak-banyak makan. Trus kamu malas gosok gigi, sebab kamu pikir untuk apa gigi digosok. Tiba-tiba gigimu mulai berlubang. Karena parah dokter gigi pun angkat tangan. Akhirnya dengan terpaksa gigimu diamputasi. Memang enak gak punya gigi. Ompong gitu loh. Biarlah nenek dan kakek saja yang mengalami. Jadi baik-baiklah menulis test.

Kembali ke test. Untungnya testnya begitu mudah, cukup copas dan edit.

[Test]
public void Equality(){
        Assert.IsTrue(new Rupiah(10).Equals(new Rupiah(10)),"10 rupiah TIDAK sama dengan 10 rupiah");
        Assert.IsFalse(new Rupiah(10).Equals(new Rupiah(5)),"10 rupiah sama dengan 5 rupiah");
        Assert.IsTrue(new Dollar(10).Equals(new Dollar(10)),"10 dolar TIDAK sama dengan 10 dolar");
        Assert.IsFalse(new Dollar(10).Equals(new Dollar(5)),"10 dolar sama dengan 5 dolar");
}

Aduh, duplikasi lagi. Lagi-lagi duplikasi. Dosa apalagi ini. Sementara biarkan sajalah nanti kita perbaiki. Kalau sempat.

Test saya jalankan dan OK. Kini kita siap melakukan refactoring terhadap Dollar. Pertama-tama kita buat Dollar sebagai turunan dari Money.

public class Dollar:Money{
		private int m_amount;
		public override bool Equals(object obj){
			Money dollar=(Money)obj;
			return this.m_amount==dollar.m_amount;
		}
		...
	}

Test tetap berjalan normal. Kemudian kita hapus saja field m_amount.

public class Dollar:Money{
		public override bool Equals(object obj){
			Money dollar=(Money)obj;
			return this.m_amount==dollar.m_amount;
		}
                      	...
	}

Test tetap berjalan normal. Sekarang kita hapus Equality dari Dollar.

public class Dollar:Money{
                      	...
}

Test tetap berjalan normal. Coret dari daftar list.

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

Rp 10 * 2 = Rp 20

Efek perkalian terhadap object?

Amount harus private?

Pembulatan uang?

Equals()

GetHashCode()

Jenis object?

Null?

$10*2=$20

Duplikasi dolar dan rupiah

Equality yang lebih umum

Method Times() yang lebih umum

Bedakan dollar dan rupiah

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: