Tekrar tekrar çağrıldığında, bir kez çağırmakla aynı etkiye sahip olan bir fonksiyon için kullanılan terim nedir?


96

(Tek iş parçacıklı bir ortam varsayarak)

Bu kriteri yerine getiren bir fonksiyon:

bool MyClass::is_initialized = false;

void MyClass::lazy_initialize()
{
    if (!is_initialized)
    {
        initialize(); //Should not be called multiple times
        is_initialized = true;
    }
}

Temelde, bu işlevi birçok kez çağırabilirim ve MyClassbirçok kez başlatma konusunda endişelenmeyin.

Bu kriteri yerine getirmeyen bir işlev olabilir:

Foo* MyClass::ptr = NULL;

void initialize()
{
    ptr = new Foo();
}

initialize()Birden çok kez arama yapmak , bellek sızıntısına neden olur

Motivasyon

Bu davranışı tanımlamak için tek bir özlü kelimeye sahip olmak güzel olurdu, böylece bu kriteri yerine getirmesi beklenen fonksiyonlar usulüne göre yorumlanabilir (özellikle geçersiz kılınması beklenen arayüz fonksiyonlarını tanımlarken kullanışlıdır).


67
Yakın seçmen (ler) i: Bütün “isim-şey” sorularının% 99,999'unun (kaba bir tahmin) konu dışı olduğu doğrudur, çünkü tek, doğru, kesin ve objektif bir cevabı yoktur. adlandırma tamamen sübjektif ve görüşlere dayanan olduğunu bu bir yapar OP kendisi tarafından verildi tek doğru, kesin, nesnel cevabı var.
Jörg W Mittag

30
Bunu birden çok kez çağrılması yapar arasına 'var' değişti diğer kod olabilir gibi bir etkisi vardır.
RemcoGerlich

7
OP sorma sırasındaki cevabı biliyorsa, neden bu soru soruldu ? Rep / points / karma binasından başka bir sebep var mı?
dotancohen

13
@dotancohen Q / Kendi kendini cevaplama stili StackExchange'in anahtar kavramlarından biri.
glglgl

17
@glglgl: Değerli sorular için katılıyorum . Bu sorunun ne yararı var? Her bir CS 101 sorusunu OP tarafından sorulan ve derhal yanıtlanan, her bir CS terimini OP tarafından hemen sorulan ve derhal tanımlayan ve her temel algoritmanın lehte ve aleyhinde OP tarafından hemen sorulan soruları almaya başlayacağımızdan endişe duyuyorum ( illa ki bu OP). Yazılım mühendisliği istediğimiz site bu mu?
dotancohen

Yanıtlar:


244

Bu işlev / işlem türüne Idempotent denir

Idempotence (İngiltere: / ˌɪdɛmˈpoʊtəns /, [1] ABD: / ˌaɪdəm - /) [2], matematik ve bilgisayar bilimlerindeki bazı işlemlerin özelliğidir; bu sayede, ilk uygulama dışındaki sonucu değiştirmeden birden fazla kez uygulanabilirler.

Matematikte bu, eğer f idempotent ise, f ( f (x)) = f (x) anlamına gelir; bu, ff = f ifadesiyle aynıdır .

Bilgisayar bilimlerinde bu, eğer geçerli değilse f(x);, f(x);aynı olduğu anlamına gelir f(x); f(x);.

Not: Bu anlamlar farklı görünmektedir, ancak devletin ifade anlamında, "idempotent" kelimesi hem matematik hem de bilgisayar bilimlerinde aynı anlama sahiptir.


Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
maple_shaft

51

