Slice最大的用处就是为我们使用Ice进行编程,代劳绝大部分的重复性代码,并提供一些帮助性的框架代码,如用于AMI和AMD方式进行异步编程的回调框架。
当Slice不为我们生成代码时,我们仍然可以按照Ice规范进行开发,但重复性细节代码很多。我们在进行一次远程调用时,调用方和执行方必要的代码如下:
Slice为我们生成的AMI 异步方法调用的回调框架代码有:
我们在使用AMD 异步方法调度(分派)进行对象的后端编程时,使用到的回调框架代码,Slice为我们生成的代码:
Slice只是为我们提供了回调的框架,帮我们打包了回调操作,但并没有使我们的调用或分派调度直接变成异步,调用或分派调度如何异步还是要我们自己进行编程。
更多AMI 和 AMD 回调详细请参看前面的篇
《ZeroC ICE的远程调用框架 Callback(一)-AMI异步方法调用框架》
《ZeroC ICE的远程调用框架 AMI与AMD -Why?》
看了Slice生成的c++代码,再比较一下Slice在java中如何帮助进行AMD编程:
void op(com.zeroc.Ice.Current current);
java.util.concurrent.CompletionStage<Void> opAMDAsync(com.zeroc.Ice.Current current);
static java.util.concurrent.CompletionStage<com.zeroc.Ice.OutputStream> _iceD_op(Intf obj, final com.zeroc.IceInternal.Incoming inS, com.zeroc.Ice.Current current) { com.zeroc.Ice.Object._iceCheckMode(null, current.mode); inS.readEmptyParams(); obj.op(current); return inS.setResult(inS.writeEmptyParams()); } static java.util.concurrent.CompletionStage<com.zeroc.Ice.OutputStream> _iceD_opAMD(Intf obj, final com.zeroc.IceInternal.Incoming inS, com.zeroc.Ice.Current current) { com.zeroc.Ice.Object._iceCheckMode(null, current.mode); inS.readEmptyParams(); return inS.setResultFuture(obj.opAMDAsync(current)); }
Slice在java中直接使用了ResultFuture。
再来看一下python:
def op(self, current=None): pass def opAMD(self, current=None): pass
Slice根本不会为python语言生成额外的AMD相关的代码,你必须在方法的实现体中自行使用Ice.Future。