找回密码
 欢迎注册
搜索
热搜: 活动 交友 discuz
查看: 2495|回复: 10

深入学习Cache对象

[复制链接]
发表于 2003-4-12 10:46:02 | 显示全部楼层 |阅读模式
为了在Cache中实现HL7V3DT,我已经对Cache对象作过初步学习。觉得定义数据类型的比一般的类定义更为底层,需要对Cache系统的对象有更深入的了解,因为数据类型不但涉及到字面表达、值的转化、语意表达,还有存贮定义等与系统本身功能密切联系的内容。所以,想更深入地对Cache的对象进行学习,同时把这些学习内容写给大家,希望讨论,共同进步!
 楼主| 发表于 2003-4-12 10:47:10 | 显示全部楼层

深入学习Cache对象

Cache对象体系:
1.类字典
创建类定义的方法:
a)Cache Studio
b)使用API,创建类定义类的实例。
c)SQL DDL
类字典包含两类数据:1.定义数据(^oddDEF) 2.编译数据
2.类编译器
3.对象运行系统
4.Cache类库
一系列事先建好的类,有多个包:%Activate用于ActiveX网关的类,%Compiler内部编译器用的类,%CSP是CSP用的类,%csr是一套自动生成实现标准CSP的规则,%Library是核心的Cache“形为”类,%Net提供各种网络功能的类,%Projection是一套生成客户端类代码的类,%Studio是Cache Studio内部使用的类,%SYSTEM是几个通过$System变量访问的API类,%XML提供XML支持和SAX支持。
5.多种语言绑定
6.各种网关
 楼主| 发表于 2003-4-12 10:48:51 | 显示全部楼层

深入学习Cache对象

类编译器:
1.生成一系列依赖的必须先编译的类。
2.处理继承
3.对于持久类和序列化类,决定存贮结构。
4.持行所有生成方法的定义代码。
5.为这个类生成一个或多个包含类的运行时代码的列程。
6.编译所有生成的列程为可执行代码。
7.创建一个类描术器,是一个特殊的结构(存为列程),包括所有运行时需要的支持信息。
8.编译可以在Cache Studio中的Build菜单调用,也可用Do $System.OBJ.Compile("MyApp.MyClass")命令。如果用SQL DDL,将自动运行。
 楼主| 发表于 2003-4-12 10:50:19 | 显示全部楼层

深入学习Cache对象

持久类的存贮定义
1.所有持久类可以用StorageStragry关键字来定义它的存贮类。
2.存贮类有%LoadData,%SaveData,%DeleteData等方法。但这些方法不会被直接调用,而是在适当时候由持久对象的%OpenId,%Save等方法间接调用。
3.默认的存贮类是%CacheStorage类。
4.%CacheSQLStorage是一个利用生成的Select,Insert,Delete语句来提供对象持久化功能的存贮类。它一般用于把对象映射到一个老的已存在的Global上,或将对象通过SQL网关存贮到外部关系数据库中。
5.%CacheSQLStorage比%CacheStorage有更多的限制,比如他不支持“Schema演变”。
 楼主| 发表于 2003-4-12 13:36:53 | 显示全部楼层

深入学习Cache对象

