最近のアクセス:
オブジェクトの部分修飾名の解決方法

コードを記述するときに、完全修飾名を使用しなくてもオブジェクトを参照できます (完全なモジュールパスではない名前を入力できます)。オブジェクトの部分修飾名は自動修飾ルールに従って解決されます。

自動修飾ルール

自動修飾ルールは、たとえば参照元オブジェクトのソースコードに含まれるオブジェクトの部分修飾名の参照に適用されます。たとえば、次の図で完全修飾名を指定しないで ObjectB を参照した場合に、どのオブジェクトを参照しているかを特定するために GeneXus が従うルールです。
自動修飾の基本的な目的は、モジュールに対して作業している開発者が、必要な場合 (ほかのモジュールとの連携が必要な場合) を除き、ナレッジベース内のほかのモジュールを意識しなくてもいいようにすることです。
この目的を達成するため、自動修飾では、参照元を考慮します。たとえば、ModuleA.ObjectE から ObjectC への参照と、ModuleB.ObjectB から ObjectC への参照は同じ方法では解決されません (下図を参照)。
モジュールは、ツリー構造になっています。ルートモジュールを除くすべてのモジュールに「親」モジュールがあり、場合によっては「子」モジュールもあります。「モジュールブランチ」は、任意のモジュールとその上位モジュールから構成される一連のモジュールです。「モジュールツリー」は、任意のモジュールとその下位モジュールから構成される一連のモジュールです。これらの概念を理解していることが重要です。これらの概念を使用して、自動修飾の仕組みについて説明します。
イメージ:22436.png
縦線は、重複している名前を特定しやすいように引いてあります。
自動修飾アルゴリズムの仕組みは次のとおりです。
  1. オブジェクト名がナレッジベース内で一意である場合、呼び出しはそのオブジェクトに解決されます。
  2. オブジェクト名が一意ではない場合は、呼び出し元のモジュールでオブジェクトの部分修飾名が検索され、そのオブジェクトに解決されます。
  3. オブジェクトが見つからなかった場合は、引き続き呼び出し元のモジュールのサブモジュールが検索され、そのオブジェクトに解決されます。1
  4. オブジェクトが見つからなかった場合は、呼び出し元のモジュールの親モジュールを使用して、手順 2 と 3 が繰り返されます。1
    オブジェクトが見つかるまでこの処理が続きます。
1: オブジェクトが 2 つ見つかり、同じ部分修飾名のオブジェクトが他にない場合は、呼び出しがあいまいなので、エラーが表示されてアルゴリズムが停止します。開発者は、オブジェクトを修飾して、あいまいさを解消する必要があります。
これは、次のルールを使用して説明できます。説明は後述します:
  • 参照先オブジェクト名が、参照元オブジェクトのコンテナ モジュール ツリーで一意
  • 参照先オブジェクト名が、参照元オブジェクトのコンテナ モジュール ブランチに存在
  • あいまいな呼び出し

参照先オブジェクト名が、参照元オブジェクトのコンテナ モジュール ツリーで一意

このルールは分かりにくい名前になっていますが、理解しやすいように例を使って説明します。

例 1

任意のモジュール内の任意のオブジェクトから ObjectA を参照しているとします。ナレッジベース (ルートモジュール) に ObjectA というオブジェクトは他にないので、この参照は自動的に ModuleA.ObjectA と修飾されます。

例 2

ModuleA、ModuleC、ModuleD、ModuleE、および ModuleF 内のオブジェクトから ObjectB への修飾されていない参照は、自動的に ModuleA.ObjectB と修飾されます。ObjectB は、前述の任意のモジュールのコンテナモジュールである ModuleA のモジュールツリーで一意です。

例 3

ModuleA のモジュールツリーには ObjectC というオブジェクトが 2 つありますが、ModuleC、ModuleD、ModuleB には 1 つだけです。ModuleC、ModuleD、ModuleB のいずれかのモジュールから修飾なしで ObjectC を参照した場合、自動的に ModuleC.ObjectC、ModuleD.ObjectC、および ModuleB.ObjectC に修飾されます。

参照先オブジェクト名が、参照元オブジェクトのコンテナ モジュール ブランチに存在

参照先オブジェクト名が、参照元オブジェクトのコンテナ モジュール ツリーで一意ではなく、参照元オブジェクトのコンテナ モジュール ブランチに同じ名前のオブジェクト (参照先オブジェクト) がある場合、修飾されていない参照は、そのオブジェクトに解決されます。理解しやすいように、例をいくつか示します。

例 1

モジュール ModuleC 内のオブジェクトから ObjectE を参照しているとします。名前 ObjectE は、ModuleC のコンテナ モジュール ツリーで一意ではありません。ただし、ModuleC のブランチに ObjectE というオブジェクトが 1 つあります。参照は、ModuleC.ObjectE と修飾されます。

あいまいな呼び出し

場合によっては、自動修飾ルールで、オブジェクトの部分修飾名の参照を解決できないことがあります。このような場合、次のエラーが表示されます:
error: '{ObjectQualifiedName}' is ambiguous, there are more than one object with this name.Use the full qualified name to resolve the ambiguity.
Conflicting objects: {ObjectType_1} '{FullyQualifiedName_1}', {ObjectType_2} '{FullyQualifiedName_2}', ... [ {ObjectType_N} '{FullyQualifiedName_N}' ] 
例 1
イメージ:25680.png
ObjectG から ObjectH を呼び出した場合 (上図を参照)、呼び出しは自動的に解決できず、次のエラーが表示されます:
error: 'ObjectH' is ambiguous, there are more than one object with this name.Use the full qualified name to resolve the ambiguity.
Conflicting objects: Web Panel 'ModuleG.ModuleH.ObjectH', Web Panel 'ModuleG.ModuleI.ObjectH' (ModuleG.ObjectG Events, Line: Y, Char: XXX)





サブページ
Created: 15/01/07 22:48 by Admin Last update: 21/05/21 03:31 by Admin
カテゴリ
Powered by GXwiki 3.0