Bagian 3. Value Object

Ketika berbicara mengenai uang, kita tidak akan lepas dari bentuk pecahan uang. Negara kita ini mengeluarkan banyak sekali pecahan-pecahan uang. Paling kecil sekarang 25 Rupiah, dulu semasa saya kecil pecahan terkecil 5 rupiah, kelak mungkin bisa 1000 rupiah.

Kalau kita memiliki uang 1000 rupiah, wujud dari uang itu bisa selembar seribuan atau 10 uang ratusan. Pecahan-pecahan ini tidak pernah berubah nilainya dari saat mulai dicetak sampai dimusnahkan atau hilang.

Dalam OOP, object yang mempunyai sifat tidak pernah berubah disebut sebagai Value Object. Uang adalah salah satunya. Karena itu kita harus tambahkan “uang sebagai value object” ke dalam todo-list.

Untuk membuat value object dalam C#/Mono, kita harus mendefinisikan sebuah class yang datanya hanya bisa diset pada saat konstruksi object. Setelah object dibuat tidak ada lagi aksesor yang bisa melakukan set terhadap data. Selain itu semua operasi yang punya kembalian harus mengembalikan object baru. Dengan cara ini uang 1000 selamanya akan tetap 1000.

Namun demikian komputer masih akan memperlakukan dua object 1000 sebagai uang yang berbeda, sebelum kita mengoverride method Equals() dan GetHashCode(), komputer akan menggunakan object reference untuk perbandingan, sehingga dua object uang 1000 akan dianggap sebagai uang yang berbeda. Equals dipakain untuk membandingkan dengan object lain sedangkan GetHashCode dipakai oleh hash table untuk memastikan keunikan object didalam tabel.

$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()

Untuk menguji apakah Rp 10=Rp 10, kita buat test berikut ini:

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

Jika test ini kita jalankan, kita akan mendapatkan pesan kesalahan yang menyatakan kalau kedua object ini tidak sama.

Implementasi langsung (boongan) agar test ini berjalan adalah dengan mereturn nilai true di method Equals.

public class Rupiah{
	...
	public override bool Equals(object obj){
		return true;
	}
}

Dengan implemantasi ini test kita berjalan sukses. Sayangnya kita tidak melakukan perbandingan apa-apa kecuali mereturn nilai true. Tentu ini tidak benar. Tetapi kita tidak tahu dimana ketidak benaranya. Karena itu kent beck kemudian memperkenalkan cara ketiga untuk mendrive kita agar bisa melakukan refactoring yaitu: Triangulation. [note: cara 1, implementasi bohongan. Cara 2, implementasi sungguhan yang sudah jelas dan kecil].

Apa itu triangulation? Pernah belajar geometri? Hukum phitagoras? Saya tidak akan bahas geometri disini he he he. Intinya untuk sebuah segitiga yang kedua panjang sisinya diketahui maka panjang sisi yang lainnya dapat dihitung.

Kita akan menggunkan analogi ini untuk mendrive implementasi kita. Jadi paling tidak kita membutuhkan dua contoh agar implementasi kita benar. Yang pertama dan sudah kita coba adalah Rp 10==Rp 10. Kita membutuhkan contoh yang kedua, tentu saja yang berbeda, Rp 10 != Rp 5.

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

Nah, dengan contoh kedua ini test kita kembali gagal (red). Kini saatnya kita membuat implementasi yang bisa memenuhi kedua contoh ini.

public class Rupiah{
	...
	public override bool Equals(object obj){
		Rupiah rupiah=(Rupiah)obj;
		return this.m_amount==rupiah.Amount;
	}
}

Pertama kita harus casting obj terkirim terlebih dahulu ke tipe rupiah. Setelah itu kita bandingkan amount kedua object. Test saya jalankan dan sukses. Kita boleh mencoret test Equals().

$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()

Kapan tepatnya kita menggunkan Triangulation? Kent menyarankan untuk menggunakan ketika cara 1 dan 2 tidak bisa lagi digunakan. Sebab ini akan menimbulkan double test. Namun demikian sesungguhnya kita sedang melihat satu permasalahan melalui dua kaca mata. Ini sama dengan cerita tentang 4 orang buat dan seekor gajah. Ketika 4 orang buta menyentuh gajah pada bagian yang berbeda, ketika penggambaran tentang gajah dari keempat orang itu digabungkan kita akan mendapatkan gambaran sesungguhnya dari gajah—walaupun mungkin tidak tepat, tetapi paling tidak sudah mendekati kebenaran.

Ok. Kita telah mengimplentasikan Equality. Tetapi jika implementasinya seperti itu, bagaimana jika object yang terkirim bukan uang? Atau bagaimana jika objek yang terkirim itu nilainya Null?

Oh, ya Tuhan! Ada yang tertinggal. Tidak usah kaget, ini biasa dalam TDD. Masukkan dulu ke dalam list.

$5 + Rp 10=Rp 9.010 jika $1=Rp 9000
Rp 10 * 2 = Rp 20
Efekperkalian terhadap object?
Amount harus private?
Pembulatan uang?
Equals()
GetHashCode()
Jenis object?
Null?
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: