べき等演算とは何ですか?


回答:


964

コンピューティングでは、べき等演算は、同じ入力パラメーターで2回以上呼び出された場合に、追加の効果がない演算です。たとえば、セットからアイテムを削除することは、セットに対するべき等演算と見なすことができます。

数学では、べき等演算はf(f(x))= f(x)の演算です。たとえば、すべてののabs()ため、関数はべき等です。abs(abs(x)) = abs(x)x

これらのわずかに異なる定義は、数学的定義のxがオブジェクトの状態を表し、fがそのオブジェクトを変更する可能性のある操作であると考えることで調整できます。たとえば、Pythonsetとそのdiscardメソッドについて考えます。このdiscardメソッドはセットから要素を削除し、要素が存在しない場合は何もしません。そう:

my_set.discard(x)

同じ操作を2回行うのとまったく同じ効果があります。

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

べき等演算は、ネットワークプロトコルの設計でよく使用されます。演算を実行する要求は、少なくとも1回発生することが保証されていますが、2回以上発生することもあります。操作がべき等である場合、操作を2回以上実行しても害はありません。

詳細については、べき等に関するウィキペディアの記事を参照してください。


上記の回答には以前、いくつかの正しくない、誤解を招く例がありました。2014年4月より前に書かれた以下のコメントは、古いリビジョンを参照しています。


6
例:上記の回答にはIdempotent operations are often used in the design of network protocols、関連する例があると記載されているため、** GETはサーバー上の何かを変更することを想定していないため、GETはべき等です。HTTP /サーブレットのコンテキストでは、同じリクエストを2回行うことができ、悪影響はありません。** POSTはべき等ではありません。
KNU 2014

1
「ステートレス」は「べき等」と同義ですか?
Michael Osofsky 14

2
@MichaelOsofsky:いいえ、set答えのPythonの例では、セットオブジェクトは明らかに状態を持ち、のようなべき等演算も提供しますdiscard
グレッグヒューギル2014

1
@MichaelOsofsky discardは、状態を戻り値に含めることで、ステートレスな方法で実装することもできますdiscard([my_set, x]) = [my_new_set, x]。そうすることができますdiscard(discard([my_set, x]))。注[my_new_set, x]あるただ一つの引数とその型が2組あります。
Pacerier 2015年

2
@Green インポテンスのコンテキストで同じ効果という用語を使用する場合、それは結果ではなく、アクションではなく同じであることを意味します。呼び出しdiscard(x)セットはもはや含まれていません。二度目は初めてそれを呼び出すのと同じ効果がありますx。べき等の計算は、システムの堅牢性についてです。障害が発生する可能性があるため(ネットワークの停止など)、障害が検出された場合、どのように回復しますか?最も簡単な回復は、もう一度実行することですが、それは、再度実行することがべき等である場合にのみ機能します。たとえばdiscard(x)、べき等ですが、そうでpop()はありません。それはすべてエラー回復に関するものです。
Andreas

138

べき等演算は任意の回数繰り返すことができ、結果は1回だけ行われた場合と同じになります。算術では、数値にゼロを追加することはべき等です。

べき等は、「RESTful」なWebサービスのコンテキストで多くのことを話します。RESTは、HTTPを最大限に活用してプログラムにWebコンテンツへのアクセスを提供することを目的としており、通常、SOAPベースのWebサービスとは対照的に設定されます。

RESTは、Webアプリケーションを「リソース」(TwitterユーザーやFlickr画像など)に編成し、POST、PUT、GET、DELETEのHTTP動詞を使用して、これらのリソースを作成、更新、読み取り、削除します。

べき等はRESTで重要な役割を果たします。RESTリソース(Flickrからjpeg画像を取得するなど)の表現を取得し、操作が失敗した場合、操作が成功するまで繰り返し取得することができます。Webサービスにとっては、何回画像を取得してもかまいません。同様に、RESTful Webサービスを使用してTwitterアカウント情報を更新する場合、Webサービスから確認を取得するために必要な回数だけ新しい情報をPUTできます。1000回のPUTは、1回のPUTと同じです。同様に、RESTリソースを1,000回DELETEすることは、一度削除することと同じです。したがって、べき等性を使用すると、通信エラーに対して回復力のあるWebサービスを簡単に構築できます。

