パッケージと名前空間¶
従来のパッケージ¶
package は、従来のBiz/Browserで利用されていた、他のCRSファイルから
ロードするオブジェクト、ファンクション、クラスなどをまとめるための構文です。
Biz/Browser DTでは、パッケージの概念を拡張した構文として namespace が追加されました。
パッケージは、通常、パッケージ名と同じ名前のCRSファイルに定義します。
例えば、sample1.crs に次のように記述します。
package sample1 {
Number data1;
Number data2;
function func1() {
return data1;
}
}
このCRSファイルを別のCRSから import sample1; としてロードすると、
パッケージ名 sample1 がグローバル名前空間に登録されます。
パッケージ内のオブジェクトやファンクションは、パッケージ名を付けて参照できます。
import sample1;
var d1 = sample1.data1;
var d2 = sample1.func1();
package ブロックでは、パッケージ自身の名前空間が暗黙的に using されます。
そのため、パッケージ内の定義から同じパッケージに属する名前を参照するときは、
通常、パッケージ名による修飾を省略できます。
名前空間とは¶
名前空間には、クラス、ファンクション、オブジェクトを含めることができます。
名前空間例 (MyPackage.crs)
namespace MyPackage {
/* 名前空間定数 (Biz/Browser DT 1.1.0より追加されました) */
const MY_CONSTANT = 123;
/* $定数 */
const $MY_DOLLAR_CONST = "abc";
/* クラス */
class MyButton extends Button {
Title = "MyButton";
Function OnTouch(e) {
MessageBox("Hello");
}
}
/* ファンクション */
Function MyFunction(text) {
return MessageBox(text);
}
/* オブジェクト */
String MyData = "sample";
}
多くの言語と同様で、名前空間を用いることでクラス名を修飾することができます。
上記の場合、例えば定義される"MyButton"クラスの正規名称は"MyPackage::MyButton"となります。
上記例のMyButtonを利用する場合、次のように記述します。
MyPackage::MyButton btn {
X = 10;
Y = 10;
Width = 100;
Height = 30;
}
名前空間に含めたファンクションは、名前空間名で修飾して任意のスコープから呼び出すことができます。
上記例のMyFunctionを利用する場合、次のように記述します。
MyPackage.MyFunction("sample");
名前空間に含めたオブジェクトも同様に、名前空間名で修飾して任意のスコープから参照することができます。 上記例のMyDataを利用する場合、次のように記述します。
MessageBox(MyPackage.MyData);
名前空間を含むCRSファイルを import すると、名前空間はグローバル名前空間を起点として登録されます。
import後は、名前空間名で修飾してメンバを参照するか、using namespace を指定して修飾を省略できます。
ここでの import はCRSファイルをロードする処理であり、Record クラスを使ってデータを
グローバル名前空間へ登録する処理ではありません。
グローバル名前空間へのロード方法については、グローバル名前空間 を参照してください。
名前空間の利用とパッケージ化¶
namespace は、Formなどを定義したアプリケーション画面とは別のCRSファイルに
定義して、他のCRSから import して利用できます。
アプリケーション固有のクラス、ファンクションや定数などを名前空間に定義して
import することにより、他のCRSプログラムからライブラリのように利用できます。
従来の package と namespace の違いは次のとおりです。
構文 |
主な特徴 |
参照方法 |
|---|---|---|
|
従来のパッケージ構文。パッケージ名がグローバル名前空間に登録され、パッケージ自身の名前空間が暗黙的に |
|
|
パッケージの概念を拡張した名前空間構文。名前空間を階層化でき、明示的なスコープとして利用できます。 |
|
以下は、MyPackageを利用する画面の例です。
利用例 (Form1.crs)
import "MyPackage.crs";
Form Form1 {
Width = 800;
Height = 600;
MyPackage::MyButton btn {
X = 10;
Y = 10;
Width = 120;
Height = 30;
}
}
名前空間とusing指定¶
名前空間で修飾されたクラス名を用いることで、クラス名の衝突を避けてシンプルな命名を行うことができます。
しかしながら、同じ名前のクラスが他に存在しない場合、クラス名すべてに名前空間を修飾するのが煩わしい場合があります。
このような場合、using指定を行うことで修飾無しのクラス名のみで名前空間内のクラスを扱うことが可能となります。
import "MyPackage.crs";
using namespace MyPackage; # MyPackage内のすべてのクラスが修飾無しでアクセス可能となります。
Form Form1 {
Width = 800;
Height = 600;
MyButton btn { # 修飾名無しでのMyButtonクラスの指定
X = 10;
Y = 10;
Width = 120;
Height = 30;
}
}
または、namespaceブロックの代わりにpackageブロックを使用した場合、using指定を行ったと同じ動作となります。
package MyPackage {
:
}
# using namespace MyPackage; が暗黙的に呼ばれる。
using指定は、その文が実行されてからプログラムが終了するまで有効となります。
また、異なる名前空間のクラスがusing指定された場合、後に指定されたクラス名が修飾無しでアクセス可能となります。
そのため、using指定は乱用せず、プログラムの最初にまとめて行うことをおすすめします。
名前空間,パッケージ利用の留意点¶
名前空間,パッケージの有効期間¶
名前空間やパッケージは、一度Biz/Browserにロードされると//.login()メソッドや//.logout()メソッドによりセッションがリセットされるまでメモリ上に常駐します。
パッケージ内にあまり大きなデータや非常に多くのファンクションを定義すると多くのメモリを消費することに注意してください。
動作速度への考慮¶
一つのパッケージ内にあまりに大きなデータや非常に多くのファンクションを定義すると動作速度が低下することがあるので注意してください。
多くのデータを定義する必要がある場合、パッケージを細分化するか、名前空間を階層化して定義したほうが動作速度に対する影響は少なくなります。
namespace MyPackage {
namespace DataSet1 {
String Data1 = "sample1";
String Data2 = "sample2";
:
}
namespace DataSet2 {
String Data3 = "sample3";
String Data4 = "sample4";
:
}
:
アプリケーションの先頭で、アプリケーションに用意されている全てのパッケージをimportする必要はありません。
いつでもimportは可能ですのでCRSファイルごとに本当に必要なパッケージをimportするほうが効率よく動作します。
一度に全てのパッケージをimportした方がプログラムの開発は容易ですが、実際には使われないパッケージもロードされてしまうため、起動に時間がかかったりアプリケーションの動作速度が低下する弊害があることに注意してください。