Jakie jest zalecane podejście do funkcji pomocniczych w JavaScript?

10

Jakie jest zalecane podejście do funkcji pomocniczych? Chciałbym wybrać jedną technikę i uruchomić ją, aby stworzyć moją nową „klasę”.

Oto opcje projektowania, które rozważałem:

Opcja 1: Funkcja pomocnicza w zewnętrznym zasięgu, wywoływana w kontekście instancji

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));
    });
}
  • Plusy: prosta składnia. createPanenie jest opublikowany w instancji.
  • Minusy: createPane jest dostępny w innych zakresach.

Opcja 2: Funkcja pomocnika w zamknięciu, wywołaj w kontekście instancji

Panes.prototype.initialize = (function () {

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

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

})();
  • Plusy: createPane nie są publikowane w instancji.
  • Wady: niższa czytelność i testowalność; Testowanie tego pomocnika musi odbywać się w zakresie inicjalizacji.

Opcja 3: Wstaw nazwę _, aby wskazać metodę prywatną

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

Panes.prototype.initialize = function (panes) {
    // same logic as last, except calls this._createPane
}
  • Plusy: niejawny kontekst _createPanejest instancją. Testowalność z zewnątrz.
  • Wady: udostępnianie funkcji pomocniczej w instancji.

Opcja 4: Pomocnik działa jako argument

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

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

})(function createPane () {
   // same logic as last createPane
});
  • Plusy: createPane nie są publikowane w instancji. Funkcje pomocnicze nie mają do siebie dostępu.
  • Wady: niższa czytelność i testowalność; Testowanie tego pomocnika musi odbywać się w zakresie inicjalizacji.
TaylorMac
źródło

Odpowiedzi:

4

Pierwszy JavaScript nie ma klas .

Po drugie, trzecia opcja wydaje mi się bardziej racjonalna, ale w dużej mierze zależy również od twoich wymagań. Nie powinieneś też martwić się o ujawnienie funkcji pomocnika. Zalety rozwiązania całkowicie uzasadniają dla mnie kompromis.

Po trzecie, twój czas jako programisty jest cenny; Nie rób trudnych do wykonania trywialnych zadań, czasochłonnych i bardziej podatnych na błędy ludzkie. Prostota kodu źródłowego jest samą świetną funkcją.

Mahdi
źródło
1
Mahdi dziękuję. Jestem długoletnim użytkownikiem JavaScript i tak, dlatego napisałem „klasę” w cudzysłowie. Chociaż terminologia jest myląca, a wiele organizacji zawodowych określa funkcje konstruktora JavaScript jako klasy. developer.mozilla.org/en-US/docs/Web/JavaScript/…
TaylorMac
I dziękuję za sugestię dotyczącą prostoty. Moje pytanie dotyczy bardziej zakresu niż czegokolwiek, dostępności. Surowe kontra luźne.
TaylorMac
@TaylorMac Nie ma za co, mam nadzieję, że to pomoże.
Mahdi
@Mahdi, currenlty Javscript ma klasy.
Menai Ala Eddine
1

Statyka należy do funkcji IMO, w twoim przypadku masz prywatną statyczną, więc ...

Panes._createPane=function(pane){}
znak
źródło