公開技術情報

[English] [Japanese]

26. subfile 編

モジュールの処理が大きくなると、それに伴ないファイルが肥大化する。

ファイルの肥大化に良いことはないため、 このような場合はモジュールの責務を細分化し、 それぞれのモジュール毎にファイルを分けるのが一般的なリファクタリングである。

しかし、綺麗に責務を分割できない場合や、 分割すると他のモジュールに与える影響が大きくなってしまう事もよくある。 このようにモジュール分割による対応が出来ない場合の代替手段として、 サブファイル化を行なう。

サブファイル化とは、 本来 1 つのファイルで構成するモジュールを複数のファイルに分割することである。

LuneScript は、原則 1 モジュール = 1 ファイルであるが、 サブファイル化した場合は、1 モジュール = 複数ファイルとなる。

サブファイル構成

サブファイルは 1 つの main と、複数の sub で構成される。

- main
  +- sub1
  +- sub2
  +- ...
  +- ...
  +- subN

使用方法

次のように foo/bar ディレクトリ以下に、 main.lns, sub.lns が存在し sub.lns が main.lns のサブファイルの場合、

foo/bar
     + main.lns
     + sub.lns

サブファイルを利用するには、 main 側で次のように宣言する。

// @lnsFront: skip
subfile use foo.bar.sub;

また、サブファイル側では次のように宣言する。

// @lnsFront: skip
subfile owner foo.bar.main;

これにより、 指定したモジュール(上記の例では foo.bar.sub)を分割されたサブファイルとして扱い、 sub.lns は main.lns のモジュールの一部として処理する。

制限

モジュールの宣言は、スクリプトの先頭で行なう必要がある。 ただし、コメントは除く。

subfile use は、1 つのファイル内で複数宣言できる。 subfile owner は、一つだけ宣言できる。 つまり、1 つのファイルは複数のサブファイルを持てるが、 1つのサブファイルは1つのオーナからしか利用できない。

subfile use を複数宣言した場合、宣言した順でサブファイルを処理する。

サブファイルは C の #include と基本的には同じと考えて良いが、 次の点で #include と異なる。

  • C の #include は宣言した箇所にファイルを展開するが、 LuneScript ではファイルの最終位置にサブファイルを展開する。
  • サブファイルは、 statement として完結している必要がある。

    • #include のような、式の一部をサブファイル内には書けない。
  • サブファイルに対するメインファイルは 1 つでなければならない。
  • サブファイルから、さらにサブファイルを利用することはできない。

例えば、次の main.lns, sub1.lns, sub2.lns があった場合、

  • main.lns
// @lnsFront: skip
//------ main.lns -------
subfile use sub1;
subfile use sub2;

pub let val = 1;
  • sub1.lns
// @lnsFront: skip
//------ sub1.lns -------
subfile owner main;

pub let val1 = 1;
  • sub2.lns
// @lnsFront: skip
//------ sub2.lns -------
subfile owner main;

pub let val2 = 1;

main.lns は次のスクリプトと等価である。

// @lnsFront: skip
//------ main.lns -------
pub let val = 1;
pub let val1 = 1;
pub let val2 = 1;