Home > Design Pattern > Command-query separation (CQS)

Command-query separation (CQS)

Merupakan principle yg dicetuskan oleh Bertrand mayer. Bahwa setiap method memiliki hanya satu fungsi saja. Kalau tidak sebagai command yg melakukan aksi (biasanya ini untuk ngubah data atau state dari si object). Maka sebagai query untuk mengembalikan data ke si pemanggil. Tapi bukan keduanya. Hanya satu saja. Jadi jika kita ask ke object maka kita tidak boleh mengubah statenya. Method hanya boleh mengembalikan nilai jika tidak ada side effectnya.

Query : mereturn result dan tidak mengubah data yg diobservasi (free side effect)
Command : Mengubah state dari system atau object tanpa mengubah value. Bisa juga disebut dengan modifier.

Jadi dengan CQS kita dapa membuat program lebih simple. Kita dapat menkategorikan method kita. Jadi kita hanya boleh mengubah state dengan command dan menanyakan state via query. Jadi kita dapat mengunakan query dalam berbagai situasi denga PD tanpa takut ada data yg berubah. Megubah letaknya. Tetapi kita harus lebih berhati2 dengan modifiers.

Contoh di java yg menyalahi adalah Iterator. Next adalah mengubah state dan mengembalikan next item dan memajukan cursor dari iteratornya.

Tetapi tetap saja ada pengecualian yaitu untuk stack. Method pop adalah mengambil elemen paling atas dan meremovenya

Ini contoh code yg menyalahi CQS

public class BadCQS {
	private int x;
	
	public int incrementAndReturnX() {
		x++;	// mengubah state dari object -> Command
		return x; // mereturn state dari object -> Query
	}
}

Ini yg taat pada CQS

public class GoodCQS {
	private int x;
	
	// query
	public int value() {
		return x;
	}
	
	// comment
	public void increment() {
		x++;
	}
}

btw katanya cqs ini dibutuhkan untuk SOA. Tapi katanya sih. Aku blum selidikin

Advertisement
Categories: Design Pattern Tags: ,
  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 )

Connecting to %s

%d bloggers like this: