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;