Değişmezlik
- İngilizcesi
- Immutability
- Okunuşu
- imyutıbiliti
Günlük kullanımda iki ad da yaygın.
Kısaca
Değişmezlik, bir değerin oluşturulduktan sonra değiştirilememesi demektir; her güncelleme, orijinali yerinde değiştirmek yerine yeni bir değer üretir.
Değişmezlik (immutability) nedir?
Değişmezlik, oluşturulduktan sonra değiştirilemeyen verilerin özelliğidir. Farklı bir değer istiyorsanız yeni bir tane oluşturursunuz ve orijinal olduğu gibi kalır. Bazı değerler çoğu dilde değişmezdir: örneğin Java, Python ve JavaScript'teki dizeler yerinde düzenlenemez, dolayısıyla her “değişiklik” yeni bir dize döndürür.
Diller değişmezliği farklı yollarla destekler. Bazıları bunu varsayılan yapar; Haskell, Elixir, Erlang ve Clojure'da olduğu gibi veri yapıları asla değiştirilmez. Diğerleri ise seçenek olarak sunar: Java'da final, Kotlin'de val, TypeScript'te readonly, Python'da demetler (tuple) ve dondurulmuş dataclass'lar, JavaScript'te Object.freeze. Kopyalamayı ucuz tutmak için fonksiyonel diller, her şeyi çoğaltmak yerine eski ve yeni sürüm arasında değişmeyen kısımları paylaşan kalıcı veri yapıları (persistent data structures) kullanır.
Basılı bir fiş iyi bir benzetmedir: bir kez basıldıktan sonra kimse toplamı silmez; bir şey değişirse yeni bir fiş düzenlenir ve eskisi güvenilir bir kayıt olarak kalır. Değişmez verileri anlamak daha kolaydır, çünkü programın başka hiçbir bölümü onları sizin arkanızdan değiştiremez ve kilit kullanmadan iş parçacıkları arasında paylaşılabilirler. React gibi kullanıcı arayüzü kütüphaneleri değişiklikleri hızla saptamak için buna dayanır, çünkü yeni bir nesne bir şeyin değiştiği anlamına gelir.
Değişmezlik sıklıkla sabitlerle karıştırılır. JavaScript'te const yalnızca bir değişkenin yeniden atanmasını engeller; işaret ettiği nesne yine de değiştirilebilir, bu yüzden const user = {}; user.name = "Ada"; sorunsuz çalışır. Gerçekten değişmez bir değer ise hiçbir değişken aracılığıyla değiştirilemez.
Önemli noktalar
- Değişmez bir değer oluşturulduktan sonra asla değişmez; güncellemeler yeni değerler üretir.
- Değişmez veriler fonksiyonlar ve iş parçacıkları arasında güvenle paylaşılabilir.
- Fonksiyonel diller değişmezliği varsayılan yapar ve kopyaları ucuz tutmak için kalıcı veri yapıları kullanır.
- JavaScript'in
constgibi sabit bir bağlama, değişmez bir değerle aynı şey değildir.
Örnek
const user = Object.freeze({ name: "Ada", role: "dev" });
// user.role = "admin"; // ignored (throws in strict mode)
// Instead of changing user, create an updated copy
const promoted = { ...user, role: "admin" };
console.log(user.role); // "dev" (original untouched)
console.log(promoted.role); // "admin"Sık sorulan sorular
JavaScript'te `const` ile değişmezlik aynı şey midir?
Hayır. const değişkenin yeniden atanmasını engeller, ancak işaret ettiği nesne ya da dizi yine de değiştirilebilir. Nesnenin kendisindeki değişiklikleri durdurmak için sığ (shallow) olan Object.freeze kullanın ya da nesneleri değiştirmek yerine her zaman yeni nesneler oluşturan bir stil izleyin.
Değişmez veriler yavaş mıdır?
Her değişiklikte büyük bir yapıyı kopyalamak yavaş olurdu, ancak çoğu değişmez tasarım tam kopyalardan kaçınır. Kalıcı veri yapıları değişmeyen kısımları sürümler arasında paylaşır; bu yüzden ek yük genellikle önlediği hatalara kıyasla küçüktür.
Değişmezlik eşzamanlılığa neden yardımcı olur?
Yarış durumları, iş parçacıkları aynı veriyi aynı anda değiştirdiğinde oluşur. Veri asla değişemiyorsa iş parçacıkları onu kilitsiz özgürce okuyabilir, çünkü çakışacak bir şey yoktur.
İlgili sayfalar
- Fonksiyonel programlamaProgramlamanın Temelleri, s. 21Fonksiyonel programlama, paylaşılan verileri değiştirmeyen saf fonksiyonlarla yazılım kurma stilidir; kodu daha öngörülebilir ve test etmesi kolay yapar.
- Saf fonksiyonProgramlamanın Temelleri, s. 47Saf fonksiyon, aynı girdi için her zaman aynı çıktıyı döndüren ve yan etkisi olmayan, yani kendi dışındaki hiçbir şeyi değiştirmeyen fonksiyondur.
- EşzamanlılıkProgramlamanın Temelleri, s. 19Eşzamanlılık, bir programın birden çok görevde örtüşen zaman dilimlerinde ilerleyebilme yeteneğidir; örneğin birçok kullanıcıya aynı anda hizmet vermek gibi.
- Race Conditionİşletim Sistemleri, s. 24Race condition, programın sonucunun paylaşılan veriyi aynı anda kullanan thread, process veya isteklerin öngörülemeyen zamanlamasına bağlı olduğu hatadır.
- DeğişkenProgramlamanın Temelleri, s. 10Değişken, bir programda sayı ya da metin gibi bir değeri tutan ve kodun çalışırken okuyup değiştirebildiği, adlandırılmış bir depolama alanıdır.
- ClojureProgramlama Dilleri, s. 6Clojure, JVM'de çalışan modern ve dinamik bir Lisp lehçesidir; değiştirilemez veriyi, fonksiyonel programlamayı ve REPL tabanlı geliştirmeyi öne çıkarır.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin