Value Object (Part 2)
Sekedar mengulang saja. Value object tidak memiliki identity. Jadi dia hanya dibandingkan berdasarkan kesamaan nilai saja. contonya untuk membandingkan dua alamat yg sama kita akan membandingkan equality antar komponen2 pembentuk address (street, city, state). Kita lihat contoh berikut.
Kita mungkin akan membuat interface value object seperti ini
public interface ValueObject<T> { /** * Value objects dibandingkan berdasarkan nilai dari attributenya dan tidak memiliki identity * * @param other The other value object. * @return <code>true</code> if the given value object's and this value object's attributes are the same. */ boolean sameValueAs(T other); }
dan contoh concrete dari value object adalah seperti berikut untuk address
public class Address : ValueObject<Address> { private string m_street; private string m_city; private string m_state; // constructor dan propertie dsb // dapat diletakkan di sini @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Address other = (Address) o; return sameValueAs(other); } @Override public int hashCode() { return m_street.hashCode() + m_city.hashCode(); } public boolean sameValueAs(Address other) { return other != null && this.m_street.equals(other.m_street) && this.m_city.equals(other.m_city) && this.m_state.equals(other.m_state); } }
yaks.. syntaxnya ga usah dipermasalahkan ya . hehehe .. c#+java tuh .. wkwkwkw. Konsepnya yg penting. Tul ga .. mw pake bahasa apapun ntar ga masalah.
Trus yg penting lagi yg perlu dicermati adalah bahwa value object tersebut diharapkan bersifat imutable. Jadi sekali dicreate tidak bisa diubah valuenya. Kita dapat membuatnya dengan cara membuat semua fieldnya readonly atau final. Tidak membuat setter. Cukup hanya getter saja. Dan segala operasi yg dilakukan terhadap object tersebut tidak boleh mengubah state object tersebut. kita lihat contoh berikut ..
public class Money { public readonly Currency Currency; public readonly decimal Amount; public Money(decimal amount, Currency currency) { Amount = amount; Currency = currency; } public Money AddFunds(Money fundsToAdd) { var exchange = ServiceLocator.Find<IMoneyExchange>(); var normalizedMoney = exchange.CurrentValueFor(fundsToAdd, this.Currency); var newAmount = this.Amount + normalizedMoney.Amount; return new Money(newAmount, this.Currency); // kita mereturn object yg baru ... dan tidak mengubah state dari object current . } } public enum Currency { USD, GBP, EUR, JPY }
prinsipnya sama seperti String. jadi setiap ada operasi yg mengubah dia. DIa mengembalikan object lain. Dan tidak merubah statenya.
Dengan demikian jika mw dishare antar dua object juga ga masalah. Bebas efek samping. Hahaha. maksudnya ?? side-free-efect.maksudnya jika kita memanggil method si object ga ada efeknya terhadap si object tersebut. ga digangu gugatlah kehidupannya.
Kebanyakan kata: “maksudnya” tuh ha ha ha. C# bisa annotaion ya will…sori orang kuno ha ha ha. Di tunggu bagian ke 3-nya.
hahahaha .. ga sadar pak … saya juga skalian menjelaskan sama diri sendiri …
kan udh dibilang pak di atas
c#+java
language is just a tools .. hehehehe