Ayant vu beaucoup de fonctions pures et comment elles n'ont aucun effet secondaire, quel serait un exemple d'une fonction impure, qui a toujours été opposée comme source instable et principale d'erreur?

14
user2167582 6 mars 2016 à 12:11

5 réponses

Meilleure réponse

Par exemple, une fonction impure qui a un effet secondaire sur une variable en dehors de sa propre portée:

var count = 0;

function increaseCount(val) {
    count += val;
}

Ou une fonction qui renvoie des valeurs différentes pour la même entrée car elle évalue une variable qui n'est pas donnée en paramètre:

var count = 0;

function getSomething() {
    return count > 0;
}
22
migg 6 mars 2016 à 09:20

Une fonction pure ne dépend pas et ne modifie pas les états des variables hors de sa portée.

Concrètement, cela signifie qu'une fonction pure renvoie toujours le même résultat avec les mêmes paramètres. Son exécution ne dépend pas de l'état du système.

var values = { a: 1 };

function impureFunction ( items ) {
  var b = 1;

  items.a = items.a * b + 2;

  return items.a;
}

var c = impureFunction( values );
// Now `values.a` is 3, the impure function modifies it.

Ici, nous modifions les attributs de l'objet donné. Nous modifions donc l'objet qui se situe en dehors de la portée de notre fonction: la fonction est impure.

var values = { a: 1 };

function pureFunction ( a ) {
  var b = 1;

  a = a * b + 2;

  return a;
}

var c = pureFunction( values.a );

On modifie simplement le paramètre qui est dans le cadre de la fonction, rien n'est modifié à l'extérieur!

var values = { a: 1 };
var b = 1;

function impureFunction ( a ) {
  a = a * b + 2;

  return a;
}

var c = impureFunction( values.a );
// Actually, the value of `c` will depend on the value of `b`.
// In a bigger codebase, you may forget about that, which may 
// surprise you because the result can vary implicitly.

Ici, b n'est pas dans la portée de la fonction. Le résultat dépendra du contexte: surprises attendues!

var values = { a: 1 };
var b = 1;

function pureFunction ( a, c ) {
  a = a * c + 2;

  return a;
}

var c = pureFunction( values.a, b );
// Here it's made clear that the value of `c` will depend on
// the value of `b`.

Référence: Pour plus de détails, cliquez ici

6
abhiagNitk 6 mars 2016 à 09:50

Fonction pure (obtenir l'argument et renvoyer une nouvelle valeur):

function (objectArgument) {
   return {
       value: objectArgument.value + 123,
       // other arguments
   };
}

Fonction impure (récupérer l'argument, le modifier et renvoyer l'objet modifié):

function (objectArgument) {
   objectArgument.value += 123;
   return objectArgument;
}
0
Dmitriy 6 mars 2016 à 09:18

Un exemple auquel je peux penser (qui est en effet assez déroutant) est Array#reverse(). Au lieu de renvoyer un nouveau tableau, il le modifie en place lors du retour du tableau d'origine.

Certaines autres fonctions de tableau le font également, telles que splice, push, shift, pop, unshift.

0
Scimonster 6 mars 2016 à 09:15

Math.random() est une fonction impure; il modifie l'état interne de l'objet Math afin que vous obteniez des valeurs différentes lors des appels successifs. console.log() et alert() sont des fonctions impures car elles ont des effets secondaires (bien qu'elles génèrent le même comportement et renvoient toujours la même valeur pour des appels identiques).

Toute fonction qui modifie l'état interne de l'un de ses arguments ou la valeur d'une variable externe est une fonction impure. Cela inclut les fermetures où l'appel d'une méthode modifie l'état interne de la fermeture elle-même:

let nextInt = (function() {
    var i = 0;
    return function() {
        return i++;
    };
})();

let a = nextInt(); // sets a to 0
let b = nextInt(); // sets b to 1
                   // etc.

D'où vous vient l'idée que les fonctions impures sont toujours considérées comme une mauvaise chose?

3
Ted Hopp 7 mai 2018 à 05:16