1142 votes

Qu'est-ce qu'une opération idempotente ?

Qu'est-ce qu'une opération idempotente ?

0 votes

Pour les amateurs de mathématiques - f(f(x)) = f(x) . Continuez à lire les réponses pour un contenu plus descriptif !

1272voto

Greg Hewgill Points 356191

En informatique, une opération idempotente est une opération qui n'a aucun effet supplémentaire si elle est appelée plus d'une fois avec les mêmes paramètres d'entrée. Par exemple, la suppression d'un élément d'un ensemble peut être considérée comme une opération idempotente sur cet ensemble.

En mathématiques, une opération idempotente est une opération pour laquelle f(f(x)) = f(x) . Par exemple, le abs() est idempotente car abs(abs(x)) = abs(x) pour tous x .

Ces définitions légèrement différentes peuvent être réconciliées en considérant que x dans la définition mathématique, représente l'état d'un objet, et f est une opération qui peut muter cet objet. Par exemple, considérons l'objet Python set et son discard méthode. Le site discard supprime un élément d'un ensemble, et ne fait rien si l'élément n'existe pas. Ainsi :

my_set.discard(x)

a exactement le même effet que de faire deux fois la même opération :

my_set.discard(x)
my_set.discard(x)

Les opérations idempotentes sont souvent utilisées dans la conception des protocoles de réseau, où une demande d'exécution d'une opération est garantie au moins une fois, mais peut aussi se produire plus d'une fois. Si l'opération est idempotente, il n'y a pas de mal à l'exécuter deux fois ou plus.

Voir l'article de Wikipedia sur idempotence pour plus d'informations.


La réponse ci-dessus comportait précédemment quelques exemples incorrects et trompeurs. Les commentaires ci-dessous écrits avant avril 2014 font référence à une ancienne révision.

22 votes

Exemple : puisque la réponse ci-dessus indique que Idempotent operations are often used in the design of network protocols Voici un exemple connexe **GET n'est pas censé changer quoi que ce soit sur le serveur, GET est donc idempotent. Dans le contexte HTTP/servlet, cela signifie que la même requête peut être faite deux fois sans conséquences négatives. **POST n'est PAS idempotent.

4 votes

Le terme "apatride" est-il synonyme d'"idempotent" ?

4 votes

@MichaelOsofsky : Non, dans le Python. set Dans l'exemple de la réponse, l'objet ensemble a clairement un état et offre également des opérations idempotentes telles que discard .

177voto

Jim Ferrans Points 13673

Une opération idempotente peut être répétée un nombre arbitraire de fois et le résultat sera le même que si elle avait été effectuée une seule fois. En arithmétique, l'ajout de zéro à un nombre est idempotent.

On parle beaucoup de l'idempotence dans le contexte des services web "RESTful". REST vise à exploiter au maximum le protocole HTTP pour permettre aux programmes d'accéder au contenu du Web, et s'oppose généralement aux services Web basés sur SOAP, qui se contentent d'insérer des services de type appel de procédure à distance dans les demandes et les réponses HTTP.

REST organise une application web en "ressources" (comme un utilisateur Twitter ou une image Flickr) et utilise ensuite les verbes HTTP POST, PUT, GET et DELETE pour créer, mettre à jour, lire et supprimer ces ressources.

L'idempotence joue un rôle important dans REST. Si vous obtenez une représentation d'une ressource REST (par exemple, obtenir une image jpeg de Flickr) et que l'opération échoue, vous pouvez simplement répéter l'opération jusqu'à ce qu'elle réussisse. Pour le service web, le nombre de fois où l'image est obtenue n'a aucune importance. De même, si vous utilisez un service web RESTful pour mettre à jour les informations de votre compte Twitter, vous pouvez envoyer les nouvelles informations autant de fois qu'il le faut pour obtenir la confirmation du service web. PUT-er un millier de fois est la même chose que PUT-er une fois. De même, DELETE-er une ressource REST mille fois revient à la supprimer une fois. L'idempotence facilite donc grandement la construction d'un service web résistant aux erreurs de communication.

