第二十一章 调用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` 函数:









网友评论