Bunun için kesin bir terim ( Woofas'ın da belirttiği gibi) boşuna . Merak func1etmene önemsiz diyebilirken, saf bir işlev diyemediğini eklemek istedim . Saf işlevin özellikleri ikidir: bağımsız olması ve yan etkileri olmamalıdır, yani yerel statik değişkenlerin mutasyonu, yerel olmayan değişkenler, değişken referans argümanları veya I / O akımları mutasyonu olmamalıdır.

Bunu söylememin nedeni, yan etkileri olan bir idempotent işlevinin de iyi olmamasıdır, çünkü teknik olarak idempotent, yan etkilere değil, fonksiyonun geri dönüş çıkışına atıfta bulunur. Bu yüzden teknik olarak func2yönteminiz iddiasızdır, çünkü çıktı girdiye göre değişmez.

Büyük olasılıkla saf bir işlev istediğinizi belirtmek istersiniz. Saf bir fonksiyon örneği aşağıdaki gibi olabilir:

int func1(int var)
{
    return var + 1;
}

"Pure function" başlıklı Wikipedia makalesinde daha fazla okuma bulunabilir .


37
Bağımsızlık tanımınızın çok dar olduğunu ya da başka bir ifadeyle programlamadaki değil, hesaplaşmanın matematiksel tanımını kullandığınızı düşünüyorum. Örneğin, PUTve DELETEHTTP yöntemleri denir İdempotent kesin çünkü onların yan etkilere birden çok kez yürütme sadece bir kez onları çalıştıran aynı etkiye sahiptir. “Boşluk demek f∘f = f” diyorsunuz , programlamada ise “yürütmenin yürütmenin faynı etkiye sahip olduğunu ” kastediyoruz f; f. İkinci anlamı bir "dünya" parametresi ekleyerek birinciye kolayca dönüştürebileceğinizi unutmayın.
Jörg W Mittag

23
@Neil "Idempotency kesinlikle matematiksel bir terimdir." Hayır, değil, aynı zamanda ağ ve istemci sunucu iletişiminde / dağıtık sistemlerinde de kullanılıyor ve JörgWMittag'ın tanımladığı şekilde tanımlanıyor. Bu yararlı bir kavram çünkü aynı işlem / mesajı olan bir sunucuya / istemciye, bu orijinal mesajın ne yapacağını değiştirmeden birden fazla istek vermesine izin veriyor. Bu, güvenilir olmayan iletişiminiz olduğunda kullanışlıdır ve istemcilerin mesajı düştüğü veya sunucular yanıt verdiği için bir komutu yeniden denemeniz gerekir.
opa

7
Saf ve idempotent arasındaki fark hakkında daha fazla ayrıntıya girmelisin. Örnek func1, önemsiz değil çünkü func1(1) != func1(func1(1)).
Tezra

5
Saflık ve mutsuzluk farklıdır. Saf bir fonksiyon matematiksel anlamda anlamsız olmak zorunda değildir (kesinlikle hiçbir yan etkisi olmadığı gibi yan etkiler açısından da anlamsızdır). Idempotent (programlama anlamında) işlevi, OP tarafından verilen örnekte olduğu gibi saf olmak zorunda değildir. Ayrıca, opa'nın da belirttiği gibi, başarısızlık, saflıktan tamamen farklı bir kullanımı olan faydalı bir özelliktir. Saflık kavramını "ahlaksız ve yan etkisi olmayan" olarak tanımlamanız yanlıştır veya en azından yanıltıcıdır.
Frax,

5
Programlama bağlamında, "yan etki" yoktur, ancak bunu dahil etmek için tanımı genişletmek isteseniz, o zaman idempotent bir işlev ve saf bir işlev aynı şey anlamına gelir. Hayır, aynı şeyi hiç kastetmiyorlardı. İdempotent, saf değil: void f(int var) { someGlobalVariable = var; }. Saf, İdempotent değil: int func1(int var) { return var + 1; }.
JLRishe

6

Terim Idempotence . Aşağıda bir Idempotent işlevi (kendi kendine yinelemeli olarak çağrılır; İkinci kod bloğu ve Matematiksel tanım) ve işlevsel idrarsızlık (Sırasıyla aynı girişle tekrar tekrar çağırılır; Birinci kod bloğu ve sık sık Programlama anlamına gelir) arasında belirgin bir fark olduğuna dikkat edin.

Yan etkileri olan bir f fonksiyonunun, f sıralı bileşimi f altında idempotent olduğu söylenir; f, aynı argüman listesiyle iki kez çağrıldığında, ikinci aramanın hiçbir yan etkisi olmaz ve ilk çağrı ile aynı değeri döndürür (gereken alıntı) (ilk aramanın sonu ile başlangıç ​​arasında başka bir prosedür çağrılmadığı varsayılırsa) ikinci aramanın

Örneğin, aşağıdaki Python kodunu göz önünde bulundurun:

x = 0

def setx(n):
    global x
    x = n

setx(5)
setx(5)

Burada, setx idmpototenttir çünkü setx'e yapılan ikinci çağrı (aynı argümanla), görünür program durumunu değiştirmez: x, ilk çağrıda zaten 5'e, ikinci çağrıda da 5'e ayarlanmıştır. Aynı değer Bunun f ∘ f fonksiyon bileşimi altında kalmama farkından farklı olduğuna dikkat edin. Örneğin, mutlak değer, fonksiyon bileşimi altında çok önemlidir:

def abs(n):
    if n < 0:
        return -n
    else:
        return n

abs(-5) == abs(abs(-5)) == abs(5) == 5

3

Fizikte bunun projeksiyon olarak adlandırıldığını duydum :

bir çıkıntı doğrusal dönüşümdür p , kendisi için bir vektör boşluğundan bu şekilde P 2 = P . Yani, P ne zaman herhangi bir değere iki kez uygulandığında, bir kere uygulanmış gibi aynı sonucu verir (idempotent).

Grafiksel olarak, bir vektör projeksiyonunun bir karikatürüne bakarsanız bu mantıklı olur :

görüntü tanımını buraya girin

Resimde, bir 1 izdüşümüdür bir üzerine b sizin işlevi ilk uygulaması gibidir. Sonradan projeksiyonlar bir 1 üzerine b aynı sonucu verir bir 1 . Başka bir deyişle, bir projeksiyonu art arda çağırdığınızda, bir kez çağırmakla aynı etkiye sahiptir.

Adil uyarı: Bunun fiziğin dışında kullanıldığını hiç duymamıştım, bu yüzden ekibinizde bu tür şeyler olmadıkça herkesin kafasını karıştırabilirsiniz.


2
Gerçekten de, temel bir fonksiyonun nasıl görselleştirilebileceğinin güzel bir somut örneğidir (matematiksel olarak ve özellikle vektör geometrisi / doğrusal cebir alanında). Yazılım fonksiyonunun “idempotence” gerçekten yakın bir kavram olsa da, geliştiricilerin / bilgisayar bilimcilerin bu bağlamda “projeksiyon” kelimesini sık sık kullandıklarını sanmıyorum (yazılım mühendisliğinde “projeksiyon fonksiyonu” daha çok bir nesneyi alan bir fonksiyona atıfta bulunacaktır. ve ondan türetilmiş yeni bir nesneyi ya da örneğin o nesnenin bir özelliğini döndürür)
Pac0

2
@ Pac0 Ah, tamam. Bilim ve programlama arasındaki alanda çalışıyorum ve kelimenin zaten aşırı yüklendiğini farketmedim. Bu terminolojiyi kullanacağım iş yerindeki birkaç örneği düşünebilirim, ancak kuşkusuz, günlük olarak bilim jargonuna katlanmak isteyen insanlarla çalışıyorum :-)
user1717828

