第三章 IRIS 软件包

本章将更详细地讨论软件包。

对于持久类,包在SQL中表示为SQL模式。有关详细信息,请参阅本书后面的“包到模式的投影”。

重要:

当InterSystems IRIS®遇到对不包含包名且类名以“%”开头的类的引用时,InterSystems IRIS假定该类位于“%Library”包中。

3.1 软件包概述

InterSystems IRIS支持将相关类分组到特定数据库中的包。软件包提供以下好处:

  • 它们为开发人员提供了一种更容易的方式来构建更大的应用程序并相互共享代码。
  • 它们可以更容易地避免类之间的名称冲突。
  • 它们提供了一种逻辑方式,以干净、简单的方式表示对象字典中的SQL模式:包对应于模式。

包只是一种将相关类分组到公共名称下的方法。例如,应用程序可以具有“会计”系统和“库存”系统。构成这些应用程序的类可以组织为“会计”包和“库存”包:

gobj_package1

这些类中的任何一个都可以使用它们的全名(由包和类名组成)来引用:

 Do ##class(Accounting.Invoice).Method()
 Do ##class(Inventory.Item).Method()

如果可以根据上下文确定包名(见下文),则可以省略包名:

 Do ##class(Invoice).Method()

与类一样,包定义存在于InterSystems IRIS数据库中。有关将包从数据库映射到命名空间的信息,请参阅“包映射”一节

3.2 软件包名称

包名是字符串。它可以包含“.”(句点)字符,但不能包含其他标点符号。包名称的每个句点分隔部分都是一个子包,并且可以有多个子包。如果给一个类命名为 Test.Subtest.TestClass ,那么这表示包的名称为 Test ,子包的名称是 Subtest ,类的名称是 TestClass

软件包名称的长度和用法有几个限制:

  • 包名称受长度限制。请参阅“服务器端编程方向指南”中标识符规则和指南中的“类”。
  • 在命名空间中,每个包名称必须是唯一的,不考虑大小写。因此,命名空间中不能同时存在“ABC”和“abc”包,“abc.def”包和子包被视为“ABC”包的一部分。

有关标识符的一般信息,请参阅“定义和编译类”一章中的“命名约定”一节.

3.3 定义软件包

包由类的名称表示。创建类时,将自动定义包。类似地,当删除包中的最后一个类时,该包也会自动删除。

下面显示了一个示例,其中包名为Accounting,类名为Invoice,完全限定类名为Accounting.Invoice

Class Accounting.Invoice 
{
}

3.4 软件包映射

根据定义,每个包都是特定数据库的一部分。通常,每个数据库都与一个命名空间相关联,其中数据库和命名空间共享一个公共名称。要使数据库中的包定义可用于与该数据库不关联的命名空间,请使用包映射。“系统管理指南”中详细介绍了此过程;以下是介绍。包含包的数据库是源数据库,包映射到的命名空间是目标命名空间。要映射包,过程如下:

  1. 从管理门户主页,转到命名空间页面(系统管理>配置>系统配置>命名空间)。

  2. 在命名空间页面上,通过单击表中相应行上的包映射来选择目标命名空间。这将显示目标命名空间的“包映射”页面。

  3. 在“包映射”页面上,单击“新建”。这将显示一个用于设置映射的对话框。

  4. 在此对话框中,按如下方式填写字段:

    • 包数据库位置-源数据库。
    • 包名称-要映射的包。如果计划映射尚未创建的包,可以通过单击“指定新包”并输入包的名称来预先指定其名称。

    单击“确定”使用这些值并关闭对话框。

  5. “包映射”页面现在应该显示映射。单击保存更改以保存映射。

跨命名空间映射包映射包定义,而不是其数据。

重要:

映射包时,请确保标识该包中的类所需的所有代码和数据,并确保所有这些代码和数据在所有目标命名空间中都可用。映射的类可能取决于以下项:

  • Include files
  • Routines
  • Other classes
  • Tables
  • Globals

