べき等演算とは何ですか?
15 に答える
コンピューティングでは、べき等演算は、同じ入力パラメーターで複数回呼び出された場合に追加の効果がない演算です。たとえば、セットからアイテムを削除することは、セットに対するべき等操作と見なすことができます。
数学では、べき等演算は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回以上実行しても害はありません。
詳細については、べき等に関するWikipediaの記事を参照してください。
上記の回答には、以前はいくつかの誤った誤解を招く例がありました。2014年4月より前に書かれた以下のコメントは、古いリビジョンを参照しています。
べき等演算は任意の回数繰り返すことができ、結果は1回だけ行った場合と同じになります。算術では、数値にゼロを加算することはべき等です。
べき等は、「RESTful」Webサービスのコンテキストで多くのことを話します。RESTは、HTTPを最大限に活用してプログラムにWebコンテンツへのアクセスを提供しようとします。通常、HTTP要求と応答内でリモートプロシージャコールスタイルのサービスをトンネリングするSOAPベースのWebサービスとは対照的に設定されます。
RESTは、Webアプリケーションを「リソース」(TwitterユーザーやFlickrイメージなど)に編成し、POST、PUT、GET、およびDELETEのHTTP動詞を使用して、これらのリソースを作成、更新、読み取り、および削除します。
べき等はRESTで重要な役割を果たします。RESTリソースの表現をGETし(たとえば、FlickrからjpegイメージをGETする)、操作が失敗した場合は、操作が成功するまでGETを何度も繰り返すことができます。Webサービスにとって、画像が何回取得されるかは関係ありません。同様に、RESTful Webサービスを使用してTwitterアカウント情報を更新する場合、Webサービスから確認を取得するために、必要な回数だけ新しい情報を配置できます。1000回PUTするのは1回PUTするのと同じです。同様に、RESTリソースを1000回削除することは、1回削除することと同じです。したがって、べき等により、通信エラーに強いWebサービスの構築がはるかに簡単になります。
さらに読む: RichardsonとRubyによるRESTful Webサービス(べき等については103-104ページで説明)、およびRESTに関するRoyFieldingの博士論文。フィールディングは、セクション9.1.2でべき等について説明しているHTTP 1.1、RFC-2616の作成者の1人でした。
操作を何度呼び出しても、結果は同じになります。
べき等とは、操作を1回適用することも、複数回適用することも同じ効果があることを意味します。
例:
- ゼロによる乗算。何度行っても結果はゼロです。
- ブールフラグを設定します。何度行ってもフラグは設定されたままです。
- 指定されたIDを持つデータベースから行を削除します。もう一度試してみると、行はまだ消えています。
純粋関数(副作用のない関数)の場合、べき等性は、f(x)= f(f(x))= f(f(f(x)))= f(f(f(f(x))))=......xのすべての値に対して
副作用のある機能の場合、べき等性はさらに、最初の適用後に追加の副作用が発生しないことを意味します。必要に応じて、世界の状態を関数への追加の「非表示」パラメーターと見なすことができます。
同時アクションが実行されている世界では、べき等であると考えていた操作が終了しない場合があることに注意してください(たとえば、別のスレッドが上記の例のブールフラグの値を設定解除する可能性があります)。基本的に、並行性と可変状態がある場合は常に、べき等性についてより慎重に考える必要があります。
べき等性は、堅牢なシステムを構築する上で有用な特性であることがよくあります。たとえば、サードパーティから重複したメッセージを受信する可能性がある場合は、メッセージハンドラーをべき等操作として機能させ、メッセージ効果が1回だけ発生するようにすることが役立ちます。
べき等操作を理解する良い例は、リモートキーで車をロックすることです。
log(Car.state) // unlocked
Remote.lock();
log(Car.state) // locked
Remote.lock();
Remote.lock();
Remote.lock();
log(Car.state) // locked
lock
べき等演算です。走行するたびにlock
点滅などの副作用があったとしても、何度運転しても同じロック状態のままです。
べき等演算は、同じパラメーターを渡せば、複数回呼び出しても同じ状態で結果を生成します。
べき等性を示す実際のユースケースを捨てたかっただけです。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アプリのコンテキスト):
べき等:複数の同一の要求を行うことは、単一の要求を行うことと同じ効果があります。電子メールメッセージングシステムのメッセージが開かれ、データベースで「開かれた」とマークされます。メッセージを何度も開くことができますが、この繰り返しのアクションによって、そのメッセージが「開かれた」状態になるだけです。これはべき等演算です。リソース(システムの状態)と一致しない情報を使用してリソースに初めてPUTを実行すると、リソースが更新されるとシステムの状態が変化します。1つのPUTが同じ更新をリソースに繰り返し行う場合、更新内の情報は、PUTごとにシステムにすでに存在する情報と一致し、システムの状態は変更されません。同じ情報で繰り返されるPUTはべき等です:
非べき等:操作によって、同じメッセージがユーザーに何度もPOSTされるなど、常に状態が変化し、毎回新しいメッセージが送信されてデータベースに保存される場合、その操作は非べき等であると言えます。
NULLIPOTENT:データベースを変更せずにWebページに情報を純粋に表示するなど、操作に副作用がない場合(つまり、データベースを読み取っているだけの場合)、操作はNULLIPOTENTであると言います。すべてのGETは無効である必要があります。
システムの状態について話すとき、ロギングや診断などの無害で避けられない影響を無視していることは明らかです。
非常に詳細で技術的な答え。簡単な定義を追加するだけです。
べき等=再実行可能
たとえば、
Create
操作自体は、複数回実行された場合にエラーなしで実行されることが保証されていません。ただし、操作がある場合は、CreateOrUpdate
再実行可能性(べき等)が示されます。
べき等操作:複数回実行しても副作用がない操作。
例:データリソースから値を取得して出力する
操作。非べき等操作:複数回実行すると害を及ぼす操作。(一部の値または状態を変更する場合)
例:銀行口座から引き出す操作
n番目ごとの結果が、最初の結果の値と一致する出力になるのは、任意の操作です。たとえば、-1の絶対値は1です。-1の絶対値の絶対値は1です。-1の絶対値の絶対値の絶対値は1です。以下同様です。
参照:再帰を使用するのに本当にばかげた時期はいつですか?
セットに対するべき等操作は、1回以上適用されたときに、そのメンバーを変更せずに残します。
これは、xが正の整数のセットに属するabsolute(x)のような単項演算である可能性があります。ここでabsolute(absolute(x))=xです。
これは、セットとそれ自体の和集合が常に同じセットを返すような二項演算である可能性があります。
乾杯
つまり、べき等演算とは、べき等演算を何度操作しても、結果が異なることはないということです。
たとえば、HTTPの仕様の定義によれば、べきGET, HEAD, PUT, and DELETE
等演算です。ただしPOST and PATCH
、そうではありません。そのため、POST
がに置き換えられることがありPUT
ます。
私の5c:統合とネットワーキングでは、べき等性が非常に重要です。実生活からのいくつかの例:想像してみてください。ターゲットシステムにデータを配信します。一連のメッセージによって配信されるデータ。1.シーケンスがチャネルに混在している場合はどうなりますか?(ネットワークパッケージは常にそうします:))。ターゲットシステムがべき等である場合、結果に違いはありません。ターゲットシステムがシーケンスの正しい順序に依存している場合は、ターゲットサイトにリシーケンサーを実装する必要があります。これにより、正しい順序が復元されます。2.メッセージが重複している場合はどうなりますか?ターゲットシステムのチャネルがタイムリーに確認応答しない場合、ソースシステム(またはチャネル自体)は通常、メッセージの別のコピーを送信します。その結果、ターゲットシステム側でメッセージが重複する可能性があります。ターゲットシステムがべき等である場合、それはそれを処理し、結果は変わりません。ターゲットシステムがべき等でない場合は、チャネルのターゲットシステム側にデデュプリケーターを実装する必要があります。
操作を複数回実行することが1回実行するのと同等である場合、その操作はべき等であると言われます。
例:音量を20に設定します。テレビの音量を20に設定しても、最終的には音量が20になります。プロセスが50/100回以上操作を実行した場合でも、プロセスの終了時にボリュームは20になります。
反例:ボリュームを1ずつ増やします。プロセスがこの操作を50回実行すると、終了ボリュームは初期ボリューム+ 50になり、プロセスが操作を100回実行すると、終了ボリュームは初期ボリューム+100になります。ご覧のとおり、操作が実行された回数によって最終結果が異なることがわかります。したがって、この操作はべき等ではないと結論付けることができます。
最終結果を太字で強調しています。
f
プログラミングの観点から考えると、関数がfoo
入力として受け取り、の出力が戻るf
ように設定されている操作があるとしましょうfoo
。プロセスの最後(この操作を50/100回以上実行する)で、foo
変数が操作が1回だけ実行されたときの値を保持している場合、操作はべき等です。それ以外の場合はそうではありません。
foo = <some random value here, let's say -2>
{ foo = f( foo ) }
中括弧は操作の概要を示します
fが入力の二乗を返す場合、演算はべき等ではありません。foo
最後になりますので(-2) raised to the power (number of times operation is executed)
fが入力の絶対値を返す場合、操作は何回実行されてもべき等であるため、操作はべき等foo
になりますabs(-2)
。
ここで、最終結果は変数の最終値として定義されますfoo
。
数学的な意味では、べき等の意味は少し異なります。
f(f(....f(x))) = f(x)
ここでは、の出力がf(x)
入力としてf
再度渡されますが、プログラミングの場合は常にそうである必要はありません。