複数人数での開発や、プラグインなどで開発者の意図しない場所やタイミングで実行させられる可能性がある場合、考えないといけないことを次の3つに絞ってみました。
- 二回実行させられることを極力避ける
- グローバルの名前空間を出来る限り汚染しない
- かといってスペルミスなどを防ぐために名前空間を使いやすい形にする。出来るだけIDEの補完がきくようにする
1は自分のファイル名をどこか変数に入れておいたあとにDOMのscriptタグを調べて、src属性にファイル名が複数回存在しないかチェックしてもいいですが(むしろそのほうが複数回存在したらその都度実行する場合に柔軟に対応出来るため使い勝手が良いのですが)、今回はドキュメントクラスのインスタンスを一つだけ保持するという形で対応してみました。
2と3はまあ普通にfunction内に名前空間を閉じ込めてエイリアスを作成する形で対応しています。
グローバルにprojectInit()を作成してしまうので、まだ気に入ってないですが複数ファイルにまたがって(出来るだけ1ファイル1クラスにまとめたい)名前空間をやりとりするのがいいのか、今回みたいに出来るだけ単純な関数名用意して内部で複雑な名前空間を扱ったらいいのかはまだ試行錯誤の段階です。
project.js
/**
* @fileoverview プロジェクトの一番最初に読み込まれるファイルです。
* 名前空間を作成して返す関数を作ります。
*/
function projectInit(){
/**
* @const
* @type {String}
*/
var NAMESPACE = "jp_utweb_sample_ideTest";
if(!document[NAMESPACE]){
document[NAMESPACE] = {};
}
return document[NAMESPACE];
}
main.js
/**
* @fileoverview Mainクラス
*/
;(function(ns){
/**
* ドキュメントが最初に実行するMainクラスです。
* @constructor
*/
ns.Main = function(){};
})(projectInit());
run.js
/**
* @fileoverview Mainクラスがまだ存在しなければインスタンス化し、実行するクラスです。
*/
;(function(ns){
/**
* ドキュメントクラスMainが存在しなければ実行します。
*/
if(!ns.run){
var main = new ns.Main();
ns.run = main;
}
})(projectInit());