JavaScriptのヘルパー関数に推奨されるアプローチは何ですか?


9

ヘルパー関数の推奨アプローチは何ですか?1つの手法を選択し、それを実行して新しい「クラス」を作成します。

ここに私が考えたデザインオプションがあります:

オプション1:外部スコープのヘルパー関数、インスタンスのコンテキストで呼び出す

function createPane (pane) {
    // logic to create pane
    var proto = Object.create(this.paneList);
    $.extend(paneProto, pane);
    return paneProto;
}

Panes.prototype.initialize = function (panes) {
    var _this = this;
    _.each(panes, function () {
        _this.panes.push(createPane.call(_this, this));
    });
}
  • 長所:単純な構文。createPaneインスタンスで公開されていません。
  • 短所: createPane他のスコープでアクセスできます。

オプション2:クロージャー内のヘルパー関数、インスタンスのコンテキストで呼び出す

Panes.prototype.initialize = (function () {

    function createPane (pane) {
        // same logic as last createPane
    }

    return function (panes) {
        // same logic as before - calls createPane
    }

})();
  • 長所: createPaneインスタンスでは公開されません。
  • 短所:読みやすさとテストのしやすさ。このヘルパーのテストは、初期化の範囲で行う必要があります。

オプション3:プライベートメソッドを示す名前の前に_を追加する

Panes.prototype._createPane = function (pane) {
    // same logic as last createPane
}

Panes.prototype.initialize = function (panes) {
    // same logic as last, except calls this._createPane
}
  • 長所:の暗黙的なコンテキスト_createPaneはインスタンスです。外部からのテスト容易性。
  • 短所:インスタンスでヘルパー関数を公開する。

オプション4:引数としてのヘルパー関数

Panes.prototype.initialize = (function (createPane) {

    return function (panes) {
        // same logic as before - calls createPane
    }

})(function createPane () {
   // same logic as last createPane
});
  • 長所: createPaneインスタンスでは公開されません。ヘルパー関数は相互にアクセスできません。
  • 短所:読みやすさとテストのしやすさ。このヘルパーのテストは、初期化の範囲で行う必要があります。

回答:


4

最初のJavaScriptにはクラスがありません。

2番目に、3番目のオプションは私にはより合理的ですが、要件にも大きく依存します。また、ヘルパー関数を公開することについてそれほど心配する必要はありません。ソリューションの長所は、私に対する妥協を完全に正当化します。

第三に、開発者としてのあなたの時間は貴重です。些細なタスクの実装を困難にし、時間がかかり、ヒューマンエラーが発生しやすくすることは避けてください。ソースコードのシンプルさはそれ自体が素晴らしい機能です。


1
マハディありがとうございます。私は長い間JavaScriptユーザーであり、そうです。それが、私が引用で「クラス」を書いた理由です。ただし、用語は誤解を招きやすく、多くの専門組織ではJavaScriptのコンストラクター関数をクラスと呼んでいます。developer.mozilla.org/en-US/docs/Web/JavaScript/...
TaylorMac

そして、単純さについての提案をありがとう。私の質問は、何よりもスコープ、アクセシビリティについてです。厳密対緩い。
TaylorMac 2014

@TaylorMacどういたしまして、お役に立てば幸いです。
Mahdi、2014年

1

スタティックは関数IMOに属しています。あなたの場合、プライベートスタティックがあるので...

Panes._createPane=function(pane){}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.