パッケージと名前空間

名前空間とは

名前空間には、クラス、ファンクション、オブジェクトを含めることができます。


名前空間例 (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);

名前空間内のファンクションやデータは、Recordを使ったグローバル名前空間へのimportと同じように利用することができます。

名前空間の利用とパッケージ化

通常は、名前空間はFormなどを定義したアプリケーション画面とは別のCRSファイルとして作成します。 これをパッケージと呼びます。

アプリケーション固有のクラス、ファンクションや定数などをパッケージに定義してimportすることにより、他のCRSプログラムからライブラリのように利用することができます。

以下は、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した方がプログラムの開発は容易ですが、実際には使われないパッケージもロードされてしまうため、起動に時間がかかったりアプリケーションの動作速度が低下する弊害があることに注意してください。