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