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。