Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

クラス・プロジェクションの定義

この章では、クラスをコンパイルまたは削除したときの動作をカスタマイズする手段を提供するクラス・プロジェクションについて説明します。以下のトピックについて説明します。

このドキュメントをオンラインで表示している場合は、このドキュメントの "序文" を使用すると、関連のあるトピックをすばやく見つけることができます。

概要

クラス・プロジェクションは、クラスをコンパイルまたは削除したときの動作をカスタマイズする手段を提供します。クラス・プロジェクションは、クラス定義をプロジェクション・クラスと関連させます。プロジェクション・クラス (%Projection.AbstractProjectionOpens in a new tab クラスから派生) は、Caché が自動的に追加のコードを生成するために、次の 2 つの時点で使用するメソッドを提供します。

  • クラスがコンパイルされるとき

  • クラスが削除されるとき

このメカニズムは、Java プロジェクションや C++ プロジェクション (プロジェクションの語源) によって、クラスがコンパイルされるときは常に、必要なクライアント・バインディング・コードを自動的に生成するために使用されます。

クラスにプロジェクションを追加する

クラス定義にプロジェクションを追加するには、クラス定義内の Projection 文を使用します。

class MyApp.Person extends %Persistent
{
Projection JavaClient As %Projection.Java(ROOTDIR="c:\java");
}

この例では、%Projection.JavaOpens in a new tab プロジェクション・クラスを使用する JavaClient というプロジェクションを定義しています。プロジェクション・クラスのメソッドが呼び出されるとき、そのメソッドは ROOTDIR パラメータの値を受け取ります。

クラスには、一意に名付けられた複数のプロジェクションを含めることができます。複数のプロジェクションの場合、各プロジェクション・クラスのメソッドは、クラスがコンパイルされるとき、または削除されるときに呼び出されます。複数のプロジェクションが処理される順序は、未定義です。

Caché には、以下のプロジェクション・クラスが用意されています。

クラス 説明
%Projection.JavaOpens in a new tab Java からのクラスへのアクセスを可能にする、Java クライアント・クラスを生成します。
%Projection.Monitor このクラスを、Caché モニタで使用するルーチンとして登録します。メタデータが Monitor.ApplicationMonitor.AlertMonitor.Item、および Monitor.ItemGroup に書き込まれます。Monitor.Sample という新規の永続クラスが作成されます。
%Projection.MVOpens in a new tab MV からクラスへのアクセスを可能にする MV クラスを生成します。
%Projection.StudioDocumentOpens in a new tab このクラスをスタジオで使用するルーチンとして登録します。
%Studio.Extension.ProjectionOpens in a new tab XData メニュー・ブロックをメニュー・テーブルに投影します。
%ZEN.Object.Projection %ZEN.Component.objectOpens in a new tab クラスで使用されるプロジェクション・クラス。これを使用して、Zen コンポーネントのコンパイル後のアクションを管理します。
%ZEN.PageProjectionOpens in a new tab %ZEN.Component.pageOpens in a new tab で使用されるプロジェクション・クラス。現在は何も実行しません。
%ZEN.Template.TemplateProjectionOpens in a new tab %ZEN.Templage.studioTemplate クラスで使用されるプロジェクション・クラス。

また、独自のプロジェクション・クラスを生成し、組み込みのプロジェクション・クラスと同様に使用することもできます。

新規プロジェクション・クラスの作成

新規のプロジェクション・クラスを作成するには、%Projection.AbstractProjectionOpens in a new tab クラスのサブクラスを作成し、プロジェクション・インタフェース・メソッドを実装して (サブセクションを参照)、必要なクラス・パラメータを定義します。例えば、以下のようになります。

Class MyApp.MyProjection Extends %Projection.AbstractProjection
{

Parameter MYPARAM;

/// This method is invoked when a class is compiled
ClassMethod CreateProjection(cls As %String, ByRef params) As %Status
{
    // code here...
    QUIT $$$OK 
}

/// This method is invoked when a class is 'uncompiled'
ClassMethod RemoveProjection(cls As %String, ByRef params, recompile as %Boolean) As %Status
{
    // code here...
    QUIT $$$OK 
  }
}

プロジェクション・インタフェース

すべてのプロジェクション・クラスは、クラスのライフ・サイクル中に発生する特定のイベントに応じて呼び出される一連のメソッド、プロジェクション・インタフェースを実装します。このインタフェースは、以下のメソッドで構成されています。

CreateProjection()

CreateProjection() メソッドは、クラス定義のコンパイルが完了した後に、クラス・コンパイラによって呼び出されるクラス・メソッドです。このメソッドは、プロジェクション用に定義されたパラメータ値 (パラメータ名によって添え字にされている) を含む配列と同様、コンパイルされたクラスの名前を渡されます。

RemoveProjection()

RemoveProjection() メソッドは、以下のいずれかの場合に呼び出されるクラス・メソッドです。

  • クラス定義が削除されたとき

  • クラスのリコンパイルの開始時

このメソッドは、削除されるクラスの名前、プロジェクション用に定義されたパラメータ値を含む配列 (パラメータ名によって添え字にされている)、メソッドがリコンパイルの一部として呼び出されているかを示す、またはクラス定義が削除されていることを示すフラグを渡されます。

プロジェクションを含むクラス定義がコンパイルされるとき、以下のイベントが発生します。

  1. クラスが以前にコンパイルされている場合、新規のコンパイルが開始される前に、そのクラスはアンコンパイルされます (つまり、以前のコンパイルのすべての結果は削除されます)。ここで、コンパイラはリコンパイルが発生することを示したフラグ付きで、すべてのプロジェクションに対して RemoveProjection() メソッドを呼び出します。

    この時点でクラスは存在しないので、RemoveProjection() メソッド内部から関連するクラスのメソッドを呼び出すことができないことに注意してください。

    また、以前に (プロジェクションなしで) コンパイルされたクラスに対する新規のプロジェクション定義を追加する場合、CreateProjection() メソッドが今までに呼び出されたことがなくても、コンパイラは次のコンパイル時に RemoveProjection() メソッドを呼び出します。RemoveProjection() メソッドを実装するユーザは、この可能性を計画する必要があります。

  2. クラスが完全にコンパイルされた後 (つまり、使用準備ができたということ)、コンパイラはすべてのプロジェクションに対して CreateProjection() メソッドを呼び出します。

クラス定義が削除されたとき、すべてのプロジェクションに対して、RemoveProjection() メソッドが削除フラグを付けて呼び出されます。

FeedbackOpens in a new tab