partiell tillämpning - Sekretess i JavaScript


Funktionsomfång erbjuder den enda integriteten i JavaScript.

Så den kanoniska:

function Ctor(dep1, dep2) {
  this._dep1 = dep1;
  this._dep2 = dep2;
}

Ctor.prototype.foo = function() {
  // use this._dep1/2...
}

...är problematiskt eftersom det inte erbjuder någon kapsling för de injicerade beroendena.

Ett alternativ (om än något annorlunda när det gäller placeringen av foo) som erbjuder verklig kapsling kan vara:

function factory(dep1, dep2) {
  return {
    foo: partial(foo, dep1, dep2), // or use bind (partial could be a library fn for partial application)
  };
}

function foo(dep1, dep2) {
  // use dep1/2
}

Men jag ser sällan detta mönster. Finns det en bra anledning att inte använda det senare?

Svar #1

Du nämner redan fördelarna med det andra mönstret. Nackdelarna är:

  • du måste antingen gruppera metoder efter synlighet (även om den privata metoden är intimt relaterad med en offentlig, men knappt relaterad till andra privata metoder), eller upprepa alla offentliga metoder i objektliteralen (vilket inte fungerar bra med jsdoc).

  • koden introducerar ett separat funktionsobjekt för varje instans av din klass, vilket offrar en del prestanda (detta brukar vanligtvis inte spela någon roll, men ibland kan det göra det)

  • till skillnad från privata modifikatorer i många programspråk kan denna kapsling inte kringgås, även om den används felaktigt och jag verkligen vet vad jag gör (historiskt sett har JavaScript varit en miljö där allt är tillåtet, och många tillskriver dess framgång denna utbyggbarhet)

Svar #2

Enkelt: varför?

“Integritet” är oerhört överskattat. Det döljer ingenting från någon som verkligen vill åt det. Att ha “skyddade” eller “privata” medlemmar är helt för programmerarens skull, specifikt för att visa hur en viss medlem ska användas (detta här är ett offentligt API, detta här är inte det, så rör det inte om du inte vet vad det gör). Det är allt. En namngivningskonvention som att börja med understreck är fullt tillräcklig för att implementera det. Om ett medlemsnamn börjar med ett understreck, rör det inte, om du inte vet vad du gör.

Det finns inget inneboende behov av att böja sig längre än så.