参考文献:RichardsonとRubyによるRESTful Webサービス(べき等性については103-104ページで説明)、およびRESTに関する Roy FieldingのPhD論文。フィールディングは、セクション9.1.2でべき等性について述べているHTTP 1.1、RFC-2616の著者の1人でした。


明確でわかりやすい。しかし、これはあるだけ1つの冪等の解釈。
Pacerier 2015年

10
「べき等性」は非常に過負荷の言葉です。なぜなら、それは壮大に聞こえ、三足歩行のチェックに合格するのに十分な文字があるからです。ベンジャミン・パースがもっとシンプルな言葉を選んだとしたら 、今日はこの質問すらありません。
Pacerier

2
理解方法:同様に、RESTリソースを1,000回DELETEすることは、一度削除することと同じです。リソースがすでに削除されている場合は、再度削除することはできません。
Green

1
@Greenです、最初削除しません。あなたは、削除要求を送信します。重要な点は、要求をいくつでも送信できることです。
Caleth 2017

1
@JimFerransなるほど。POSTができないのにPUTが心配せずに再送信できる理由には(HTTP自体に組み込まれている)機能関連の理由があるのではないかと思いました。これで、HTTP標準に準拠する必要があるだけで、動作は完全にサーバーの実装方法に基づいているようです
mangusta

109

オペレーションを何度呼び出しても、結果は同じになります。


8
以下のいずれかまたは両方として定義されたべき等を聞いたことがあります。1)入力の特定のセットでは、常に同じ出力を返します。2)副作用はありません。私の質問は、関数が#1に準拠するが#2には準拠しない場合、それは計算に関係のない副作用(たとえば、データストアへの要求をログに記録する)になるため、やはりべき等と見なされるのですか?
キースベネット

12
オペレーションの呼び出し結果にはシステムの状態が含まれている必要があるため、オペレーションに累積的な副作用がある場合は、べき等ではありません。ただし、操作が呼び出された回数に関係なく、副作用によりシステムが同じ状態になる場合は、べき等である可能性があります。
ロバート

4
短くて甘い、私はそのような答えが大好きです。なぜ私がこの用語を絶えず調べなければならないのかわからない、それはただ私に留まらないものです。
プランサー2015

1
@キースベネット、2番目の定義は間違っています。「副作用なし」はべき等を意味しません。べき等関数には副作用があります。たとえば、MySQL truncateおよびdelete
Pacerier 2015年

結果は同じです(つまり、システム状態)が、応答は異なる場合があります(RESTサービスのHTTPステータスコードなど)。
G.シュタイガート2018

50

べき等とは、操作を1回適用するか、複数回適用しても同じ効果があることを意味します。

例:

  • ゼロによる乗算。何度実行しても、結果はゼロのままです。
  • ブールフラグを設定します。何回やってもフラグはセットされたままです。
  • 特定のIDを持つデータベースから行を削除します。もう一度試しても、行はまだ消えています。

以下のために純粋な関数(無副作用の機能)次に、冪等は、F(X)= F(F(X))= F(F(F(X)))= F(F(F(F(X)))を意味します)= ...... xのすべての値

以下のために副作用を持つ関数、冪等は、さらに追加の副作用は最初の適用後に発生しないであろうことを意味します。必要に応じて、世界の状態を関数の追加の「非表示」パラメーターと見なすことができます。

並行アクションが行われている世界では、べき等であると考えていた操作がそうでなくなる場合があることに注意してください(たとえば、別のスレッドが上記の例のブールフラグの値を設定解除する可能性があります)。基本的に、同時実行性と変更可能な状態があるときは常に、べき等性についてもっと注意深く考える必要があります。

