第二十一章 调用Callout Library函数 - 使用$Z
2024-01-11 本文已影响0人
Cache技术分享
第二十一章 调用Callout Library函数 - 使用$ZF(-6)接口封装库函数
使用$ZF(-6)
接口封装库函数
为 $ZF(-6)
接口编写一个示例非常简单,其工作方式与 $ZF(-5)
接口的示例类似(请参阅前面的“使用 $ZF(-5)
通过系统 ID
访问库”在本章中),但这并不能证明使用 $ZF(-6)
的优点。相反,本节将介绍 ObjectScript
类,这些类允许最终用户执行完全相同的任务,而无需了解有关标注库的内容或位置的任何信息。
$ZF(-5)
示例调用Callout
库inputlibrary.dll
和outputlibrary.dll
中的函数来处理一些实验数据并生成可用于绘制图形的二维数组。本节中的示例使用以下 ObjectScript
代码执行相同的任务:
-
User.SystemIndex
类 — 封装用于定义系统索引表中条目的文件名和索引号。 -
User.GraphData
类 — 提供封装两个库中函数的方法。 - 方法
GetGraph()
— 是调用User.GraphData
方法的最终用户程序的一部分。此方法中的代码执行与$ZF(-5)
示例完全相同的任务,但从不直接调用$ZF
函数。
User.SystemIndex
类允许使用
Callout 库的应用程序创建和访问系统索引条目,而无需硬编码索引号或文件位置:
ObjectScript
类 User.SystemIndex
Class User.SystemIndex Extends %Persistent
{
/// Defines system index table entries for the User.GraphData libraries
ClassMethod InitGraphData() As %Status
{
// For each library, delete any existing system index entry and add a new one
set sc = $ZF(-4,4,..#InputLibraryID)
set sc = $ZF(-4,5,..#InputLibraryID,"c:\intersystems\iris\bin\inputlibrary.dll")
set sc = $ZF(-4,4,..#OutputLibraryID)
set sc = $ZF(-4,5,..#OutputLibraryID,"c:\intersystems\iris\bin\outputlibrary.dll")
quit 0
}
Parameter InputLibraryID = 100;
Parameter OutputLibraryID = 200;
}
-
InitGraphData()
方法将User.GraphData
的库添加到系统索引表中。当IRIS
实例启动时,它可以被自动调用,使库可供实例内的所有进程使用。 -
InputLibraryID
和OutputLibraryID
类参数可用,以便相关应用程序不必对索引值进行硬编码(如以下示例中User.GraphData
的Init()
方法所示)。
User.GraphData
类允许最终用户调用库函数,而无需了解有关实际 Callout
库的任何信息。
ObjectScript
类 User.GraphData
Class User.GraphData Extends %Persistent
{
/// Gets library IDs and updates the system index table for both libraries.
Method Init() As %Status
{
set InLibID = ##class(User.GraphDataIndex).%GetParameter("InputLibraryID")
set OutLibID = ##class(User.GraphDataIndex).%GetParameter("OutputLibraryID")
quit ##class(User.SystemIndex).InitGraphData()
}
Property InLibID As %Integer [Private];
Property OutLibID As %Integer [Private];
/// Calls function "FormatData" in library "inputlibrary.dll"
Method FormatData(rawdata As %Double) As %String
{
quit $ZF(-6,..InLibID,1,rawdata)
}
/// Calls function "RefineData" in library "outputlibrary.dll"
Method RefineData(midvalue As %String) As %String
{
quit $ZF(-6,..OutLibID,1,midvalue)
}
/// Calls function "PlotGraph" in library "outputlibrary.dll"
Method PlotGraph(datapoint As %String, xvalue As %Integer) As %String
{
quit $ZF(-6,..OutLibID,2,datapoint,xvalue)
}
/// Unloads both libraries
Method Unload() As %String
{
set sc = $ZF(-4,4,..InLibID) // unload "inputlibrary.dll"
set sc = $ZF(-4,4,..OutLibID) // unload "outputlibrary.dll"
quit 0
}
}
-
Init()
方法调用User.SystemIndex
中的类方法,该方法将设置或更新inputlibrary.dll
和outputlibrary.dll
的系统索引条目。它还获取库ID
的当前值。此类的开发人员仍然需要了解有关Callout
库代码的一些信息,但将来对系统索引的更改将是透明的。 -
FormatData()
、RefineData()
和PlotGraph()
方法均封装了对一个库函数的调用。由于它们仅包含无条件 ZF 调用一样快地运行。
以下示例演示了最终用户如何使用 User.GraphData
中的方法。 GetGraph()
方法使用 Callout
库执行与 $ZF(-5)
接口示例中的 GraphSomeData()
方法完全相同的任务(请参阅前面的“使用 $ZF(-5)
通过系统 ID访问库”)本章),但它不直接调用任何
$ZF` 函数: