討論一下CQS 命令 查詢 分離 原則

2021-08-29 19:25:41 字數 1435 閱讀 1738

:d 看craig larman的書,

裡面提到的這個原則.

請看下面兩個函式:

// style #1; used in the official solution

public void roll()

public int getfacevalue()

為什麼不是將兩個方法合併, 使roll()方法返回新的facevalue呢? 如下所示:

// style #2; why is this poor?

public int roll()

你可以發現大量使用風格2的**的例子, 但這種方法並不合適, 因為它違反了[b]命令-查詢分離原則(command-query separation principle)[/b]. cqs是針對方法的經典oo設計原則. 該原則指出, 任何方法都可能是如下情況之一:

1. 執行動作(更新,調整...)的命令方法, 這種方法通常具有改變物件狀態等***, 並且是void的.

2. 向呼叫者返回資料的查詢, 這種方法沒有***, 不會永久性的改變任何物件的狀態.

關鍵是, [b]乙個方法不應該同時屬於以上兩種型別[/b].

[color=red]cqs被公認為電腦科學理論中具有價值的原則.[/color] 因為遵守該原則, 你能夠更容易的推測出程式的狀態, 在查詢狀態時不會同時發生變更. 這樣使得設計更便於理解和預見. 例如, 如果一致遵循cqs, 那麼你還知道查詢或者getter方法不會作出任何更改, 而命令也不會有任何返回. 這是個簡單的模式.[color=red] 這通常是要嚴格遵循的[/color], 因為如果突然採用其它方法, 將會產生令人不快的意外, 從而違反了ood中的[color=red] 最小意外[/color](least surprise) 原則.

[color=green][/color]

以上是原文, 昨晚上看書時才看到的, 回想起來以前真的好多次違反這個原則,

但不確定這個原則是否所有情況都適用,

大家怎麼看cqs的, 我本來想找出例外情況的, 但一時還沒想出例子來, 一起討論下吧.

--------------

好像清楚一點了, cqs更像準則, 而不是"原則",

會有例外情況出現的, 比如jdk中:

// fileinputstream

public native int read() throws ioexception;

// vector

public synchronized boolean add(e e)

// hashmap

public v put(k key, v value)

看來學習ood理論不能太死板,呵呵

CQS 命令 查詢分離原則

摘自 uml和模式應用 命令 查詢分離原則 command query separation principle cqs是針對方法的經典oo設計原則.該原則指出,任何方法都可能是如下情況之一 1.執行動作 更新,調整.的命令方法,這種方法通常具有改變物件狀態等 並且是void的.2.向呼叫者返回資料...

討論一下「人像識別」技術

csdn 的首頁有一則尋找專案承接方的資訊 基於攝像頭人像識別互動螢幕保護程式開發 http prj.csdn.net projdetail.aspx?pointid 8334 看到目前承接專案的有9家,有的 來頭 還挺大 中科院自動化研究所 等。其他的大都稱有 視覺識別 人臉識別 活體檢測 模式識...

討論一下關於string的比較

author hzh 2018 9 5 jdk 1.7 public class testaboutstringcompare 討論一下關於string的比較。1.運算子 對於string物件來說,比較的是物件的引用。2.方法equals 判斷兩個字串是否具有相同的字串行。3.方法compareto...