Konuyu Açan
#0
WeakMap ve WeakSet Kullanımı
Web uygulamaları geliştirirken, özellikle JavaScript ekosisteminde, veri yapıları ve bellek yönetimi arasındaki ilişkiyi doğru anlamak kritik öneme sahiptir. Hepimizin sıkça kullandığı Map ve Set objeleri, anahtar-değer çiftlerini veya benzersiz değer koleksiyonlarını yönetmek için oldukça güçlü araçlar sunar. Ancak bu yapıların bellek üzerindeki davranışları, özellikle de çöp toplama (garbage collection) mekanizmasıyla etkileşimleri, bazen beklenmedik bellek sızıntılarına yol açabilir. İşte tam bu noktada, WeakMap ve WeakSet devreye giriyor; bellek yönetimi konusunda bize daha esnek ve güvenli bir yaklaşım sunuyorlar.
WeakMap Nedir ve Neden İhtiyaç Duyarız?
Geleneksel Map objeleri, anahtarlarını güçlü referanslarla tutar. Bu ne anlama geliyor? Eğer bir nesneyi Map'in anahtarı olarak kullanırsanız, o nesneye başka hiçbir yerden referans olmasa bile, Map içinde bulunduğu sürece çöp toplayıcı tarafından temizlenemez. Bu durum, özellikle uzun ömürlü uygulamalarda veya dinamik olarak oluşturulan ve yok olan birçok nesneyle çalıştığınızda, istenmeyen bellek sızıntılarına neden olabilir. Nesnenin artık kullanılmadığını düşünseniz bile, Map içindeki referansı yüzünden bellekte kalmaya devam eder.
WeakMap ise bu soruna zarif bir çözüm getirir. WeakMap'in anahtarları sadece nesneler olabilir ve bu anahtarlar zayıf referanslarla tutulur. Yani, eğer bir WeakMap anahtarı olan nesneye başka hiçbir yerden güçlü bir referans kalmazsa, çöp toplayıcı o nesneyi bellekten temizleyebilir. Nesne temizlendiğinde, WeakMap içindeki ilgili anahtar-değer çifti de otomatik olarak ortadan kalkar. Bu, adeta hayalet bir referans gibi... Nesne varsa tutar, yoksa kendiliğinden temizlenir.
WeakMap Kullanım Alanları ve Kısıtlamaları
WeakMap'in bu özelliği, onu belirli senaryolar için vazgeçilmez kılar:
Peki, WeakMap'in bir bedeli yok mu? Elbette var. Zayıf referans mekanizması nedeniyle WeakMap'ler bazı önemli kısıtlamalara sahiptir:
Bu kısıtlamalar, WeakMap'i genel amaçlı bir veri yapısı olmaktan çıkarıp, çok özel ve niş durumlarda parlayan bir araç haline getirir.
WeakMap ile Pratik Bir Örnek: Nesnelere Özel Veri Ekleme
Diyelim ki bir sınıfınız var ve her kullanıcı nesnesine, dışarıdan doğrudan erişilememesi gereken ancak kullanıcı nesnesi var olduğu sürece geçerli olacak bazı özel ayarlar veya oturum bilgileri eklemek istiyorsunuz.
Bu örnekte, WeakMap'i, nesnelerine bağlı özel ayarları tutuyor. dediğimizde, nesnesine olan son güçlü referansı kaldırmış oluyoruz. Bir süre sonra çöp toplayıcı nesnesini bellekten sildiğinde, içindeki ile ilişkili veri de otomatik olarak temizlenir. İşte bu, bellek sızıntılarını önlemenin şık bir yolu.
WeakSet Nedir ve WeakMap ile Benzerlikleri/Farkları Nelerdir?
WeakSet, WeakMap'in "set" karşılığıdır. Yani, sadece nesnelerden oluşan benzersiz bir koleksiyon tutar ve bu nesneleri zayıf referanslarla saklar. [B]WeakMap[/'te olduğu gibi, eğer bir nesneye [B]WeakSet[/B] dışında başka hiçbir yerden güçlü bir referans kalmazsa, o nesne çöp toplayıcı tarafından temizlenebilir ve WeakSet içindeki varlığı da otomatik olarak son bulur.
WeakSet de WeakMap ile benzer kısıtlamalara sahiptir:
WeakSet'in en yaygın kullanım alanlarından biri, bir nesnenin belirli bir "durum" koleksiyonuna ait olup olmadığını izlemektir. Örneğin, "şu anda aktif olan kullanıcılar", "işlenmeyi bekleyen görevler" gibi durumları yönetirken, bu nesneler yok olduğunda otomatik olarak koleksiyondan da çıkarılmasını isteyebilirsiniz.
WeakSet ile Pratik Bir Örnek: Aktif Oturum Takibi
Bir web uygulamasında, o an aktif olan kullanıcı oturumlarını takip etmek isteyebilirsiniz. Her oturum bir nesne ile temsil edilsin.
[CODE]
let activeSessions = new WeakSet();
class Session {
constructor(sessionId) {
this.sessionId = sessionId;
this
Web uygulamaları geliştirirken, özellikle JavaScript ekosisteminde, veri yapıları ve bellek yönetimi arasındaki ilişkiyi doğru anlamak kritik öneme sahiptir. Hepimizin sıkça kullandığı Map ve Set objeleri, anahtar-değer çiftlerini veya benzersiz değer koleksiyonlarını yönetmek için oldukça güçlü araçlar sunar. Ancak bu yapıların bellek üzerindeki davranışları, özellikle de çöp toplama (garbage collection) mekanizmasıyla etkileşimleri, bazen beklenmedik bellek sızıntılarına yol açabilir. İşte tam bu noktada, WeakMap ve WeakSet devreye giriyor; bellek yönetimi konusunda bize daha esnek ve güvenli bir yaklaşım sunuyorlar.
WeakMap Nedir ve Neden İhtiyaç Duyarız?
Geleneksel Map objeleri, anahtarlarını güçlü referanslarla tutar. Bu ne anlama geliyor? Eğer bir nesneyi Map'in anahtarı olarak kullanırsanız, o nesneye başka hiçbir yerden referans olmasa bile, Map içinde bulunduğu sürece çöp toplayıcı tarafından temizlenemez. Bu durum, özellikle uzun ömürlü uygulamalarda veya dinamik olarak oluşturulan ve yok olan birçok nesneyle çalıştığınızda, istenmeyen bellek sızıntılarına neden olabilir. Nesnenin artık kullanılmadığını düşünseniz bile, Map içindeki referansı yüzünden bellekte kalmaya devam eder.
WeakMap ise bu soruna zarif bir çözüm getirir. WeakMap'in anahtarları sadece nesneler olabilir ve bu anahtarlar zayıf referanslarla tutulur. Yani, eğer bir WeakMap anahtarı olan nesneye başka hiçbir yerden güçlü bir referans kalmazsa, çöp toplayıcı o nesneyi bellekten temizleyebilir. Nesne temizlendiğinde, WeakMap içindeki ilgili anahtar-değer çifti de otomatik olarak ortadan kalkar. Bu, adeta hayalet bir referans gibi... Nesne varsa tutar, yoksa kendiliğinden temizlenir.
WeakMap Kullanım Alanları ve Kısıtlamaları
WeakMap'in bu özelliği, onu belirli senaryolar için vazgeçilmez kılar:
- Nesnelere Özel Veri Ekleme (Private Data): Bir nesnenin dışarıdan erişilememesi gereken, ancak o nesneyle ilişkili özel verileri saklamak istediğinizde WeakMap kullanabilirsiniz. Nesne bellekten silindiğinde, bu özel veriler de otomatik olarak temizlenir.
- DOM Elemanlarına Meta Veri İliştirme: Web arayüzlerinde dinamik olarak oluşturulan DOM elemanlarına özel veriler veya durum bilgileri eklemek istediğinizde çok işe yarar. Eleman DOM'dan kaldırıldığında ve başka referansı kalmadığında, WeakMap içindeki verisi de otomatik olarak temizlenir, böylece bellek sızıntıları önlenir.
- Hesaplama Sonuçlarını Önbelleğe Alma (Caching): Belirli bir nesneye bağlı olarak yapılan pahalı bir hesaplamanın sonucunu önbelleğe alabilirsiniz. Nesne var olduğu sürece önbellekteki sonucu kullanırsınız, nesne yok olduğunda önbellek girdisi de kendiliğinden silinir.
Peki, WeakMap'in bir bedeli yok mu? Elbette var. Zayıf referans mekanizması nedeniyle WeakMap'ler bazı önemli kısıtlamalara sahiptir:
- Anahtarlar Sadece Nesne Olabilir: WeakMap anahtarı olarak ilkel değerler (string, number, boolean, symbol, null, undefined) kullanamazsınız. Sadece nesneler (,CODE
1
Object,CODE1
Array,CODE1
Function,CODE1
Datevb.) anahtar olabilir.CODE1
RegExp
- Döngü Yapılamaz ve Boyutu Bilinemez: WeakMap üzerinde döngüsü kullanamaz,CODE
1
for...ofmetodunu çağıramaz veyaCODE1
.forEach()özelliğine erişemezsiniz. Neden mi? Çünkü herhangi bir anda, anahtarların çöp toplayıcı tarafından silinip silinmediği garanti edilemez. Eğer döngü sırasında bir anahtar silinirse, döngünün davranışı öngörülemez hale gelir. Bu belirsizlik yüzünden, WeakMap'in o anki tam boyutunu bilmek de mümkün değildir. Bu, deterministik olmayan bir yapı olmasından kaynaklanır.CODE1
.size
- Metotlar Sınırlıdır: Sadece ,CODE
1
get(key),CODE1
set(key, value)veCODE1
has(key)metotları mevcuttur.CODE1
delete(key)
Bu kısıtlamalar, WeakMap'i genel amaçlı bir veri yapısı olmaktan çıkarıp, çok özel ve niş durumlarda parlayan bir araç haline getirir.
WeakMap ile Pratik Bir Örnek: Nesnelere Özel Veri Ekleme
Diyelim ki bir
CODE
1UserCODE
12345678910111213141516171819202122232425262728
let userSettings = new WeakMap();
class User {
constructor(name, id) {
this.name = name;
this.id = id;
}
}
let user1 = new User("Alice", 101);
let user2 = new User("Bob", 102);
// Kullanıcı nesnelerine özel ayarları WeakMap'e ekliyoruz
userSettings.set(user1, { theme: "dark", notifications: true });
userSettings.set(user2, { theme: "light", notifications: false });
console.log("Alice'in ayarları:", userSettings.get(user1)); // { theme: 'dark', notifications: true }
// user1 nesnesine olan tüm güçlü referansları kaldıralım
user1 = null; // Artık user1'e başka bir yerden referans yok
// Çöp toplayıcı çalıştığında (ne zaman çalışacağı garanti değildir),
// user1 nesnesi bellekten silinecek ve WeakMap'teki ilgili giriş de otomatik olarak kaybolacak.
// Bu durumu doğrudan gözlemlemek zordur, ancak WeakMap'in çalışma prensibi budur.
// user2 hala mevcut
console.log("Bob'un ayarları:", userSettings.get(user2)); // { theme: 'light', notifications: false }
Bu örnekte,
CODE
1userSettingsCODE
1UserCODE
1user1 = nullCODE
1user1CODE
1user1CODE
1userSettingsCODE
1user1WeakSet Nedir ve WeakMap ile Benzerlikleri/Farkları Nelerdir?
WeakSet, WeakMap'in "set" karşılığıdır. Yani, sadece nesnelerden oluşan benzersiz bir koleksiyon tutar ve bu nesneleri zayıf referanslarla saklar. [B]WeakMap[/'te olduğu gibi, eğer bir nesneye [B]WeakSet[/B] dışında başka hiçbir yerden güçlü bir referans kalmazsa, o nesne çöp toplayıcı tarafından temizlenebilir ve WeakSet içindeki varlığı da otomatik olarak son bulur.
WeakSet de WeakMap ile benzer kısıtlamalara sahiptir:
- Sadece Nesneler Depolayabilir: WeakSet'e ilkel değerler ekleyemezsiniz. Yalnızca nesneleri saklayabilir.
- Döngü Yapılamaz ve Boyutu Bilinemez: WeakSet üzerinde döngü yapamazsınız ve özelliğine erişemezsiniz. Sebepleri WeakMap ile tamamen aynıdır; belirsizlik ve deterministik olmama durumu.CODE
1
.size
- Metotları Sınırlıdır: Sadece ,CODE
1
add(value)veCODE1
has(value)metotları mevcuttur.CODE1
delete(value)
WeakSet'in en yaygın kullanım alanlarından biri, bir nesnenin belirli bir "durum" koleksiyonuna ait olup olmadığını izlemektir. Örneğin, "şu anda aktif olan kullanıcılar", "işlenmeyi bekleyen görevler" gibi durumları yönetirken, bu nesneler yok olduğunda otomatik olarak koleksiyondan da çıkarılmasını isteyebilirsiniz.
WeakSet ile Pratik Bir Örnek: Aktif Oturum Takibi
Bir web uygulamasında, o an aktif olan kullanıcı oturumlarını takip etmek isteyebilirsiniz. Her oturum bir nesne ile temsil edilsin.
[CODE]
let activeSessions = new WeakSet();
class Session {
constructor(sessionId) {
this.sessionId = sessionId;
this