Bu basit özellik tabanlı kullanım durumu / WeakMaps için örnek var.
KULLANICI KOLEKSİYONUNU YÖNETİN
Ben çıkıyor User
, özellikleri bir içermektedir Nesne fullname
, username
, age
, gender
denilen ve bir yöntem print
diğer özelliklerinin bir insan okunabilir bir özetini yazdırır.
/**
Basic User Object with common properties.
*/
function User(username, fullname, age, gender) {
this.username = username;
this.fullname = fullname;
this.age = age;
this.gender = gender;
this.print = () => console.log(`${this.fullname} is a ${age} year old ${gender}`);
}
Daha sonra users
, anahtarlanan birden fazla kullanıcının bir koleksiyonunu tutmak için çağrılan bir Harita ekledim username
.
/**
Collection of Users, keyed by username.
*/
var users = new Map();
Koleksiyonun eklenmesi, bir Kullanıcı eklemek, almak, silmek için yardımcı işlevler ve hatta bütün kullanıcıların tamlık uğruna yazdırmak için bir işlev gerektiriyordu.
/**
Creates an User Object and adds it to the users Collection.
*/
var addUser = (username, fullname, age, gender) => {
let an_user = new User(username, fullname, age, gender);
users.set(username, an_user);
}
/**
Returns an User Object associated with the given username in the Collection.
*/
var getUser = (username) => {
return users.get(username);
}
/**
Deletes an User Object associated with the given username in the Collection.
*/
var deleteUser = (username) => {
users.delete(username);
}
/**
Prints summary of all the User Objects in the Collection.
*/
var printUsers = () => {
users.forEach((user) => {
user.print();
});
}
Yukarıdaki kodun tamamı, örneğin NodeJS çalıştığında , yalnızca users
Harita tüm işlem içinde Kullanıcı Nesneleri referansına sahiptir. Tek tek Kullanıcı Nesneleri için başka bir referans yoktur.
Bu kodu interaktif bir NodeJS kabuğu olarak çalıştırarak, Örnek olarak dört kullanıcı ekleyip yazdırıyorum:
MEVCUT KODU DEĞİŞTİRMEYEN KULLANICILARA DAHA FAZLA BİLGİ EKLE
Şimdi her kullanıcının Sosyal Medya Platformu (SMP) bağlantılarının Kullanıcı Nesneleri ile birlikte izlenmesi gereken yeni bir özellik gerektiğini söyleyin.
Buradaki anahtar, bu özelliğin mevcut koda minimum müdahale ile uygulanması gerektiğidir.
Bu WeakMaps ile aşağıdaki şekilde mümkündür.
Twitter, Facebook, LinkedIn için üç ayrı WeakMaps ekliyorum.
/*
WeakMaps for Social Media Platforms (SMPs).
Could be replaced by a single Map which can grow
dynamically based on different SMP names . . . anyway...
*/
var sm_platform_twitter = new WeakMap();
var sm_platform_facebook = new WeakMap();
var sm_platform_linkedin = new WeakMap();
getSMPWeakMap
Belirli bir SMP adıyla ilişkili WeakMap'i döndürmek için bir yardımcı işlev eklenir.
/**
Returns the WeakMap for the given SMP.
*/
var getSMPWeakMap = (sm_platform) => {
if(sm_platform == "Twitter") {
return sm_platform_twitter;
}
else if(sm_platform == "Facebook") {
return sm_platform_facebook;
}
else if(sm_platform == "LinkedIn") {
return sm_platform_linkedin;
}
return undefined;
}
Verilen SMP WeakMap'e kullanıcı SMP bağlantısı ekleme işlevi.
/**
Adds a SMP link associated with a given User. The User must be already added to the Collection.
*/
var addUserSocialMediaLink = (username, sm_platform, sm_link) => {
let user = getUser(username);
let sm_platform_weakmap = getSMPWeakMap(sm_platform);
if(user && sm_platform_weakmap) {
sm_platform_weakmap.set(user, sm_link);
}
}
Yalnızca belirtilen SMP'de bulunan kullanıcıları yazdırma işlevi.
/**
Prints the User's fullname and corresponding SMP link of only those Users which are on the given SMP.
*/
var printSMPUsers = (sm_platform) => {
let sm_platform_weakmap = getSMPWeakMap(sm_platform);
console.log(`Users of ${sm_platform}:`)
users.forEach((user)=>{
if(sm_platform_weakmap.has(user)) {
console.log(`\t${user.fullname} : ${sm_platform_weakmap.get(user)}`)
}
});
}
Artık kullanıcılar için SMP bağlantıları da ekleyebilirsiniz, ayrıca her kullanıcının birden fazla SMP'de bir bağlantıya sahip olma olasılığı da vardır.
... önceki Örnekle devam ederek, kullanıcılara SMP bağlantıları, Bill ve Sarah kullanıcıları için birden çok bağlantı ekledim ve her SMP için bağlantıları ayrı ayrı yazdırıyorum:
Şimdi bir Kullanıcının users
arayarak Haritadan silindiğini varsayalım deleteUser
. Bu, Kullanıcı Nesnesi için tek başvuruyu kaldırır. Bu da Kullanıcı Nesnesi olmadan SMP bağlantısına erişmenin bir yolu olmadığından SMP bağlantısını SMP WeakMaps'in (Çöp Toplama yoluyla) herhangi birinden / tümünden temizleyecektir.
... Örnek ile devam ederek, kullanıcı Bill'i silip ilişkilendirilmiş SMP'lerin bağlantılarını yazdırıyorum:
SMP bağlantısını ayrı ayrı silmek için herhangi bir ek kod gerekmez ve bu özellik hiçbir şekilde değiştirilmeden önce mevcut kod.
Bu özelliği WeakMaps ile / WeakMaps olmadan eklemenin başka bir yolu varsa lütfen yorum yapmaktan çekinmeyin.