Pour en savoir plus : Services Web RESTful de Richardson et Ruby (l'idempotence est abordée aux pages 103-104), et l'ouvrage de Roy Fielding, intitulé Thèse de doctorat sur REST . Fielding était l'un des auteurs de la norme HTTP 1.1, RFC-2616, qui parle de l'idempotence en section 9.1.2 .

0 votes

C'est clair et net. Pourtant, c'est mais seulement un interprétation de l'idempotent.

0 votes

@Pacerier : Très vrai, l'idempotence a des applications dans de nombreux autres domaines, comme la programmation fonctionnelle et le traitement des files de messages.

20 votes

"idempotence" est un mot surchargé parce qu'il a l'air grandiloquent et qu'il a suffisamment de caractères pour passer le contrôle de la sesquipédie. Si Benjamin Peirce avait choisi un mot à consonance plus simple, nous n'aurions même pas cette question aujourd'hui.

149voto

Robert Points 1711

Peu importe le nombre de fois que vous appelez l'opération, le résultat sera le même.

8 votes

J'ai entendu dire que l'idempotent était défini comme l'un ou l'autre des cas suivants, ou les deux : 1) Pour un ensemble donné d'entrées, il retournera toujours la même sortie. 2) Elle ne produit pas d'effets secondaires. Ma question est la suivante : si une fonction est conforme à l'article 1, mais pas à l'article 2, parce qu'elle produit un effet secondaire sans rapport avec le calcul (elle enregistre la demande à un magasin de données, par exemple), est-elle toujours considérée comme idempotente ?

13 votes

Le résultat de l'appel d'une opération doit inclure l'état du système, donc si l'opération a un effet secondaire cumulatif, elle n'est pas idempotente ; cependant, si l'effet secondaire laisse le système dans le même état, quel que soit le nombre de fois où l'opération est appelée, alors elle peut être idempotente.

9 votes

Court et gentil, j'aime ce genre de réponse. Je ne sais pas pourquoi je dois constamment chercher ce terme, c'est un terme qui ne me revient pas.

64voto

mikera Points 63056

L'idempotence signifie qu'appliquer une opération une fois ou plusieurs fois a le même effet.

Exemples :

  • Multiplication par zéro. Peu importe combien de fois vous le faites, le résultat est toujours zéro.
  • Définir un drapeau booléen. Peu importe le nombre de fois que vous le faites, l'indicateur reste activé.
  • Suppression d'une ligne de la base de données avec un ID donné. Si vous réessayez, la ligne est toujours supprimée.

Para fonctions pures (fonctions sans effets secondaires) alors l'idempotence implique que f(x) = f(f(x)) = f(f(f(x))) = f(f(f(f(x)))) = ...... pour toutes les valeurs de x

Para fonctions avec effets secondaires L'idempotence implique en outre qu'aucun effet secondaire supplémentaire ne sera provoqué après la première application. Vous pouvez considérer l'état du monde comme un paramètre supplémentaire "caché" de la fonction si vous le souhaitez.

Notez que dans un monde où vous avez des actions concurrentes en cours, vous pouvez constater que des opérations que vous pensiez idempotentes cessent de l'être (par exemple, un autre thread pourrait annuler la valeur du drapeau booléen dans l'exemple ci-dessus). En fait, chaque fois que vous avez de la concurrence et un état mutable, vous devez réfléchir beaucoup plus attentivement à l'idempotence.

L'idempotence est souvent une propriété utile pour construire des systèmes robustes. Par exemple, s'il existe un risque que vous receviez un message en double d'un tiers, il est utile que le gestionnaire de messages agisse comme une opération idempotente afin que l'effet du message ne se produise qu'une seule fois.

1 votes

Si pour les fonctions pures f(x) = f(f(x)) Voulez-vous dire que f(x){return x+1;} n'est pas une fonction pure ? parce que f(x) != f(f(x)) : f(1) donne 2 tandis que f(2) donne 3.

4 votes

@Pacerier Non, @mikera dit "pur". y idempotent implique f(x) = f(f(x)) . Mais, comme l'a mentionné @GregHewgill, pour que cette définition ait un sens, il faut tenir compte des éléments suivants x en tant qu'objet et f comme une opération qui modifie l'état de l'objet (c'est-à-dire la sortie de la fonction f est un mutant x ).

30voto

Une opération idempotente produit le résultat dans le même état même si vous l'appelez plusieurs fois, à condition de passer les mêmes paramètres.

1 votes

Ça ne semble pas du tout logique. stackoverflow.com/questions/1077412/

3 votes

Je pense que vous confondez idempotent y déterministe .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X