流(Stream)
1.流是字符或二进制数据流的一种抽象表示,它可以通过一个公共界来进行操作。每一个流类都是从派生%SerialStream的,可以用来创建具有大量数据的类属性(从这个意义上来看,流也可以表示某些HL7V3DT中的数据类型!也就是说,V3DT中的数据类型的含意可能比Cache中数据类型类的含意要广,流本身也是一种数据类型,弄清这点,对实现V3DT很重要)。
2.流有两种,一是字符串流,二是二进制流,前者用来表示文本属性,后者主要表示图象等。字符串流与客户端将有UNICODE转变。
3.流包括一些公共操作界面,这个界面在%AbstractStream类中定义。包括Read,Write,ReWind,AtEnd,Size,CopyFrom等。
4.在应用系统中,流是作为一个集来使用的,对流的操作是通过一个暂时类来实现的。流的层次分为:%AbstractStream,%CacheStream,%GlobalCharacteStream,%GlobalBinaryStream,%FileCharacteStream,%FileBinaryStream,%File。
5.用SQL来操作流:&sql(SELECT Memo FROM Person INTO :memo WHERE ID = 1),然后:Set stream=##class(%SerialStream).%Open(memo),最后可以这样:Write stream.Read(100)或Do stream.%Close()。这里%Open是具有多态性的,真正返回的流类型由实际存贮的类型决定。
6.在VB中,Cache提供了CacheObject.CharStream和CacheObject.BinaryStream来操作Cache中的流。
从上面的学习可以看到,流作为一种特殊的数据类型,Cache为它提供了各方面的支持,包括特殊的存贮结构、专操作界面、特有的使用方法、向客户端的返射等。这些都是在非常底层的功能中实现的,而并不是一般的数据类型可以实现的。这样,我们可以看到,好象Cache中所谓的数据类型类,只是一些系统最底层的低级数据类型,而一些高级的应用层数据类型,可能要用更根本的方法去实现,这要求我们更加深入到Cache系统的内部,使用M语言从底层开始实现,或充分利用Cache实现流类型的思路和方法,去仿照实现其它特殊的数据类型。
 楼主| 发表于 2003-4-12 14:06:03 | 显示全部楼层

深入学习Cache对象

类返射(Projection):
1.返射提供了一种扩展Cache类编译器形为的途径。返射类是派生于%AbstractProjection类的类,它提供了类编译器在编译类时要调用的一些方法。它是在新的类被编译或旧的类被清除时,由类编译器使用的类。它主要用在类编译时,为Java,C++等生成绑定(Binding)代码。
2.可以为每一个类定义一个返射类,返射的形为是由被定义的返射类决定的。
3.返射类有一些返射界面,CreateProjection,RemoveProjection,这些一般都是由类编译器在编译类的适当时候调用的。
4.Cache标准的返射类包括:%Projection.Java,%Projection.CPP,%Projection.JEB,%Projection.WebService四个(为什么没有%Projection.NET支持MS.net或%Projection.C#呢?)
5.通过继承%AbstractProjection类,可以创建自已的返射类。
这里我们可以看到,如果要让自已定义的类能为客户端软件使用,可以用Projection来实现,如果我们要用除Java,C++,JEB,WebService以外的方法来访问Cache定义的类或数据类型,可能一定要自已定义相应的Projection类了?
发表于 2003-4-14 23:00:12 | 显示全部楼层

深入学习Cache对象

***** 版主模式 *****
该贴子是管理员从<a href=forums.cgi?forum=4>HL7研究</a>转移过来的!
发表于 2004-5-31 10:18:18 | 显示全部楼层

深入学习Cache对象

  Cache数据库是个好东东,就是对中文的支持还有点问题。对InterSystems提过的一些问题到现在还没有回音。
  最讨厌的是对COM的接口没有源码。使得对它的学习不能深入。
发表于 2004-6-17 21:25:24 | 显示全部楼层

深入学习Cache对象

给你一个案例,这个案例是关于药品规格的表结构,请问用cache数据库有什么优点,请具体说明。
http://bbs.miforum.net/mifbbs/showthread.php?s=&threadid=2998
发表于 2004-6-18 09:13:43 | 显示全部楼层

深入学习Cache对象

  定义一个药品基类,再继承一个规格药品类,基类内有药品的一些基本属性,如商品名称、药品名称、药品别名、药品生产厂家、是否为医保药品、药品剂型、药理性质(适应症、药理作用、禁忌症、过量及毒性等),规格药品类内有药品规格、价格、标准计量单位、所有包装单位与标准计量单位的换算数等。
发表于 2004-6-18 09:16:11 | 显示全部楼层

深入学习Cache对象

  当然还有很多了,就不一一例举了,用Cache的话结构就非常清楚了。
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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