べき乗演算とは何ですか?
計算では、べき等演算とは、同じ入力パラメータを使用して2回以上呼び出された場合、追加の効果がない演算です。たとえば、セットから項目を削除することは、そのセットに対するべき等操作と見なすことができます。
数学では、べき乗演算は f(f(x)) = f(x) の演算です。たとえば、abs()
関数は、すべてのx
に対してabs(abs(x)) = abs(x)
があるので、べき等です。
これらのわずかに異なる定義は、数学的定義の x がオブジェクトの状態を表し、 f がそのオブジェクトを変化させる可能性がある操作であることを考慮することによって調整できます。たとえば、 Pythonのset
とそのdiscard
メソッドを考えてみましょう。 discard
メソッドはセットから要素を削除し、その要素が存在しない場合は何もしません。そう:
my_set.discard(x)
同じ操作を2回実行するのとまったく同じ効果があります。
my_set.discard(x)
my_set.discard(x)
べき等演算は、ネットワークプロトコルの設計でよく使用されます。ネットワークプロトコルの設計では、演算の実行要求が少なくとも1回は発生することが保証されていますが、複数回発生することもあります。操作がべき等であれば、操作を2回以上実行しても問題ありません。
詳細については idempotence に関するウィキペディアの記事を参照してください。
上記の回答には、以前にいくつかの誤った、誤解を招くような例がありました。 2014年4月以前に書かれた以下のコメントは、より古いリビジョンを参照しています。
べき等演算を任意の回数繰り返すことができ、結果は1回だけ実行された場合と同じになります。算術演算では、数に0を加えることは冪等です。
冪等性は「RESTful」Webサービスの文脈で多くのことについて話されています。 RESTは、プログラムにWebコンテンツへのアクセスを提供するためにHTTPを最大限に活用しようとしています。通常、HTTP要求および応答内でリモートプロシージャコールスタイルサービスをトンネルするSOAPベースのWebサービスとは対照的に設定されます。
RESTはWebアプリケーションを(Twitterユーザー、Flickr画像などの)「リソース」に編成してから、POST、PUT、GET、およびDELETEのHTTP動詞を使用してそれらのリソースを作成、更新、読み取り、および削除します。
べき等性は、RESTにおいて重要な役割を果たします。 RESTリソースの表現(例えばFlickrからのjpegイメージのGET)をGETしても操作が失敗した場合は、操作が成功するまで繰り返しGETを繰り返すことができます。 Webサービスにとって、画像が何回取得されるかは関係ありません。同様に、RESTful Webサービスを使用してTwitterアカウント情報を更新する場合、Webサービスから確認を受けるために必要なだけ新しい情報をPUTできます。 1000回PUTすることは、1回PUTすることと同じです。同様に、RESTリソースを1000回DELETEすることは、一度削除することと同じです。したがって、べき等性を使用すると、通信エラーに強いWebサービスを簡単に構築できます。
さらに詳しく読む: RichardsonとRubyによるRESTful Webサービス 、同数については103-104ページで説明されています)、およびRoy Fieldingの REST のPhD論文)。 HTTP 1.1のRFC-2616では、 項9.1.2 )でのべき等性について説明しています。
何回操作を呼び出しても、結果は同じになります。
べき等性とは、1回の操作の適用または複数回の適用の効果が同じであることを意味します。
例:
純粋関数 (副作用のない関数)の場合、べき乗は、f(x) = f(f(x)) = f(f(f(x))) = f(f(f(f(x)))) = ...... xのすべての値に対して
副作用のある機能 の場合、べき等性はさらに、最初の適用後に追加の副作用が生じないことを意味します。あなたが好きなら、あなたは世界の状態が関数への追加の「隠された」パラメータであると考えることができます。
並行アクションが進行している世界では、恣意的であると考えた操作がそうではなくなったことに気付くかもしれません(例えば、上記の例では別のスレッドがブール値フラグの値を設定解除できます)。基本的に、並行性と可変状態があるときはいつでも、べき等性についてもっと慎重に考える必要があります。
べき等性は、堅牢なシステムを構築する上で有用なプロパティです。たとえば、第三者から重複したメッセージを受信する可能性がある場合は、メッセージハンドラが1回しか発生しないように、メッセージハンドラをべき等演算子として機能させると便利です。
べき乗演算では、同じパラメータを渡した場合、複数回呼び出しても結果は同じ状態になります。
冪等性を示す実際のユースケースを捨てたいだけでした。 JavaScriptでは、(MVCモデルのように)たくさんのモデルクラスを定義しているとします。これがよく実装される方法は、機能的には次のようなものと同等です(基本例)。
function model(name) {
function Model() {
this.name = name;
}
return Model;
}
その後、このように新しいクラスを定義できます。
var User = model('user');
var Article = model('article');
しかし、コード内の別の場所からmodel('user')
を介して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');
べき等演算とは、最初の適用を超えて結果、すなわちシステムの状態を変更することなく、複数回適用できる演算、アクション、または要求です。
例(ウェブアプリコンテクスト):
NULLIPOTENT:データベースに何も変更を加えずに純粋にWebページに情報を表示する(つまり、データベースを閲覧しているだけのような)操作に副作用がない場合、その操作はNULLIPOTENTと呼ばれます。すべてのGETは無効にする必要があります。それ以外の場合は、POSTを使用してください。
IDEMPOTENT:電子メールメッセージングシステム内のメッセージが開かれ、データベース内で「開封済み」としてマークされます。何度もメッセージを開くことができますが、この繰り返しアクションによって、そのメッセージが「開かれた」状態になることがあります。これはべき等演算です。
NON-IDEMPOTENT:同じメッセージをユーザーに何度もPOSTして、そのたびに新しいメッセージが送信されてデータベースに格納されるなど、操作によって常に状態が変化する場合、その操作はNON-IDEMPOTENTと呼ばれます。
システムの状態について話すとき、我々は明らかにログや診断のような無害で避けられない効果を無視しています。
べき等演算: 複数回実行しても副作用がない演算。
例 :データリソースから値を取得して出力する操作
冪等でない操作: /複数回実行されると害を及ぼす可能性のある操作(いくつかの値や状態が変わるので)
例: 銀行口座から引き落とす操作
かなり詳細かつ技術的な答え。単純な定義を追加するだけです。
べき乗=再実行可能
たとえば、Create
操作自体が複数回実行された場合、エラーなしで実行されることは保証されません。しかし、もしCreateOrUpdate
という操作があるならば、それは再実行可能性を示します(冪等性)。
セットに対するべき等演算は、1回以上適用されてもそのメンバーを変更しません。
これは absolute(x) のような単項演算にすることができます。ここで、xは正の整数の集合に属します。ここでabsolute(absolute(x))= xです。
それは のような二項演算子であることができます それ自身との集合の結合 - /は常に同じ集合を返します。
乾杯
N番目の結果ごとに1番目の結果の値と一致する出力が生成されることは任意の操作です。例えば、-1の絶対値は1です。-1の絶対値の絶対値は1です。-1の絶対値の絶対値の絶対値は1です。以下同様です。
次も参照してください。再帰を使うのが本当に馬鹿げた時だろうか?
私の5c:統合とネットワーキングにおいて、べき等性は非常に重要です。実生活からのいくつかの例:想像してみてください。ターゲットシステムにデータを提供します。一連のメッセージによって配信されたデータ。 1.シーケンスがチャンネルに混在しているとどうなりますか? (ネットワークパッケージはいつもするように:))。ターゲットシステムがべき等であれば、結果は変わりません。ターゲットシステムがシーケンス内の正しい順序に依存している場合は、正しい順序を復元するためにターゲットサイトに再シーケンサを実装する必要があります。 2.メッセージが重複しているとどうなりますか。ターゲットシステムのチャネルがタイムリーに確認応答しない場合、ソースシステム(またはチャネル自体)は通常メッセージの別のコピーを送信します。その結果、ターゲットシステム側でメッセージが重複する可能性があります。ターゲットシステムがべき等であれば、それを処理しても結果は変わりません。ターゲットシステムがべき乗でない場合は、チャネルのターゲットシステム側にデデュプリケータを実装する必要があります。
要するに つまり、べき等演算とは、べき等演算を何回操作しても、演算結果が異なる結果にならないことを意味します。
たとえば、HTTPの仕様の定義によれば、GET, HEAD, PUT, and DELETE
はべき等演算です。しかしPOST and PATCH
はそうではありません。そのため、POSTがPATCHに置き換えられることがあります。