べき等は、多くの場合、堅牢なシステムを構築する上で有用な特性です。たとえば、サードパーティから重複したメッセージを受信するリスクがある場合、メッセージハンドラーをべき等演算として機能させると、メッセージ効果が1回だけ発生します。


1
純粋な関数の場合、それは純粋な関数f(x) = f(f(x))f(x){return x+1;}はないということですか?理由f(x) != f(f(x))f(1)2をf(2)与える一方で3 を与える
Pacerier

1
@Pacerierいいえ、@mikeraは純粋言っている冪等を意味しますf(x) = f(f(x))。@GregHewgillが意味をなすために、この定義ためには、上述したようしかし、あなたが考慮しなければならないx対象として、およびf操作としてその変異するオブジェクトの状態(すなわち:の出力f変異していますx)。
ジャスティンJスターク


16

べき等性を示す実際のユースケースを破棄したかっただけです。JavaScriptで、(MVCモデルのように)一連のモデルクラスを定義しているとします。これがしばしば実装される方法は、次のようなもの(基本的な例)と機能的に同等です。

function model(name) {
  function Model() {
    this.name = name;
  }

  return Model;
}

次に、次のように新しいクラスを定義できます。

var User = model('user');
var Article = model('article');

しかし、コードのどこかからUserを介してクラスを取得しようとすると、model('user')失敗します。

var User = model('user');
// ... then somewhere else in the code (in a different scope)
var User = model('user');

これらの2つのUserコンストラクターは異なります。あれは、

model('user') !== model('user');

べきにするためには、次のような何らかのキャッシュメカニズムを追加するだけです。

var collection = {};

function model(name) {
  if (collection[name])
    return collection[name];

  function Model() {
    this.name = name;
  }

  collection[name] = Model;
  return Model;
}

キャッシングを追加することで、実行するたびにmodel('user')同じオブジェクトになるため、べき等になります。そう:

model('user') === model('user');

10

べき等操作とは、最初のアプリケーションを超えて結果、つまりシステムの状態を変更せずに複数回適用できる操作、アクション、または要求です。

例(Webアプリのコンテキスト):

IDEMPOTENT:複数の同一のリクエストを行うことは、単一のリクエストを行うことと同じ効果があります。電子メールメッセージングシステムのメッセージが開かれ、データベースで「オープン」としてマークされます。メッセージを何度も開くことができますが、この繰り返しのアクションによって、そのメッセージが「開かれた」状態になることしかありません。これはべき等演算です。リソース(システムの状態)と一致しない情報を使用してリソースの更新を初めてPUTするとき、リソースが更新されるとシステムの状態が変化します。1つのPUTがリソースに対して同じ更新を繰り返し行う場合、更新の情報は、すべてのPUTでシステムに既に存在する情報と一致し、システムの状態は変化しません。同じ情報を持つ繰り返しPUTはべき等です。

非同義語:同じメッセージをユーザーに何度もPOSTするなど、操作によって常に状態が変化し、毎回新しいメッセージが送信されてデータベースに保存される場合、その操作は非無言であると言います。

NULLIPOTENT:データベースに変更を加えずにWebページに情報を純粋に表示する(つまり、データベースを読み取るだけの)操作のような副作用がない場合、操作はNULLIPOTENTであると言います。すべてのGETはnullipotentである必要があります。

システムの状態について話すとき、ロギングや診断などの無害で不可避な効果を無視しています。


9

べき等演算:複数回実行しても副作用のない演算。
:データリソースから値を取得し、それを出力する操作

操作。非べき等操作:複数回実行すると害を及ぼす操作。(一部の値または状態を変更するため)
例:銀行口座から引き出す操作


3
実は間違った答えです!「副作用がない」というべき等演算の場合は正しくありません。べき等ではない操作で「何らかの害を引き起こす」と言うのは混乱する答えです。
Saeed Mohtasham

9

