Dati condivisi nella programmazione funzionale

3

Ho lavorato a un progetto in JavaScript che richiede una struttura dati (sola lettura), da condividere tra due funzioni.

var mySharedData = ['hours', 'minutes', 'seconds'];

Ora ho due funzioni che richiedono l'accesso a questa struttura di dati di sola lettura (statica).

var sampleFunction1 = function(userSuppliedData) {
    //map over user data applying mySharedData to it
};

var sampleFunction2 = function(userSuppliedData) {
    //reduce user data also accessing mySharedData
};

Poiché questo è JavaScript e entrambe le funzioni sono nello stesso ambito, potrei semplicemente "imbrogliare" e sfruttare il cattivo scope di var e accedere ai dati condivisi in entrambe le funzioni, ma non mi sembra che questo sia il modo corretto di fare esso.

Ho anche considerato di utilizzare entrambe le funzioni e di passare i dati condivisi come primo argomento in questo modo:

var mySharedData = ['hours', 'minutes', 'seconds'];

var sampleFunction1 = _.curry(function(sharedData, userSuppliedData) {
    //map over user data applying sharedData to it
})(mySharedData);

var sampleFunction2 = _.curry(function(sharedData, userSuppliedData) {
    //reduce user data also accessing sharedData
})(mySharedData);

Qual è il modo consigliato di condividere i dati tra le funzioni? Questo dovrebbe essere fatto anche nella programmazione funzionale o sto rendendo impure le mie funzioni con strutture dati condivise?

    
posta KanskjeBen 22.08.2015 - 18:28
fonte

2 risposte

5

Se mySharedData è privato per entrambe le chiusure:

(function (context) {
    var mySharedData = ['hours', 'minutes', 'seconds'];

    context.sampleFunction1 = function (userSuppliedData) {
        //map over user data applying mySharedData to it
        // mySharedData....
    };

    context.sampleFunction2 = function (userSuppliedData) {
        //reduce user data also accessing mySharedData
        // mySharedData....
    };
})(this);

Se mySharedData è pubblico:

var mySharedData = ['hours', 'minutes', 'seconds'];

var sampleFunction1 = function (userSuppliedData) {
    //map over user data applying mySharedData to it
    // mySharedData...
};

var sampleFunction2 = function (userSuppliedData) {
    //reduce user data also accessing mySharedData
    // mySharedData...
};

Se ciò di cui hai bisogno è che mySharedData non possa essere modificato:

Object.defineProperty(this, 'mySharedData', {
    get: function () {
        return ['hours', 'minutes', 'seconds'];
    }
});

console.log(mySharedData);
// ['hours', 'minutes', 'seconds']

mySharedData.push('foo');
mySharedData[1] = 'bar';

console.log(mySharedData);
// ['hours', 'minutes', 'seconds']
    
risposta data 10.09.2015 - 14:13
fonte
-2

Usalo come vuoi.

L'uso di una costante immutabile da due funzioni non è in alcun modo problematico o impuro.

Un problema sorge se una delle funzioni modifica il valore. In JS questo può essere prevenuto dichiarando il binding con const e usando Object.freeze per rendere il valore immutabile.

    
risposta data 03.03.2016 - 13:40
fonte

Leggi altre domande sui tag