ICE編程中的 Nonmutating 和 Idempotent

Nonmutating 操作

 

    有一些操作,例如上面代碼中的getTime操作,這個操作不會修改所操作的對象的值。它們在概念上等效於C plus plus的const 成員函數。你可以如下的指出這樣的操作:

 

        interface Clock
        {
                nonmutating TimeOfDay getTime();
                void setTime(TimeOfDay time);
        };

    nonmutating關鍵字指出了getTime操作不會修改它所操作的對象的狀態。這樣使用有兩個原因:

 

  • 語言映射可以關於操作行爲的附加知識的好處。例如:對於C plus plus來說,nonmutating操作映射到const成員函數。
  • 當得知一個操作不會修改對象的狀態,則允許Ice運行時更積極的進行錯誤恢復。特別的,Ice會保證操作調用的最多一次語義。

    對於普通的操作,Ice運行時對於如何處理錯誤是保守的。例如,如果一個客戶端發送一個操作調用到服務器,然後丟失了連接,對於客戶端的 Ice運行時來說,沒有辦法知道調用是否成功。這就意味着,運行時不能通過嘗試重新連接和再次發送請求來恢復錯誤,因爲這可能第二次引發操作以及違背了最多一次語義。運行時沒有選擇,只能把錯誤報告給應用。對於nonmutating操作,換句話說,客戶端的運行時可以嘗試再次連接和安全的二次送出失敗的請求。如果第二次發送能夠到達服務器,那麼萬事OK。只有第二次再次失敗,錯誤纔會報告給應用(錯誤重試的次數可以在Ice的配置文件中配置)。

 

    Idempotent操作

 

    我們可以更進一步去修改上面的Clock接口的定義,從而可以讓setTime操作是idempotent的:

 

        interface Clock
        {
                nonmutating TimeOfDay getTime();
                idempotent void setTime(TimeOfDay time);
        };

    對某一個操作進行兩次成功的操作,其結果都一樣,就像只調用了一次一樣,那麼這個操作就是idempotent操作。例如,x = 1; 是一個idempotent操作因爲不管執行了一次還是兩次,x的值都是1。換句話說,x += 1;就不是一個idempotent操作,因爲它執行了兩次後,結果不同了。

 

    idempotent關鍵字指出了一個操作能夠安全的執行多次。同nonmutating操作一樣,Ice運行時使用idempotent來達到更積極地錯誤恢復。

 

    一個操作只能是nonmutating或idempotent,不能兩個都是。(nonmutating隱含了idempotent)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章