回答:
コンピューティングでは、べき等演算は、同じ入力パラメーターで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月より前に書かれた以下のコメントは、古いリビジョンを参照しています。
set
答えのPythonの例では、セットオブジェクトは明らかに状態を持ち、のようなべき等演算も提供しますdiscard
。
discard
は、状態を戻り値に含めることで、ステートレスな方法で実装することもできますdiscard([my_set, x]) = [my_new_set, x]
。そうすることができますdiscard(discard([my_set, x]))
。注[my_new_set, x]
あるただ一つの引数とその型が2組あります。
discard(x)
セットはもはや含まれていません。二度目は初めてそれを呼び出すのと同じ効果がありますx
。べき等の計算は、システムの堅牢性についてです。障害が発生する可能性があるため(ネットワークの停止など)、障害が検出された場合、どのように回復しますか?最も簡単な回復は、もう一度実行することですが、それは、再度実行することがべき等である場合にのみ機能します。たとえばdiscard(x)
、べき等ですが、そうでpop()
はありません。それはすべてエラー回復に関するものです。
べき等演算は任意の回数繰り返すことができ、結果は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人でした。
オペレーションを何度呼び出しても、結果は同じになります。
truncate
およびdelete
。
べき等とは、操作を1回適用するか、複数回適用しても同じ効果があることを意味します。
例:
以下のために純粋な関数(無副作用の機能)次に、冪等は、F(X)= F(F(X))= F(F(F(X)))= F(F(F(F(X)))を意味します)= ...... xのすべての値
以下のために副作用を持つ関数、冪等は、さらに追加の副作用は最初の適用後に発生しないであろうことを意味します。必要に応じて、世界の状態を関数の追加の「非表示」パラメーターと見なすことができます。
並行アクションが行われている世界では、べき等であると考えていた操作がそうでなくなる場合があることに注意してください(たとえば、別のスレッドが上記の例のブールフラグの値を設定解除する可能性があります)。基本的に、同時実行性と変更可能な状態があるときは常に、べき等性についてもっと注意深く考える必要があります。
べき等は、多くの場合、堅牢なシステムを構築する上で有用な特性です。たとえば、サードパーティから重複したメッセージを受信するリスクがある場合、メッセージハンドラーをべき等演算として機能させると、メッセージ効果が1回だけ発生します。
f(x) = f(f(x))
でf(x){return x+1;}
はないということですか?理由f(x) != f(f(x))
:f(1)
2をf(2)
与える一方で3 を与える
f(x) = f(f(x))
。@GregHewgillが意味をなすために、この定義ためには、上述したようしかし、あなたが考慮しなければならないx
対象として、およびf
操作としてその変異するオブジェクトの状態(すなわち:の出力f
変異していますx
)。
べき等演算では、同じパラメーターを渡せば、2回以上呼び出しても同じ状態で結果が生成されます。
べき等性を示す実際のユースケースを破棄したかっただけです。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');
べき等操作とは、最初のアプリケーションを超えて結果、つまりシステムの状態を変更せずに複数回適用できる操作、アクション、または要求です。
例(Webアプリのコンテキスト):
IDEMPOTENT:複数の同一のリクエストを行うことは、単一のリクエストを行うことと同じ効果があります。電子メールメッセージングシステムのメッセージが開かれ、データベースで「オープン」としてマークされます。メッセージを何度も開くことができますが、この繰り返しのアクションによって、そのメッセージが「開かれた」状態になることしかありません。これはべき等演算です。リソース(システムの状態)と一致しない情報を使用してリソースの更新を初めてPUTするとき、リソースが更新されるとシステムの状態が変化します。1つのPUTがリソースに対して同じ更新を繰り返し行う場合、更新の情報は、すべてのPUTでシステムに既に存在する情報と一致し、システムの状態は変化しません。同じ情報を持つ繰り返しPUTはべき等です。
非同義語:同じメッセージをユーザーに何度もPOSTするなど、操作によって常に状態が変化し、毎回新しいメッセージが送信されてデータベースに保存される場合、その操作は非無言であると言います。
NULLIPOTENT:データベースに変更を加えずにWebページに情報を純粋に表示する(つまり、データベースを読み取るだけの)操作のような副作用がない場合、操作はNULLIPOTENTであると言います。すべてのGETはnullipotentである必要があります。
システムの状態について話すとき、ロギングや診断などの無害で不可避な効果を無視しています。
べき等演算:複数回実行しても副作用のない演算。
例:データリソースから値を取得し、それを出力する操作
操作。非べき等操作:複数回実行すると害を及ぼす操作。(一部の値または状態を変更するため)
例:銀行口座から引き出す操作
かなり詳細で技術的な答え。単純な定義を追加するだけです。
べき等=再実行可能
たとえば、Create
操作自体は、
複数回実行してもエラーなしで実行できるとは限りません。ただし、操作がある場合は、CreateOrUpdate
再実行可能性(べき等)を示します。
セットに対するべき等演算では、1回以上適用されたときにメンバーは変更されません。
これは、absolute(x)のような単項演算であり、xは正の整数のセットに属します。ここでは、absolute(absolute(x))= xです。
それは、それ自体とのセットの結合が常に同じセットを返すように、バイナリ演算にすることができます。
乾杯
my 5c:統合とネットワークにおいて、べき等性は非常に重要です。実際の例:想像してください。ターゲットシステムにデータを配信します。一連のメッセージによって配信されるデータ。1.シーケンスがチャネルで混合されるとどうなりますか?(ネットワークパッケージは常に:)を行うので)。ターゲットシステムがべき等の場合、結果は変わりません。ターゲットシステムがシーケンスの正しい順序に依存している場合は、ターゲットサイトに再シーケンサーを実装する必要があります。これにより、正しい順序が復元されます。2.メッセージが重複している場合はどうなりますか?ターゲットシステムのチャネルがタイムリーに確認応答しない場合、ソースシステム(またはチャネル自体)は通常、メッセージの別のコピーを送信します。その結果、ターゲットシステム側でメッセージが重複する可能性があります。ターゲットシステムがべき等の場合、それはそれを大事にし、結果は変わらないでしょう。ターゲットシステムがべき等でない場合は、チャネルのターゲットシステム側に重複排除機能を実装する必要があります。
要するに、べき等演算とは、べき等演算を何回操作しても、結果が異なる結果にならないことを意味します。
たとえば、HTTPの仕様の定義によれば、べきGET, HEAD, PUT, and DELETE
等演算です。しかしそうでPOST and PATCH
はありません。これPOST
がに置き換えられることがある理由PUT
です。
再試行セーフ。
通常、コンピュータサイエンスでその意味を理解する最も簡単な方法です。
Idempotent operations are often used in the design of network protocols
、関連する例があると記載されているため、** GETはサーバー上の何かを変更することを想定していないため、GETはべき等です。HTTP /サーブレットのコンテキストでは、同じリクエストを2回行うことができ、悪影響はありません。** POSTはべき等ではありません。