Home > Domain Driven Design > Specification

Specification

coba lihat code berikut

public class Customer {
	...
	public bool IsPreferredCustomer {
		get {
			return (this.TotalSales > 10000 || this.TotalVisits > 50) || 
					(this.TotalSales > 5000 && this.TotalVisits > 25); 
		}
	}
}

nah pengecekan terhadap customer langsung merupakan attribute dari customer sendiri. jadi property tersebut mendeskripsikan apakah si customer tersebut memenuhi kriteria bahwa attribute2nya memenuhi syarat2 yg ditentukan. apa syaratnya ?? TotalSalesnya lebih besar dari 5000 bla bla …

cara lainnya adalah dengan menggunakan Specification Pattern

public class IsAPrefferedCustomer() : Specification<Customer> {
	public bool Matches(Customer customer) {
		if (customer == null) return false;
		return customer != null && (customer.TotalSales > 10000 || 
			customer.TotalVisits > 50) || (customer.TotalSales > 5000 && 
			customer.TotalVisits > 25);
	}
}

mana yg lebih bagus ??

Perbedaan nya adalah bagaimana kita melihat dari sudut pandang Ubiquitous Language. Jika kita menempatkannya sebagai property dari Customer. Maka ga bakalan kelihatan apa yg dilakukan. Apakah ada kalkulasi atau hanya passing nilai dari instance variablenya atau value dari entitnya saja. Karena dari luar hanya kelhatan seperti attribute dari Customer.

Nah Spesification adalah constraint. jadi fungsinya jelas adalah sebagai pembatasan. Kalau attribute entity kan ga jelas dia itu hanya nilai saja atau constraint. tidak explicit. Yang dibutuhkan adalah kejelasan.

Bisa saja terjadi code explotion jika kita tetap memaksa meletakkannya sebagai attribute. Semakin lama attribute akan semakin bertambah.

Jangan gunakan attribute untuk mengexpose constraint. Gunakan Spesification Pattern. Spesification Pattern bagus digunakan untuk memodelkan constraint pada domain. Dan jika kita menggunakan attribute sebagai constraint juga akan sulit jika akan merefactornya dikemudian. Karena kita langsung mengakses state dari object tersebut.

Gunakan Spesification karena itu membuatnya lebih explicit.

  1. No comments yet.
  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: