freeeyes 发表于 2010-8-19 19:33:03

ICE开发初级研究(二)

本帖最后由 freeeyes 于 2010-8-19 19:41 编辑

ICE的开发更主要的是Slice的应用。使用slice编译成cpp的接口类,其实对于很多脚本语言而言(比如python语言),不用slice2***去生成相应的文件,直接用语法即可,在以下的帖子会介绍这个方法,不过对于C++,推荐还是使用slice2***生成你的继承类。
Slice语言有一些简单的特性。在这里说明以下。
Slice支持Class,但是考虑到语言通用性,不建议在Slice定义你的类方法,因为在某些脚本语言中,对类的支持是有限的。为了保持数据的通用性,建议使用Struct,不过这个结构有时候还是很难满足我们的要求的。因为更多的时候,我们喜欢继承这样的特性,而这个是Struct所不支持的(在slice语法中)。
我们继续把上一节简单的Slice扩展一下。
#ifndef _TESTICE_H
#define _TESTICE_H

module Test
{   
    struct ReturnPing   
    {         
         int nServerIP;   //ping的服务器IP         
         int nState;          //返回的状态         
         string strError;   //返回错误的信息   
    };
   
    class TimeofDay   
    {         
         int nSecond;         
         int nMinute;      
         int nHour;   
   };
   
    class DateTime extends TimeofDay   
    {      
          int nDay;      
          int nMouth;      
          int nYear;   
   };

   interface TestICE
   {
       ReturnPing ping(string strIP);
       DateTime GetTime(out string strTime);   
   };
};

#endif

这里我重新修改了一些Slice的代码,一个个解释,我增加了一个ReturnPing的结构体,支持函数调用返回后的数据。里面支持返回一些更多的属性。比如服务器的IP,服务器的ping结果,以及错误输出,这样的好处是,你可以方便的扩展你的函数,而不必大动干戈的修改函数体。
而下面就是一个标准的class声明,这里有一个继承,DateTime继承TimeofDay。从而实现年月日时分秒的返回,这里的语法有点类似于Java,其实,对于这个语法倒不必太在意,毕竟转换成你自己的h和cpp的话,它会按照C++转换成标准的Class,至于使用,你只需要引用这个头文件即可。不过这样写的好处是,你的代码更具层次性。至于struct和class的选择,你可以根据需要而决定。
当然,Slice语法也是支持多重继承的,你只要
   
class TimeofDay   
{         
    int nSecond;         
    int nMinute;         
    int nHour;   
};

class TimeofMillisecond   
{      
    int nMillisecond;   
};
   
class DateTime extends TimeofDay, TimeofMillisecond   
{      
    int nDay;      
    int nMouth;      
    int nYear;   
};

看到了,这样写,就能轻松让你的对象支持多重继承,很简单吧。
好了,再说一个问题,如果我的接口很复杂,怎么办?比如,我有几百个类,几百个接口,写在一个文件里面,实在是让人找的头晕。有没有把接口分在不同的文件中呢,答案自然是有的,而且很简单,且看下面的代码。
我建立一个叫做Base.ice的文件
里面这么写

#ifndefBASE_CENTER_ICE
#define BASE_CENTER_ICE
module BaseCenter {
   class TimeofDay   
   {
         int nSecond;
         int nMinute;
         int nHour;
   };

   class DateTime extends TimeofDay
   {      
         int nDay;
         int nMouth;
         int nYear;   
    };
};
#endif

我把所有和时间相关的类,放在一起。
然后我再创建一个文件Main.ice

#ifndefMAIN_CENTER_ICE
#define MAIN_CENTER_ICE

#include <Base.ice>

module MainCenter
{
   class UserDateTime extends BaseCenter::DateTime
      {
          int nUserID;
   };
};
#endif

这里,你只需要#include关键字,引用你的Base.ice。继承的时候,注明你从哪个module来的。就可以极大的简化你的ice文件,同时写出非常漂亮的ice组织结构。
此时,使用slice2cpp生成文件的时候,ICE也会智能的帮你把文件分开,生成不同的文件。
其实,要用好ICE,能写一手好的ice是非常关键的,呵呵。不仅为了自己的阅读,也为了伙伴的阅读。
那么,咱们索性在加一点功能,如果我想在我的返回值里面,返回一直数组,如何做呢?比如,增加一个接口,返回一页中所有商品的列表?当然,ICE早就为你想好了,写法非常简单。
#ifndefMAIN_CENTER_ICE#define MAIN_CENTER_ICE
#include <Base.ice>
module MainCenter
{
   class ShopItem
   {
         int nItemID;
         string strItemName;
   };
   sequence<ShopItem> ShopItemList;
   interface Shop
   {
          ShopItemList GetShop(int nPage);
   };
};
#endif

剥离那些没用的代码,这是一个很简单的例子,sequence关键字就是你要用的东西。它是一个数组,实际是一个Vector,为什么这么说呢,自然是有根据的,呵呵,来吧,把这个*.ice用slice2cpp生成一下,你看到了什么?
typedef ::std::vector< ::MainCenter::ShopItem> ShopItemList;
在你生成的*.h里面,有这个定义,明白了吧。实际上载sequence的C++实现,是使用标准的stl的vector来做的,那么,写到这里,我想懂stl的你,已经会运用这个参数了吧。
呵呵,再说ICE对其他语言的支持,比如python。因为python,你也可以生成继承,但是其实,有一个更简单的方法使用ICE

import sys, traceback, time, Ice
Ice.loadSlice('Main.ice')

import MainCenter
class CShop(MainCenter.Shop):
    def GetShop(nPage);

当然,这是对python的简单调用方法,对于C++,我还是建议使用生成slice2cpp的方法。
很多人说,ICE是一个重量级的东西,其实我觉得,放平自己的心态,永远记住所有的架构都是给人使用的,而ICE之所以能做的好,肯定是经过很多人的努力,验证过的,只有足够的简单,才能获得好评。
其实,写道这里,我也只能说我只是一个ICE的初学者,但是,我很期待,我能用它做到什么程度。并详细的在这里记述下来,给希望使用它的人带来帮助。


最后附注一句,chome写好的帖子,最后生成后一塌糊涂。代码排版都混乱了。以后不能用chome写帖子,只好用IE再改一遍。NND。

yoogera 发表于 2010-9-30 19:09:39

看不懂啊,是不是先介绍下你要说的是什么东西啊?

zkliuym 发表于 2010-10-9 11:23:40

好文
把ice文件加入到vc工程中,使用预编译指令进行编译,每次修改后重新编译很方便

zkliuym 发表于 2010-10-9 11:24:15

好文
把ice文件加入到vc工程中,使用预编译指令进行编译,每次修改后重新编译很方便
页: [1]
查看完整版本: ICE开发初级研究(二)