web-dev-qa-db-ja.com

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

ヘルパー関数の推奨アプローチは何ですか? 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
    }

})();
  • Pros: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
}
  • Pros:_createPaneの暗黙のコンテキストがインスタンスです。外部からのテスト容易性。
  • 短所:インスタンスでヘルパー関数を公開しています。

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

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

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

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

最初のJavaScriptにはClassesがありません。

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

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

4
Mahdi

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

Panes._createPane=function(pane){}
1
Mark