第三章 Caché 包选项

第三章 包选项

注:Caché 遇到不包含包名的类的引用,并且类名以“%”开头时,则该类在“%Library”包中。

概述包

Caché 支持包,包将特定数据库中的相关类分组。包提供以下好处:

  • 为开发人员构建更大的应用程序和彼此共享代码提供了一种更简单的方法。
  • 更容易避免类之间的名称冲突。
  • 以一种简洁、简单的方式提供了一种逻辑方式来表示对象字典中的SQL模式:一个包对应一个模式。

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

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

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

如果包名可以通过上下文确定,那么包名可以省略:

Do ##class(Invoice).Method()

与类一样,包定义存在于Caché 数据库中。有关将包从数据库映射到名称空间的信息

包名

包名是一个字符串。它可能包含“.”字符,但不能有其他标点符号。包名以"."分割,每个部分都是一个子包,并且可以有多个子包。如果给一个类命名为Test.Subtest。TestClass,然后这表明包的名称是Test,子包的名称是子Test,类的名称是TestClass。

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

  • 包名受长度限制。
  • 在命名空间中,每个包的名称必须是惟一的,不考虑大小写。因此,名称空间中不能同时存在“ABC”和“abc”包,“abc.def”包和子包被视为“ABC”包的一部分。

定义包

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

下面是一个示例,其中包名是Accounting,类名是Invoice,完全限定的类名是Account .Invoice:

Class Accounting.Invoice 
{
}

包映射

根据定义,每个包都是特定数据库的一部分。通常,每个数据库都与一个名称空间相关联,其中数据库和名称空间共享一个公共名称。这适用于系统提供的各种数据库和名称空间,例如sample和USER。要使数据库中的包定义对与该数据库无关的名称空间可用,请使用包映射。

下面的过程将包含包的数据库称为“源数据库”,将包映射到的名称空间称为“查看命名空间”。映射一个包的过程是:

  1. 从管理门户网站主页,转到命名空间页面 ([Home] > [Configuration] > [Namespaces])
  2. 在名称空间页面上,通过单击表中相应行的Package Mappings来选择查看名称空间。这将显示查看名称空间的包映射页面。
  3. 在Package Mappings页面,单击New Package Mapping。这将显示用于设置映射的对话框。
  4. 在这个对话框中,按如下方式填写字段:
  • 包数据库位置——源数据库。包名——被映射的包。
  • 如果计划映射一个尚未创建的包,可以通过单击New package并输入包的名称来预先指定它的名称。单击OK以使用这些值并取消对话框。
  1. 包映射页面现在应该显示映射。单击Save Changes保存映射。
    跨命名空间映射包映射包定义,而不是包的数据。因此,将样例包从 SAMPLES 命名空间映射到User命名空间并不构成SAMPLES的实例。来自User名称空间中可用的SAMPLES名称空间的User。

注意:在映射包时,一定要标识包中的类使用的任何包含文件。如果这些包含文件的名称不是以%开头的,那么它们在所有名称空间中都不可用,也必须映射它们(通过例程映射页面),以便类能够找到它们。类似地,确保映射类使用的所有例程和类在目标名称空间中可用。

当映射一个包时,映射应用于包中的类定义和生成的例程,它们位于同一个包中。

跨多个命名空间映射包

Caché 还提供通过单个操作使源包在多个目标名称空间中可用的功能。这样的映射使包在除了DOCBOOK和SAMPLES之外的所有名称空间中都可用。
要使一个包对多个名称空间可用,过程如下:

  1. 创建一个名为%ALL的命名空间。
  2. 按照本节的描述创建一个包映射并保存它。映射包中的类在%SYS名称空间、User名称空间和任何用户定义的名称空间中都是可见和可用的。

注意:删除%ALL名称空间将删除其映射。

引用类时使用的包

有两种方法来引用类:

  • 使用完全限定名(即Package.Class)。例如:
 // create an instance of Lab.Patient
 Set patient = ##class(Lab.Patient).%New()
  • 使用简短的类名,让类编译器解析它属于哪个包。

默认情况下,当使用一个简短的类名时,Caché 会假定这个类在所使用的类的包中(如果有的话),或者在%Library包中,或者在User包中。

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

注意:使用一个模糊的短类是错误的;也就是说,如果在两个或多个包中有相同的短类名,并将它们全部导入,那么当编译器试图解析包名时,将得到一个错误。要避免此错误,请使用全名。

导入包

当导入包时,Caché 会在这些包中查找任何短的类名。

类导入指令

可以在类定义的顶部,类行之前包含类导入指令。该指令的语法如下:

Import packages

Class name {}

其中包是单个包或包的逗号分隔列表,括在括号中。Import这个词不区分大小写,但通常是大写的,如下所示。请记住,在类上下文中,当前包总是隐式导入的。

Import (SQLUser,PHA.OP.MOB.Android)
/// w ##class(PHA.IP.MOB.Business).test("自煎","饭后温服") "N"
/// w ##class(PHA.IP.MOB.Business).test("代煎","饭后温服") "Y"
/// w ##class(PHA.IP.MOB.Business).test("代煎","加工膏滋") "N"
/// w ##class(PHA.IP.MOB.Business).test("自煎","加工膏滋") "N"
ClassMethod test(a, b)
{
	;d ..importPackage()
	
	s a=##class(Android).Login("demo#1")
	w a,!
	b 
	s ret="N"
	i (a'="自煎")&&(b'="加工膏滋") d
	.s ret="Y"
	q ret
}

ClassMethod importPackage()
{
	;#import PHA.OP.MOB
	w "bbb",!
}

Cache ObjectScript #IMPORT指令

在Cache 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指令的顺序对编译器解析短类名的方式没有影响。

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

一旦代码显式地导入任何包,用户包就不会自动导入。如果需要该包,还必须显式地导入它。例如:

#import MyPackage
#import User

这种逻辑的原因是,在某些情况下,可能不希望导入用户包。

包导入和继承

类继承从父类中显式导入的包。类的名称在最初使用它的上下文中解析,而不是与当前类的名称一起解析。例如,假设在User中定义。然后创建一个MyPackage。继承自User的MyClass类。然后编译它。Caché 编译MyPackage中继承的MyMethod()方法。MyClass——但是解析User上下文中此方法中的任何类名。MyClass(因为这个方法就是在这里定义的)。

导入软件包的提示

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

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

现在将App.MAC更改为:

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

重新编译App.MAC时,将使用Customer2。应用程序类。这样的代码必须考虑代码的兼容性以及对存储结构的影响。

发布了13 篇原创文章 · 获赞 1 · 访问量 363

猜你喜欢

转载自blog.csdn.net/yaoxin521123/article/details/104873316