(Dengan asumsi lingkungan single-threaded)
Fungsi yang memenuhi kriteria ini adalah:
bool MyClass::is_initialized = false;
void MyClass::lazy_initialize()
{
if (!is_initialized)
{
initialize(); //Should not be called multiple times
is_initialized = true;
}
}
Intinya, saya bisa memanggil fungsi ini beberapa kali dan tidak khawatir tentang hal itu menginisialisasi MyClass
beberapa kali
Fungsi yang tidak memenuhi kriteria ini mungkin:
Foo* MyClass::ptr = NULL;
void initialize()
{
ptr = new Foo();
}
Memanggil initialize()
beberapa kali akan menyebabkan kebocoran memori
Motivasi
Akan menyenangkan untuk memiliki satu kata ringkas untuk menggambarkan perilaku ini sehingga fungsi yang diharapkan memenuhi kriteria ini dapat dikomentari dengan baik (terutama berguna saat menggambarkan fungsi antarmuka yang diharapkan akan ditimpa)
Jawaban:
Jenis fungsi / operasi ini disebut Idempotent
Dalam matematika, ini berarti bahwa jika f adalah idempoten, f ( f (x)) = f (x), yang sama dengan mengatakan f ∘ f = f .
Dalam ilmu komputer, ini berarti bahwa jika
f(x);
idempoten,f(x);
sama denganf(x); f(x);
.Catatan: Makna ini tampaknya berbeda, tetapi di bawah semantik negara denotasional , kata "idempoten" sebenarnya memiliki makna yang sama persis dalam matematika dan ilmu komputer.
sumber
Istilah yang tepat untuk ini (seperti Woofas menyebutkan ) adalah idempotensi. Saya ingin menambahkan bahwa sementara Anda dapat memanggil
func1
metode Anda idempoten, Anda tidak dapat menyebutnya sebagai fungsi murni . Sifat-sifat fungsi murni adalah dua: ia harus idempoten dan tidak boleh memiliki efek samping, yang berarti, tidak ada mutasi variabel statis lokal, variabel non-lokal, argumen referensi yang dapat diubah atau aliran I / O.Alasan saya menyebutkan ini adalah bahwa fungsi idempoten dengan efek samping juga tidak baik, karena secara teknis idempoten mengacu pada hasil pengembalian fungsi, dan bukan pada efek samping. Jadi secara teknis
func2
metode Anda idempoten, karena output tidak berubah sesuai dengan input.Anda kemungkinan besar ingin menentukan bahwa Anda ingin fungsi murni. Contoh fungsi murni adalah sebagai berikut:
Lebih banyak bacaan dapat ditemukan di artikel Wikipedia "Fungsi murni" .
sumber
PUT
danDELETE
HTTP disebut idempoten tepat karena mengeksekusi efek sampingnya beberapa kali memiliki efek yang sama dengan mengeksekusi mereka hanya sekali. Anda mengatakan "berarti idempotensif∘f = f
", sedangkan dalam pemrograman, yang kami maksudkan "mengeksekusif
memiliki efek yang sama dengan mengeksekusif; f
". Perhatikan bahwa Anda dapat dengan mudah mengubah makna kedua menjadi yang pertama dengan menambahkan parameter "dunia".func1(1) != func1(func1(1))
.void f(int var) { someGlobalVariable = var; }
. Murni, tidak idempoten:int func1(int var) { return var + 1; }
.Istilahnya adalah Idempotensi . Perhatikan di bawah ini bahwa ada perbedaan yang jelas antara fungsi Idempoten (Dipanggil secara rekursif; Blok kode kedua dan definisi Matematika), dan idempoten fungsional (Dipanggil berulang kali dengan input yang sama secara berurutan; Blok kode pertama dan sering istilah yang dimaksud dalam Pemrograman).
sumber
Dalam fisika saya pernah mendengar ini disebut sebagai proyeksi :
Secara grafis, ini masuk akal jika Anda melihat kartun proyeksi vektor :
Dalam gambar, sebuah 1 adalah proyeksi dari sebuah ke b , yang seperti aplikasi pertama dari fungsi Anda. Proyeksi berikutnya dari suatu 1 ke b memberikan hasil yang sama dengan 1 . Dengan kata lain, ketika Anda memanggil proyeksi berulang kali, itu memiliki efek yang sama dengan memanggilnya sekali.
Peringatan yang adil: Saya belum pernah mendengar ini digunakan di luar fisika, jadi kecuali Anda memiliki tipe-tipe di tim Anda, Anda mungkin membingungkan semua orang.
sumber
Ini adalah algoritma Deterministic karena diberi input yang sama (dalam hal ini tidak ada input), ia akan selalu menghasilkan output yang sama.
Database SQL tertarik pada fungsi Deterministik .
Suatu fungsi harus deterministik jika digunakan dalam menghitung indeks.
Misalnya, di SQLite, fungsi non-deterministik berikut tidak dapat digunakan dalam indeks:
random()
,changes()
,last_insert_rowid()
dansqlite3_version()
.sumber
func2
adalah deterministik (tidak ada efek acak yang terlibat), tetapi sudah dinyatakan sebagai melanggar properti yang ia cari.Selain jawaban lain, jika ada input spesifik ke functon yang memiliki properti ini, itu adalah titik tetap , titik invarian atau titik perbaikan fungsi. Misalnya, 1 untuk daya apa pun sama dengan 1, jadi (1ⁿ) ⁿ = 1ⁿ = 1.
Kasus khusus dari program yang menghasilkan dirinya sendiri sebagai output adalah quine .
sumber