找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 7804|回复: 3

ICE开发初级研究(二)

[复制链接]
发表于 2010-8-19 19:33:03 | 显示全部楼层 |阅读模式
本帖最后由 freeeyes 于 2010-8-19 19:41 编辑

ICE的开发更主要的是Slice的应用。使用slice编译成cpp的接口类,其实对于很多脚本语言而言(比如python语言),不用slice2***去生成相应的文件,直接用语法即可,在以下的帖子会介绍这个方法,不过对于C++,推荐还是使用slice2***生成你的继承类。
Slice语言有一些简单的特性。在这里说明以下。
Slice支持Class,但是考虑到语言通用性,不建议在Slice定义你的类方法,因为在某些脚本语言中,对类的支持是有限的。为了保持数据的通用性,建议使用Struct,不过这个结构有时候还是很难满足我们的要求的。因为更多的时候,我们喜欢继承这样的特性,而这个是Struct所不支持的(在slice语法中)。
我们继续把上一节简单的Slice扩展一下。
  1. #ifndef _TESTICE_H
  2. #define _TESTICE_H
  3. module Test
  4. {   
  5.     struct ReturnPing   
  6.     {         
  7.            int nServerIP;     //ping的服务器IP         
  8.            int nState;          //返回的状态         
  9.            string strError;   //返回错误的信息   
  10.     };
  11.    
  12.     class TimeofDay   
  13.     {         
  14.            int nSecond;         
  15.            int nMinute;        
  16.            int nHour;   
  17.      };
  18.    
  19.     class DateTime extends TimeofDay   
  20.     {        
  21.           int nDay;        
  22.           int nMouth;      
  23.           int nYear;   
  24.      };
  25.      interface TestICE
  26.      {
  27.        ReturnPing ping(string strIP);
  28.        DateTime GetTime(out string strTime);   
  29.      };
  30. };
  31. #endif
复制代码

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

看到了,这样写,就能轻松让你的对象支持多重继承,很简单吧。
好了,再说一个问题,如果我的接口很复杂,怎么办?比如,我有几百个类,几百个接口,写在一个文件里面,实在是让人找的头晕。有没有把接口分在不同的文件中呢,答案自然是有的,而且很简单,且看下面的代码。
我建立一个叫做Base.ice的文件
里面这么写
  1. #ifndef  BASE_CENTER_ICE
  2. #define BASE_CENTER_ICE
  3. module BaseCenter {
  4.    class TimeofDay   
  5.    {
  6.          int nSecond;
  7.          int nMinute;
  8.          int nHour;
  9.    };
  10.    class DateTime extends TimeofDay
  11.    {        
  12.          int nDay;
  13.          int nMouth;
  14.          int nYear;   
  15.     };
  16. };
  17. #endif
复制代码
我把所有和时间相关的类,放在一起。
然后我再创建一个文件Main.ice
  1. #ifndef  MAIN_CENTER_ICE
  2. #define MAIN_CENTER_ICE
  3. #include <Base.ice>
  4. module MainCenter
  5. {
  6.      class UserDateTime extends BaseCenter::DateTime
  7.       {
  8.           int nUserID;
  9.      };
  10. };
  11. #endif
复制代码
这里,你只需要#include关键字,引用你的Base.ice。继承的时候,注明你从哪个module来的。就可以极大的简化你的ice文件,同时写出非常漂亮的ice组织结构。
此时,使用slice2cpp生成文件的时候,ICE也会智能的帮你把文件分开,生成不同的文件。
其实,要用好ICE,能写一手好的ice是非常关键的,呵呵。不仅为了自己的阅读,也为了伙伴的阅读。
那么,咱们索性在加一点功能,如果我想在我的返回值里面,返回一直数组,如何做呢?比如,增加一个接口,返回一页中所有商品的列表?当然,ICE早就为你想好了,写法非常简单。
  1. #ifndef  MAIN_CENTER_ICE#define MAIN_CENTER_ICE
  2. #include <Base.ice>
  3. module MainCenter
  4. {
  5.      class ShopItem
  6.      {
  7.          int nItemID;
  8.          string strItemName;
  9.      };
  10.      sequence<ShopItem> ShopItemList;
  11.      interface Shop
  12.      {
  13.           ShopItemList GetShop(int nPage);
  14.      };
  15. };
  16. #endif
复制代码
剥离那些没用的代码,这是一个很简单的例子,sequence关键字就是你要用的东西。它是一个数组,实际是一个Vector,为什么这么说呢,自然是有根据的,呵呵,来吧,把这个*.ice用slice2cpp生成一下,你看到了什么?
typedef ::std::vector< ::MainCenter::ShopItem> ShopItemList;
在你生成的*.h里面,有这个定义,明白了吧。实际上载sequence的C++实现,是使用标准的stl的vector来做的,那么,写到这里,我想懂stl的你,已经会运用这个参数了吧。
呵呵,再说ICE对其他语言的支持,比如python。因为python,你也可以生成继承,但是其实,有一个更简单的方法使用ICE
  1. import sys, traceback, time, Ice
  2. Ice.loadSlice('Main.ice')
  3. import MainCenter
  4. class CShop(MainCenter.Shop):
  5.     def GetShop(nPage);
复制代码

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


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

评分

参与人数 1威望 +30 收起 理由
winston + 30

查看全部评分

发表于 2010-9-30 19:09:39 | 显示全部楼层
看不懂啊,是不是先介绍下你要说的是什么东西啊?
发表于 2010-10-9 11:23:40 | 显示全部楼层
好文
把ice文件加入到vc工程中,使用预编译指令进行编译,每次修改后重新编译很方便
发表于 2010-10-9 11:24:15 | 显示全部楼层
好文
把ice文件加入到vc工程中,使用预编译指令进行编译,每次修改后重新编译很方便
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-22 02:50 , Processed in 0.014634 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表