Saturday, May 23, 2009

Command Query Separation

Aku agak lama juga untuk memahami idea CQS in dalam bentuk SOA. Ok sebelum itu, mungkin ada yang tak clear apa itu CQS.

Ini berdasarkan Wiki:

Command-query separation (CQS) is a principle of imperative computer programming. It was devised by Bertrand Meyer as part of his pioneering work on the Eiffel programming language.

It states that every method should either be a command that performs an action, or a query that returns data to the caller, but not both. In other words, asking a question should not change the answer. More formally, methods should return a value only if they are referentially transparent and hence possess no side effects.

Jadi CQS ini pada mulanya hanya principle yang diguna pakai dalam programming language sebagai guideline iaitu sesuatu method/function itu hanya boleh melakukan specific kerja samaada command atau query dan tidak boleh buat kedua-dua sekali. Principle ini ada kaitan juga jika dilihat kepada Single Responsibility Principle cuma SRP bercerita tentang class manakala CQS bercerita tentang function dan method.

Contoh code yang break CQS ialah apabila kita bagi arahan supaya melakukan tambahan item kedalam box/container dan kemudian dengan function yang sama kita minta method/function tersebut retun value berapa item dah ditambah dalam box/container tersebut.. Jika ada code kita yang ditulis sebegitu maka mengikut rule CQS adalah salah."Tell vs Ask", bagi tahu object untuk buat apa atau minta object untuk pulangkan value.

Ok , itu apa sebenarnya tersurat , cuma ada beberapa SOA expert yang memperluaskan konsep CQS ini kedalam architecture design system. Aku ambil masa yang lama nak feel CQS dan kegunaan dalam SOA, nak tahu sebab dan kelebihan apabila apply CQS dalam SOA enviroment design.

Tidak habis disitu apabiila CQS hendak diguna pakai dalam SOA, keluar lagi satu term iaitu Messaging dalam CQS.Aku pun ambil masa beberapa hari juga hantar message dalam forum tanya soalan-soalan tentang CQS dan SOA. Aku ada hantar satu example minta dia orang comment cara pemahaman aku tentang CQS tapi totally apa yang aku buat tu salah..start dari itu kefahaman aku makin bertambah sedikit.

Lagi satu point yang cuba dibawa ialah reporting function bukan sebenarnya tanggungjawab didalam domain, bagaimana untuk paging,sorting,orderby perlu diletak dibawah penguasaan context yang berlainan dari context domain. Jadi bagi orang-orang ini apabila berhadapan dengan domain context apa yang mereka fokuskan ialah "read type domain object" dalam ertikata mudah Create,Update,Delete (CUD). Manakala reporting context hanya ada Read (R).
Reporting disini ialah bagaimana untuk display data pada client di presentation layer.

0 comments: