第二十一章 调用Callout Library函数 - 使用$ZF(-6)接口封装库函数

发布时间:2024年01月12日

第二十一章 调用Callout Library函数 - 使用$ZF(-6)接口封装库函数

使用$ZF(-6)接口封装库函数

$ZF(-6) 接口编写一个示例非常简单,其工作方式与 $ZF(-5) 接口的示例类似(请参阅前面的“使用 $ZF(-5) 通过系统 ID 访问库”在本章中),但这并不能证明使用 $ZF(-6) 的优点。相反,本节将介绍 ObjectScript 类,这些类允许最终用户执行完全相同的任务,而无需了解有关标注库的内容或位置的任何信息。

$ZF(-5) 示例调用Calloutinputlibrary.dlloutputlibrary.dll 中的函数来处理一些实验数据并生成可用于绘制图形的二维数组。本节中的示例使用以下 ObjectScript 代码执行相同的任务:

  • User.SystemIndex 类 — 封装用于定义系统索引表中条目的文件名和索引号。
  • User.GraphData 类 — 提供封装两个库中函数的方法。
  • 方法 GetGraph() — 是调用 User.GraphData 方法的最终用户程序的一部分。此方法中的代码执行与 $ZF(-5) 示例完全相同的任务,但从不直接调用 $ZF 函数。
    User.SystemIndex类允许使用Callout 库的应用程序创建和访问系统索引条目,而无需硬编码索引号或文件位置:

ObjectScriptUser.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 实例启动时,它可以被自动调用,使库可供实例内的所有进程使用。
  • InputLibraryIDOutputLibraryID 类参数可用,以便相关应用程序不必对索引值进行硬编码(如以下示例中 User.GraphDataInit() 方法所示)。

User.GraphData 类允许最终用户调用库函数,而无需了解有关实际 Callout 库的任何信息。

ObjectScriptUser.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.dlloutputlibrary.dll 的系统索引条目。它还获取库 ID 的当前值。此类的开发人员仍然需要了解有关 Callout 库代码的一些信息,但将来对系统索引的更改将是透明的。
  • FormatData()RefineData()PlotGraph() 方法均封装了对一个库函数的调用。由于它们仅包含无条件 $ZF 函数调用,因此它们将被优化为与原始 $ZF 调用一样快地运行。

以下示例演示了最终用户如何使用 User.GraphData 中的方法。 GetGraph() 方法使用 Callout 库执行与 $ZF(-5) 接口示例中的 GraphSomeData() 方法完全相同的任务(请参阅前面的“使用 $ZF(-5) 通过系统 ID访问库”)本章),但它不直接调用任何$ZF` 函数:

文章来源:https://blog.csdn.net/yaoxin521123/article/details/135543633
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。