かなり詳細で技術的な答え。単純な定義を追加するだけです。

べき等=再実行可能

たとえば、Create操作自体は、 複数回実行してもエラーなしで実行できるとは限りません。ただし、操作がある場合は、CreateOrUpdate再実行可能性(べき等)を示します。


3
これは不正な定義です。再実行可能性は、べき等であることを保証しません。操作は再実行可能であり、実行ごとに結果に追加の効果を加えることができるため、べき等ではありません。
Saeed Mohtasham

7

セットに対するべき等演算では、1回以上適用されたときにメンバーは変更されません。

これは、absolute(x)のよう単項演算であり、xは正の整数のセットに属します。ここでは、absolute(absolute(x))= xです。

それは、それ自体とのセットの結合が常に同じセットを返すように、バイナリ演算にすることができます。

乾杯


べき等演算は、f(f(x))= f(x)の演算です。「メンバーを変更しない」は正しい答えではありません。
Saeed Mohtasham

7

n番目の結果ごとに1番目の結果の値と一致する出力が生成されるのは、任意の操作です。たとえば、-1の絶対値は1です。-1の絶対値の絶対値は1です。-1の絶対値の絶対値の絶対値は1です。以下同様です。

参照:再帰を使用するのに本当にばかげた時はいつでしょうか?


1
それは10年経った今でもおかしな答えです。+1
snr

3

べき等演算を理解する良い例は、リモートキーで車をロックすることです。

log(Car.state) // unlocked

Remote.lock();
log(Car.state) // locked

Remote.lock();
Remote.lock();
Remote.lock();
log(Car.state) // locked

lockべき等演算です。lockまばたきなど、走るたびに副作用があったとしても、何回ロック操作をしても車は同じロック状態です。


1

my 5c:統合とネットワークにおいて、べき等性は非常に重要です。実際の例:想像してください。ターゲットシステムにデータを配信します。一連のメッセージによって配信されるデータ。1.シーケンスがチャネルで混合されるとどうなりますか?(ネットワークパッケージは常に:)を行うので)。ターゲットシステムがべき等の場合、結果は変わりません。ターゲットシステムがシーケンスの正しい順序に依存している場合は、ターゲットサイトに再シーケンサーを実装する必要があります。これにより、正しい順序が復元されます。2.メッセージが重複している場合はどうなりますか?ターゲットシステムのチャネルがタイムリーに確認応答しない場合、ソースシステム(またはチャネル自体)は通常、メッセージの別のコピーを送信します。その結果、ターゲットシステム側でメッセージが重複する可能性があります。ターゲットシステムがべき等の場合、それはそれを大事にし、結果は変わらないでしょう。ターゲットシステムがべき等でない場合は、チャネルのターゲットシステム側に重複排除機能を実装する必要があります。


他の要求(またはシステムの状態を変更する他の何か)から分離して送信された単一の要求のべき等性は、要求の並べ替えとは異なります。HTTP PUTリクエストとHTTP DELETEリクエストはどちらも個別にべき等である必要があります。ただし、PUTリクエストには副作用がある可能性があるため、同じURLでPUTとDELETEを呼び出す順序は重要ではありません。
ロビングリーン

1

要するに、べき等演算とは、べき等演算を何回操作しても、結果が異なる結果にならないことを意味します。

たとえば、HTTPの仕様の定義によれば、べきGET, HEAD, PUT, and DELETE等演算です。しかしそうでPOST and PATCHはありません。これPOSTがに置き換えられることがある理由PUTです。


-4

再試行セーフ。

通常、コンピュータサイエンスでその意味を理解する最も簡単な方法です。


1
再試行は、初回または前回失敗した何かを意味します。まったく同じではありません。
ラッセV.カールセン2017

誰が私の質問を編集して私に反対票を投じましたか?それは私が投稿したテキストではありませんか?
teknopaul 2017

回答の下にある「X時間前に編集」などのリンクをクリックすると、編集ログを確認できます。
ラッセV.カールセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.