È una funzione ottenere un valore da un'altra funzione considerata pura?

8

Sto cercando di capire come gestire i valori delle variabili di default quando si eseguono funzioni senza effetti collaterali e si è finito con quanto segue:

function getDefaultSeparator() {
    return ':';
}

function process(input, separator) {
    var separator = separator || getDefaultSeparator();

    // Use separator in some logic

    return output;
}

Il separatore predefinito verrà utilizzato in altre funzioni e desidero solo definirlo in un unico punto.

Se questa è una funzione pura, qual è la differenza dall'uso di una costante globale DEFAULT_SEPARATOR invece?

    
posta agost 14.03.2016 - 15:26
fonte

3 risposte

22

Is a function getting a value from another function considered pure?

Dipende da cosa fa l'altra funzione e da cosa fa la funzione chiamante. L'impurità è contagiosa, la purezza non lo è.

Chiamare una funzione pura non cambia la purezza della funzione chiamante. Chiamare una funzione impura rende automaticamente impura anche la funzione di chiamata.

Quindi, nel tuo esempio, dipende dalla purezza della parte che hai tralasciato: se quello è puro, allora l'intera funzione è pura.

If this is a pure function, what is the difference from just using a global DEFAULT_SEPARATOR constant instead?

Niente. Una funzione che restituisce sempre lo stesso valore è indistinguibile da una costante. In effetti, questo è esattamente il modo in cui le costanti sono modellate in λ-calcolo.

    
risposta data 14.03.2016 - 15:48
fonte
6

Sì, quelle sono entrambe pure funzioni (supponendo che la parte elificata sia pure) perché:

  1. Il risultato dipende solo dai parametri.
  2. Non ci sono effetti collaterali

Nota che se getDefaultSeparator() non era una funzione pura, allora neanche process() sarebbe puro.

In Javascript, non vi è alcuna differenza significativa tra l'utilizzo di una funzione pura o di una costante ed entrambi possono essere usati dalla funzione pura, purché sia evitata la capacità di Javascript di ridefinire le funzioni o di alterare i valori delle costanti.

Un concetto chiave dietro le funzioni pure è che potrebbero essere sostituiti con il valore che restituiscono senza influenzare i risultati del programma.

    
risposta data 14.03.2016 - 15:52
fonte
1

Come dicono gli altri, certo, è pur sempre una funzione pura.

Tuttavia, parliamo dei problemi di progettazione. Hai ragione a provare a fare qualcosa per mantenere il codice ASCIUTTO, mettendo il valore in una sola volta. Inoltre, quello che penso dovrebbe essere considerato è il livello di accoppiamento appropriato.

L'uso di una funzione ti dà più flessibilità nel cambiare l'implementazione, il che significa che l'approccio alla funzione offre un accoppiamento più lento di una variabile globale.

La domanda è se ce n'è bisogno o no?

Se i consumatori e il provider si trovano nello stesso modulo e il provider è privato per il modulo, è difficile sostenere che questo livello di accoppiamento lento sia necessario, perché se il provider richiede l'aggiornamento da un privato variabile con un metodo privato, un semplice refactoring all'interno del modulo può essere applicato ai consumatori allo stesso tempo. L'utilizzo di un metodo / funzione prima che tu abbia realmente bisogno potrebbe cadere sotto YAGNI.

Anche se il (i) consumatore (i) e il fornitore si trovano in moduli diversi, eppure i moduli sono messi insieme (ad esempio, si usa un minificatore, in modo che i moduli dei consumatori e del fornitore si trovino nello stesso file), YAGNI può applica anche.

D'altra parte, se, per esempio, il produttore si trova in una libreria o in un pacchetto o modulo API che è versionato separatamente dal / i consumatore / i, allora l'uso della funzione potrebbe essere appropriato. In tal caso dovremmo considerare la longevità dell'API e principi come l'OCP.

(In un'altra nota, se il tuo codice ha dimensioni significative, incoraggerei l'uso di moduli con campi e metodi piuttosto che variabili e funzioni globali.)

    
risposta data 14.03.2016 - 17:04
fonte

Leggi altre domande sui tag