Yanıtlar:
Hesaplamada, idempotent işlem, aynı giriş parametreleriyle birden fazla çağrıldığında ek bir etkisi olmayan bir işlemdir. Örneğin, bir öğeyi kümeden kaldırmak kümede idempotent bir işlem olarak kabul edilebilir.
Matematikte, idempotent bir işlem f (f (x)) = f (x) 'dir . Örneğin, abs()
işlev idempotent çünkü abs(abs(x)) = abs(x)
herkes için x
.
Bu biraz farklı tanımlar , matematiksel tanımdaki x'in bir nesnenin durumunu temsil ettiği ve f'nin bu nesneyi değiştirebilen bir işlem olduğu düşünülerek uzlaştırılabilir . Örneğin, Python'uset
ve discard
yöntemini düşünün . discard
Yöntem kümesinden bir öğe kaldırır ve eleman yoksa hiçbir şey yapmaz. Yani:
my_set.discard(x)
aynı işlemi iki kez yapmakla tamamen aynı etkiye sahiptir:
my_set.discard(x)
my_set.discard(x)
İdempotent işlemler genellikle bir işlem gerçekleştirme talebinin en az bir kez gerçekleşeceği garanti edilen, ancak bir kereden fazla da olabileceği ağ protokollerinin tasarımında kullanılır. Operasyon idempotent ise, operasyonun iki veya daha fazla kez yapılmasında herhangi bir zarar yoktur.
Daha fazla bilgi için idempotence hakkındaki Wikipedia makalesine bakın .
Yukarıdaki cevap daha önce bazı yanlış ve yanıltıcı örneklere sahipti. Aşağıda Nisan 2014'ten önce yazılan yorumlar daha eski bir revizyona işaret etmektedir.
set
örneğinde, ayarlanan nesnenin açıkça durumu vardır ve ayrıca bazı idempotent işlemler sunar discard
.
discard
aynı zamanda dönüş değeri durumunu kapsayan bir bilgisi olmayan bir şekilde uygulanabilir: discard([my_set, x]) = [my_new_set, x]
. Böylece yapabilirsiniz discard(discard([my_set, x]))
. Not [my_new_set, x]
olan sadece bir argüman ve tip 2-lü olduğunu.
discard(x)
seti artık içerecektir: ikinci kez ilk kez çağırmak aynı etkiye sahip olacaktır x
. Hesaplama idempotence bir sistemin sağlamlığı ile ilgilidir. İşler başarısız olabileceğinden (örn. Ağ kesintisi), bir hata algılandığında nasıl iyileşirsiniz? En kolay kurtarma sadece tekrar yapmaktır, ancak bu sadece tekrar yapmak idempotent olduğunda işe yarar. Örneğin discard(x)
, idempotent, ama pop()
değil. Her şey hata kurtarma ile ilgilidir.
Bir idempotent işlem keyfi sayıda tekrar edilebilir ve sonuç sadece bir kez yapılmış gibi olur. Aritmetik olarak, bir sayıya sıfır eklemek idempotenttir.
İdempotence "RESTful" web hizmetleri bağlamında çok şey konuşuluyor. REST, programlara web içeriğine erişim sağlamak için HTTP'den maksimum düzeyde yararlanmaya çalışır ve genellikle HTTP istekleri ve yanıtları içindeki uzaktan yordam çağrı stili hizmetlerini tünelleyen SOAP tabanlı web hizmetlerinin aksine ayarlanır.
REST bir web uygulamasını "kaynaklar" halinde (bir Twitter kullanıcısı veya bir Flickr görüntüsü gibi) düzenler ve daha sonra bu kaynakları oluşturmak, güncellemek, okumak ve silmek için POST, PUT, GET ve DELETE HTTP fiillerini kullanır.
İdempotence, REST'te önemli bir rol oynar. Bir REST kaynağının temsilini ALIN (örn. Flickr'dan bir jpeg görüntüsü ALIN) ve işlem başarısız olursa, işlem başarılı olana kadar GET'i tekrar tekrar tekrarlayabilirsiniz. Web servisine, görüntünün kaç kez alındığı önemli değildir. Aynı şekilde, Twitter hesap bilgilerinizi güncellemek için RESTful bir web hizmeti kullanıyorsanız, web hizmetinden onay almak için yeni bilgileri gerektiği kadar koyabilirsiniz. Binlerce kez koymak, bir kez koymakla aynıdır. Benzer şekilde bir REST kaynağını binlerce kez silmek, bir kez silmekle aynıdır. Idempotence böylece iletişim hatalarına dayanıklı bir web hizmeti oluşturmayı kolaylaştırır.
İlave okumalar: RESTful Web Services , Richardson ve Ruby (idempotence sayfa 103-104'te tartışılmıştır) ve Roy Fielding'in REST üzerine doktora tezi . Fielding, bölüm 9.1.2'deki idempotence hakkında konuşan HTTP 1.1, RFC-2616'nın yazarlarından biriydi .
Operasyonu kaç kez çağırırsanız yapın, sonuç aynı olacaktır.
truncate
ve delete
.
İdempotence, bir işlemin bir kez veya birden çok kez uygulanmasının aynı etkiye sahip olduğu anlamına gelir.
Örnekler:
İçin temel işlevleri (herhangi bir yan etki ile fonksiyonları) daha sonra Idempotency bu, f (x) = f (f (x)) = f (f (f (x))) = f (f (f (f (x))) anlamına gelir ) = ...... x'in tüm değerleri için
İçin yan etkileri olan fonksiyonlar , Idempotency ayrıca ek bir yan etki, ilk uygulamadan sonra neden olacağı anlamına gelir. İsterseniz dünyanın durumunu ek bir "gizli" parametre olarak düşünebilirsiniz.
Eşzamanlı eylemlerin devam ettiği bir dünyada, idempotent olduğunu düşündüğünüz işlemlerin bu şekilde durduğunu görebilirsiniz (örneğin, başka bir iş parçacığı yukarıdaki örnekte boole bayrağının değerini ayarlayabilir). Temel olarak eşzamanlılık ve değişebilir durumunuz olduğunda, idempotency hakkında çok daha dikkatli düşünmeniz gerekir.
İdempotency genellikle sağlam sistemlerin inşasında yararlı bir özelliktir. Örneğin, üçüncü bir taraftan yinelenen bir ileti alabilme riski varsa, ileti işleyicisinin bir idempotent işlem olarak davranması yararlı olur, böylece ileti efekti yalnızca bir kez olur.
f(x) = f(f(x))
, f(x){return x+1;}
bunun saf bir işlev olmadığı anlamına mı geliyorsunuz ? çünkü f(x) != f(f(x))
: f(1)
2 verirken 3 f(2)
verir.
f(x) = f(f(x))
. Ancak @GregHewgill'in belirttiği gibi, bu tanımın anlamlı olması için x
, bir nesne olarak ve nesnenin f
durumunu değiştiren bir işlem olarak düşünmelisiniz (yani: çıkışı f
mutasyona uğramış bir değerdir x
).
Bir idempotent işlem, aynı parametreleri iletmeniz koşuluyla, birden fazla çağırsanız bile sonucu aynı durumda üretir.
Sadece idempotence gösteren gerçek bir kullanım davası atmak istedim. JavaScript'te, bir grup model sınıfı tanımladığınızı varsayalım (MVC modelinde olduğu gibi). Bunun sıklıkla uygulanma şekli işlevsel olarak böyle bir şeye eşdeğerdir (temel örnek):
function model(name) {
function Model() {
this.name = name;
}
return Model;
}
Daha sonra böyle yeni sınıflar tanımlayabilirsiniz:
var User = model('user');
var Article = model('article');
Ancak, User
sınıfı model('user')
kodun başka bir yerinden geçirmeye çalışırsanız başarısız olur:
var User = model('user');
// ... then somewhere else in the code (in a different scope)
var User = model('user');
Bu iki User
kurucu farklı olurdu. Yani,
model('user') !== model('user');
Bunu idempotent yapmak için , sadece bir tür önbellek mekanizması eklersiniz, şöyle:
var collection = {};
function model(name) {
if (collection[name])
return collection[name];
function Model() {
this.name = name;
}
collection[name] = Model;
return Model;
}
Önbellek ekleyerek, her yaptığınızda model('user')
aynı nesne olacaktır ve bu yüzden idempotenttir. Yani:
model('user') === model('user');
Bir idempotent işlem, sonucu, yani sistemin durumunu, ilk uygulamanın ötesinde değiştirmeden birden çok kez uygulanabilen bir işlem, eylem veya istektir.
ÖRNEKLER (WEB UYGULAMA BAĞLAMI):
TANIM: Birden çok özdeş istekte bulunmak, tek bir talepte bulunmakla aynı etkiye sahiptir. E-posta mesajlaşma sistemindeki bir mesaj açılır ve veritabanında "açık" olarak işaretlenir. Mesaj defalarca açılabilir, ancak bu tekrarlanan eylem sadece bu mesajın "açık" durumda olmasına neden olur. Bu idempotent bir ameliyat. Kaynakla eşleşmeyen bilgileri (sistemin durumu) kullanarak bir kaynağa ilk kez güncelleme yaptığında, kaynak güncellendiğinde sistemin durumu değişir. Biri aynı güncelleştirmeyi bir kaynağa art arda PUT yaparsa, güncelleştirmedeki bilgiler her PUT'ta zaten sistemde bulunan bilgilerle eşleşir ve sistemin durumunda herhangi bir değişiklik olmaz. Aynı bilgilere sahip tekrarlanan PUT'lar idempotenttir:
IDEMPOTENT OLMAYAN: Bir işlem her zaman durum değişikliğine neden oluyorsa, aynı iletiyi bir kullanıcıya defalarca POST yapmak gibi, her seferinde veritabanında gönderilen ve saklanan yeni bir iletiyle sonuçlanırsa, işlemin IDEMPOTENT OLMADIĞINI söyleriz.
NULLIPOTENT: Bir işlemin veritabanında herhangi bir değişiklik yapmadan yalnızca bir web sayfasında bilgi görüntülemek gibi bir yan etkisi yoksa (başka bir deyişle, yalnızca veritabanını okuyorsunuz), işlemin NULLIPOTENT olduğunu söylüyoruz. Tüm GET'ler nullipotent olmalıdır.
Sistemin durumu hakkında konuşurken, günlüğe kaydetme ve tanılama gibi umarım zararsız ve kaçınılmaz etkileri göz ardı ediyoruz.
Idempotent Operations: Birden fazla kez çalıştırıldığında yan etkisi olmayan işlemler.
Örnek : Bir veri kaynağından değerleri alan ve bunu söyleyen bir işlem, onu
Yazdırır . (Bazı değerleri veya durumları değiştirdikçe)
Örnek: Bir banka hesabından çekilen bir işlem
Oldukça ayrıntılı ve teknik cevaplar. Sadece basit bir tanım eklemek.
Idempotent = Yeniden çalıştırılabilir
Örneğin, bir Create
defadan fazla yürütülürse ,
işlemin kendi başına hatasız çalışması garanti edilmez. Ancak bir işlem varsa, CreateOrUpdate
yeniden çalıştırılabilirliği (İdempotency) belirtir.
Bir küme üzerindeki idempotent işlemi, bir veya daha fazla kez uygulandığında üyelerini değiştirmeden bırakır.
X'in bir dizi pozitif tamsayıya ait olduğu mutlak (x) gibi tekli bir işlem olabilir . Burada mutlak (mutlak (x)) = x.
Kendisi ile bir kümenin birleşmesi her zaman aynı kümeyi döndürecek gibi ikili bir işlem olabilir .
şerefe
Her n. Sonucun, 1. sonucun değeriyle eşleşen bir çıktı ile sonuçlanacağı herhangi bir işlemdir. Örneğin -1 mutlak değeri 1'dir. Mutlak -1 değerinin mutlak değeri 1'dir. Mutlak değerin mutlak değeri -1'in mutlak değeri 1'dir.
Ayrıca bakınız: Özyineleme kullanmak için ne zaman aptalca bir zaman olurdu?
İdempotent bir işlemi anlamanın iyi bir örneği, bir aracı uzaktan anahtarla kilitlemek olabilir.
log(Car.state) // unlocked
Remote.lock();
log(Car.state) // locked
Remote.lock();
Remote.lock();
Remote.lock();
log(Car.state) // locked
lock
idempotent bir işlemdir. Her çalıştırdığınızda lock
, yanıp sönme gibi bazı yan etkiler olsa bile , kilit işlemini kaç kez çalıştırırsanız sürün, araba hala aynı kilitli durumdadır.
5c'im: Entegrasyon ve ağ oluşturmada, idempotency çok önemlidir. Gerçek hayattan birkaç örnek: Hayal edin, hedef sisteme veri sağlıyoruz. Bir dizi mesajla iletilen veriler. 1. Dizi kanalda karıştırılırsa ne olur? (Ağ paketleri her zaman olduğu gibi :)). Hedef sistem idempotent ise, sonuç farklı olmayacaktır. Hedef sistem dizideki doğru sıraya bağlıysa, hedef siteye doğru sıralamayı geri yükleyecek resequencer uygulamamız gerekir. 2. Mesaj kopyaları olursa ne olur? Hedef sistemin kanalı zamanında onaylamazsa, kaynak sistem (veya kanalın kendisi) genellikle iletinin başka bir kopyasını gönderir. Sonuç olarak, hedef sistem tarafında yinelenen mesaj olabilir. Hedef sistem idempotent ise, onunla ilgilenir ve sonuç farklı olmaz. Hedef sistem idempotent değilse, kanalın hedef sistem tarafındaki tekilleştiriciyi uygulamalıyız.
Kısacası , Idempotent işlemleri, idempotent işlemleri kaç kez çalıştırırsanız yapın işlemin farklı sonuçlara yol açmayacağı anlamına gelir.
Örneğin, HTTP spesifikasyonunun tanımına göre GET, HEAD, PUT, and DELETE
, idempotent işlemler; ancak POST and PATCH
değildir. Bu yüzden bazen POST
yerini alır PUT
.
Yeniden deneme güvenli.
Genellikle bilgisayar bilimindeki anlamını anlamanın en kolay yoludur.
Idempotent operations are often used in the design of network protocols
burada ilişkili bir örnek olduğunu belirttiğinden ** GET'in sunucudaki hiçbir şeyi değiştirmediği varsayılır, bu nedenle GET, idempotenttir. HTTP / servlet bağlamında, aynı isteğin olumsuz sonuç vermeden iki kez yapılabileceği anlamına gelir. ** POST idempotent DEĞİLDİR.