3

Bir olan Deterministik algoritma (bu durumda hiçbir girdi olarak) aynı giriş verilen çünkü her zaman aynı çıktıyı üretecek.

Bilgisayar bilimlerinde, deterministik bir algoritma, belirli bir girdi verildiğinde, her zaman aynı çıktıyı üretecek bir algoritmadır, temeldeki makine her zaman aynı durum dizisinden geçer. Deterministik algoritmalar bugüne kadar en çok çalışılan ve bilinen tür algoritmaların yanı sıra en pratiklerinden biridir, çünkü gerçek makinelerde verimli bir şekilde çalıştırılabilirler.

SQL veritabanları Deterministik fonksiyonlarla ilgilenmektedir .

Deterministik bir işlev, aynı girdilere sahip olduğunda her zaman aynı cevabı verir. SQLite'daki çoğu yerleşik SQL işlevi belirleyicidir. Örneğin, abs (X) işlevi, X girişi aynı olduğu sürece her zaman aynı cevabı döndürür.

Bir indeks hesaplamasında kullanılıyorsa, bir fonksiyon determinist olmalıdır.

Örneğin, SQLite, aşağıdaki olmayan deterministik fonksiyonları bir endekste kullanılamaz: random(), changes(), last_insert_rowid()ve sqlite3_version().


6
Asker func2belirleyicidir (rastgele etkiler yoktur), ancak aradığı mülkü ihlal ettiği bildirildi.
Draco18,

Aynı sonucun tekrarlama ile üretildiği, aynı sonucun iç içe geçme veya zincirleme ile elde edildiğini söylemekle aynı değildir. Deterministik fonksiyonlar, önbellekleme için, indeksleme / karmalaştırmadan daha fazla önemlidir.
mckenzm

3

Bu özelliğe sahip functon için özel bir giriş olup olmadığını, diğer cevaplar ek olarak, bu ise sabit bir nokta , değişmez bir nokta ya da fixpoint fonksiyonunun. Örneğin, 1'den herhangi bir güç 1'e eşittir, yani (1ⁿ) ⁿ = 1ⁿ = 1.

Kendini çıktı olarak üreten bir programın özel durumu bir sektir .


Qutor, Cantor setlerinin matematiğe dönüştürülmesi gibi bir yazılımdır. Ve tabii ki kuyruklar belirsiz değildir - çıktı zaten var olduğunda başarısız olurlar ya da önceki sonucu "tıkarlar" ve aynı çıktıya rağmen yeni bir yazı yazarlar.
Carl Witthoft
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.