Home > Domain Driven Design > Value Object (Part 2)

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.

  1. February 6, 2009 at 3:16 am

    Kebanyakan kata: “maksudnya” tuh ha ha ha. C# bisa annotaion ya will…sori orang kuno ha ha ha. Di tunggu bagian ke 3-nya.

  2. weltam
    February 6, 2009 at 3:39 am

    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

  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: