八月 21 2010

Ice入门篇-Slice语言

类别: ICE    By Joyaspx @ 18:22

 

学习ICE,我们要从ICE的“语言”学起,简称SLICE(Simple Language Of ICE)。SLICE有自己独立的语法体系和结构,我们必须必须熟悉和遵守这些语法体系才能到达我们想要的效果。

按照官方的说明文档,结合自己的使用,我们可以以下几块来讲解:

  1. 语法规范
  2. 基本类型
  3. 用户自定义类型
  4. 接口及其异常
  5. 生成代码分析
  6. 文档化

一、语法规范

像其他语言一样,SLICE也有自己的语法规范,包括 命名、格式、关键词、敏感前后缀等。同样我们也可以借鉴学习其他语言的方法来学习它,入门阶段我们并不需要掌握每一个关键词和命名规则等,掌握几个常用的关键词就可以了,如下:

module : 定义命名空间或者包路径

interface:接口

struct:结构(编译成C#后为Class)

Class:类

exception:异常

throws:抛出异常

sequence:序列

dictionary:字典

idempotent:等幂方法(即调用多次不影响最终结果)

这些关键词基本上组成了ICE语法的骨干,除此之外,还有一个重要的功能就是属性Attribute。

Attribute可以为我们做很多事情,大致可以分为两类,一类是是ICE的固有特性,如ami,amd,deprected等,表名具有ICE某种特定的功能。另一类则是特定语言(如Java、Net等)所有用的特征,如clr:generic:List、clr:generic:Queue等(.net),标记上这些属性后在生成相应的cs文件时则会生成相应的类型。具体功能可以参见手册的附录B(3.4.0)

掌握了这些“语法”之后,我们基本上就可以来组织内容了,不过从实用角度上来,还有一些值得注意的地方:

  1. 每个语句的定义后面都要以分号“;”来结束,包括命名空间的定义。
  2. 除了注释以外,不能包含ASCII码以外的任何字符(例如中文)。
  3. ICE里面的任何方法、接口、类等都是对象,而且讲究对象之间不能有重复命名,所以我们在定义的时候不能有重复(这方面是忽略大小写的,例如name与Name是一样的)。
  4. ICE文件是可以复用的,类似C语法,在文件头处加上#include即可。
  5. 如果确实要用到某些关键词来命名,则可以用转义字符“\”来标识,例如 “\dictionary”。

掌握了以上几点,我们来做个例子(以下代码不包含任何功能定义):

module joyaspx{
module com{
/* Code here*/
};
};

二、基本类型

了解以上基本语法之后,我们还需掌握一些基本类型。何谓基本类型,基本类型就是可以解析成为所有语言(C++、Java、.NET等)都能识别的类型,这些基本类型类型可以总结为两种:字符型和数字型。详细见下表(摘自手册):

基本类型 

看完以上表格,细心的朋友马上就会发现一个问题,常见的Decimal和DateTime类型怎么没有在列表中看到呢。经过官方查证,确实不存在这两种常用类型,这对于熟悉特定语言(比如.net)的朋友来说确实存在一些不方便之处。既然已成为事实,那么我们就来讨论如果解决此问题。

对于Decimal类型,如果为一般的企业,大部分的情况下都可以用double来替代,关系不是很大;但是对于DateTime类型就没有这么乐观了,不过幸运的是DateTime有个Ticks属性,该属性类型为long,也就是说还是可以和long类型互转的,如下所示:

long ticks = DateTime.Now.Ticks;
DateTime now = new DateTime(ticks);
对于Java开发的朋友来说,方法也是类似的,只不过有一点小小的区别,.net和java的ticks计算七点有点不同。
当然,也还有另一种最简单也最笨重的方法,那就是 Type - String之间的互转,要利用到反射等机制来是实现了。
好了,掌握了这些基本类型,我们就可以开工做一个小小的实验了,ICE定义如下:
module joyaspx{
module com{
class person{
string name;
int age;
bool gender;
};
};
};

然后使用slice2cs工具生成相应的cs代码,我们来看看生成了什么。

相应生成语句 :slice2cs *.ice (slice2cs工具后面将会介绍)

region

对于类来说,生成的代码可以分为三块,分别是构造函数、Ice.Object基类方法和元数据支持方法。
  1. 构造函数 。构造函数有两个重载,一个是无参数的构造函数,另一个是带参数的构造函数,参数分别是各个字段(属性)的赋值。
  2. Ice.Object基类方法实现。
    这里共有7个方法,分别是ice_isA、ice_ids、ice_id和ice_staticid四类方法,另外三个方法分别是带有当前上下文的重载。这四类方法从名字就可以大致看出其中的含义:ice_isA是判断当前对象是否与指定类相符,ice_ids是获取当前对象的类属性(包括父类继承,继承关系直到基类为止),ice_id是获取当前对象的类型标识符(TypeId),ice_staticid与ice_id功能相同,只不过为静态方法。 详细可以参见手册4.14一节
  3. 元数据支持
  相信大家对元数据这个词应该都不会陌生,它不仅包含了数据本身,也包含了数据的描述信息,包括数据类型、格式、字长等许多属性。因此,元数据的格式定义也显得非常重要,它关系到上层获取数据的准确性和可靠性。不过ICE已经把这些工作已经做得非常好了,我们只管上层的调用即可,上图中共有四个方法,不过可以总结为write和read两种行为,对应着客户端调用前的write和服务端接收时的read,这样一个消息就可以完整的被接受到。限于篇幅,这里不再详细讲解其格式的定义。建议有兴趣的朋友可以去研究一下,对理解ICE的运行原理还是大有裨益的。

三、接口、异常

这一章可能是我们最为关心的一种那个,前面的语法与基本类最终都是为了实现某个接口而服务的,接口即意味了与外界进行的通讯的渠道了,有了前面的基础,我们定义一个接口也容易多了。

待续……

不允许评论