根据需要使用其他例程、包和全局映射,以确保这些项在目标命名空间中可用。请参阅“系统管理指南”中“配置命名空间”一章中的“将全局、例程和包映射添加到命名空间”。

映射包时,映射将应用于该包中的类定义以及同一包中生成的例程。

3.4.1 跨多个命名空间映射包

InterSystems IRIS还提供了通过单个操作使源包在多个目标命名空间中可用的功能。

要使包可用于多个命名空间,过程如下:

  1. 根据“系统管理指南”-“配置InterSystems IRIS”一章的“创建命名空间”部分中的说明,创建名为%ALL的命名空间。
  2. 按照本节所述创建包映射并保存。

映射包中的类随后在%SYS命名空间、USER命名空间和任何用户定义的命名空间中可见并可用。

注:

删除%ALL命名空间将删除其映射。

3.5 引用类时的包使用

有两种方法可以引用类:

  • 使用完全限定的名称(即Package.Class)。例如:

     // create an instance of Lab.Patient
     Set patient = ##class(Lab.Patient).%New()
    
  • 使用短类名并让类编译器解析它属于哪个包。

    默认情况下,当您使用短类名时,InterSystems IRIS假定该类位于您正在使用的代码的类的包中(如果有),或者位于%Library包中,或者位于User包中。

    如果您希望编译器搜索其他包中的类,请按照下一节中的描述导入这些包。

    注:

    使用不明确的短类是错误的;也就是说,如果在两个或多个包中具有相同的短类名并导入所有包,那么当编译器尝试解析包名时,将出现错误。要避免此错误,请使用全名。

3.6 导入软件包

当您导入包时,InterSystems IRIS会在这些包中查找任何短类名。在类定义中,可以通过类import指令或ObjectScript#import指令导入包。本节解释这些指令,讨论对User包的影响以及对子类的影响,并提供一些提示。

3.6.1 类导入指令

您可以在类定义的顶部的class行之前包含class Import指令。此指令的语法如下:

Import packages

Class name {}

其中包是单个包或以逗号分隔的包列表,用括号括起来。“导入”一词不区分大小写,但通常大写,如图所示。

请记住,在类上下文中,当前包总是隐式导入的。

3.6.2 ObjectScript #IMPORT指令

在ObjectScript方法中,#IMPORT指令导入包,以便您可以使用短类名引用包中的类。此指令的语法如下:

#import packagename

其中packagename是包的名称。单词#import不区分大小写。例如:

#import Lab
 // Next line will use %New method of Lab.Patient, if that exists
 Set patient = ##class(Patient).%New()

可以有多个#IMPORT指令:

#import Lab
#import Accounting

 // Look for "Patient" within Lab & Accounting packages.
 Set pat = ##class(Patient).%New()

 // Look for "Invoice" within Lab & Accounting packages.
 Set inv = ##class(Invoice).%New()

\#IMPORT指令的顺序对编译器解析短类名的方式没有影响。

3.6.3 显式包导入影响对用户包的访问

类的名称在最初使用的上下文中解析,而不是与当前类名一起解析。例如,假设您在 User.MyClass 中定义了一个方法 MyMethod() ,然后创建一个继承自 User.MyCClassMyPackage.MyClass 类并编译它。InterSystems IRIS在 MyPackage.MyClass 中编译继承的 MyMethod() 方法,但在 User.MyClass 的上下文中解析此方法中的任何类名(因为这是定义此方法的地方)。

3.6.4 导入包的提示

通过导入包,可以生成更具适应性的代码。例如,您可以创建以下代码:

#import Customer1
 Do ##class(Application).Run()

现在将App.MAC更改为:


#import Customer2
 Do ##class(Application).Run()

重新编译App.MAC时,将使用 Customer2.Application 类。这样的代码需要规划:您必须考虑代码兼容性以及对存储结构的影响。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值