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。 看不懂啊,是不是先介绍下你要说的是什么东西啊? 好文
把ice文件加入到vc工程中,使用预编译指令进行编译,每次修改后重新编译很方便 好文
把ice文件加入到vc工程中,使用预编译指令进行编译,每次修改后重新编译很方便
页:
[1]