ice 的 Nonmutating 和 Idempotent
from:http://duckweeds.blog.sohu.com/95754129.html
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)
ice 的 Nonmutating 和 Idempotent相关推荐
- The Ice::Current Object
The Ice::Current Object 服务器端Servant骨架方法(skeleton operation)都有一个Ice::Current类型的参数,这个对象定义如下: module Ic ...
- ICE之Slice语言
Slice 语言定义 文档中对于slice的定义 在这里,我们提供Slice语言. Slice(Specification Language for Ice)是一种将对象接口与其实现分离的基本抽象机制 ...
- ICE BOX 配置,使用----第一篇
一 理论部分 (1) 为什么要使用icebox? icebox server代替了通常的server. icebox是为了方便集中管理多个ice服务而建立的. 它通过使用icebox服务器,把ice服 ...
- 英特尔第三代 Ice Lake 发布正面与 AMD EPYC PK,结果令人大跌眼镜!
作者 | 夕颜 出品 | AI科技大本营(ID:rgznai100) 导读:传闻已久的第三代英特尔至强可扩展处理器,终于在北京风光最美的4月份发布了. 北京时间4月7日晚,在著名的网红打卡地,百年老首 ...
- ICE专题:ICE起步
ICE初步 最早开始接触ICE是在2005,3月份,当时一个朋友向另一个正打算研究corba的朋友强烈的推荐了ICE. 参考:http://www.zeroc.com/ 1.什么是ICE? ICE(i ...
- 模型的可解释性:部分依赖图PDP和个体条件期望图ICE
来源:Deephub Imba 本文约1800字,建议阅读5分钟 本文我们通过一个简单据集的回归示例了解了部分依赖图 (PDP) 和个体条件期望 (ICE) 图是什么,以及如何在 Python 中制作 ...
- 配置C++和C#开发ICE环境
2019独角兽企业重金招聘Python工程师标准>>> C++配置环境 1.设置编译工具路径和配置编译命令: #编译命令,如果有多个文件就执行多次slice2cpp.exe命令 se ...
- Ice “Hello World”的实现
2019独角兽企业重金招聘Python工程师标准>>> Ice简介: Ice (Internet Communications Engine),是一种面向对象的中间件平台,既然是平台 ...
- ZeroC ICE java异步实现方式(ami/amd)
首先说说ami 和amd 的区别(以下为个人见解,仅供参考.如有疑问欢迎提出来) ami (异步方法调用): 仅仅基于ice 的同步方式扩展了异步的扩展方式,其他理念改动不大,使用起来好理解,但是服务 ...
最新文章
- SDP 协议分析 http://www.cnblogs.com/qingquan/archive/2011/08/02/2125585.html
- Apache+MySQL+PHP安装指南
- win7 无法复制粘贴
- Android5.0新特性:全新的动画
- Python基础概念_11_标准库
- 在Windows上安装Elasticsearch 5.0
- treegrid 如何获取getchanges inserted_如何避开Vue性能优化之路的荆棘?
- Spring Http Invoke 请求过程图
- 以下()不是python的数值运算操作符_python运算符与数据类型
- 【janino】janino 加载自定义函数报错 CompileException xxx cannot be invoked in static context
- C# ActiveX开发部署更新
- 如何查看linux的版本?
- c#中params关键字应用
- python培训班靠谱吗-Python培训机构就业靠不靠谱?
- 安卓q bubbles_Android Q Bubbles
- OSG/TextureCubeMap 立方贴图天空盒示例
- php网站设计国内外研究状况,毕业论文中的国内外研究现状怎么写啊
- 《CSS揭秘》-总结47个Css技巧(一):常用的背景与边框技巧
- 你真的知道如何选择内存条吗?
- vue RSA加密算法(jsencrypt)的使用