今回はGASのライブラリでクラス化を補完について書きます。
GASでライブラリをクラス化と補完の問題
GASのライブラリは補完が有効になるため、開発をラクにする為にも、
ライブラリをとりあえず作るシーンはよくあります。
またライブラリを設計する上で、内部でクラスを作り、
そのインスタンスを利用させるような物を作ることも多々あると思います。
ただGASでは、このライブラリ(で補完)とクラスは少し相性が悪いです。
理由はライブラリ化した際、補完メソッドとして表示されるのは、グローバルメソッドのみだからです。
メソッド名が補完できるライブラリのメソッド.js
/**
* このメソッドはライブラリを利用する方で補完できる
* @param {string} templateName テンプレートの名称
* @return {Page} 見つけたテンプレートページ
*/
function getTemplateByName(templateName) {
//処理
}
クラス化する場合、クラスの内部のメソッドはグローバルメソッドとならないため、補完が出来ないです。
クラス化されている場合、補完できない.js
function HogeClass(fuga) {
this.fuga = fuga;
}
//このHogeClass.getFugaは補完できない
HogeClass.prototype.getFuga = function() {
return this.fuga;
};
良い感じでクラス化と補完を出来るようにする。
微妙に嫌なハックですが、クラス化と、補完を両立させるには、
「クラスのメソッドのダミーをグローバルメソッドに書く」
ということをします。
クラス化しつつ、メソッドが補完できる.js
//このライブラリのプロジェクト名はHogeとする。
/**
* HogeClassをインスタンス化するためのファクトリメソッド
* @param {string} fuga HogeClassのコンストラクタ引数を指定
* @return {Hoge} ←の{}の中にライブラリのGASプロジェクトと同じ名前を指定する。
*/
function createHoge(fuga) {
return new HogeClass(fuga);
}
//HogeClassの中で補完させたいメソッドのダミーメソッドをグローバルメソッドとして作る。
/**
* Fugaを取得します。
* @return {string} fuga
*/
function getFuga() {
throw new Error('createHogeを呼び出してから呼び出してください。')
}
//HogeClassメソッド自体は補完させたくないので隠す
(function(global){
function HogeClass(fuga) {
this.fuga = fuga;
}
//このHogeClass.getFugaは補完できない
HogeClass.prototype.getFuga = function() {
return this.fuga;
};
global.HogeClass = HogeClass;
})(this);
これにより、ライブラリの利用側では、Hoge.createHoge('fuga').getFuga()
の全てが補完可能になります。
少し手間はかかりますが、補完が効くようになり、自作ライブラリの使い勝手もかなり良くなります。
※参考例
Yahooの日本語API周りを扱うライブラリ
apiKey毎にインスタンスを作成したかったのでクラス化しています。