WeakMaps के लिए मेरे पास यह सरल सुविधा आधारित उपयोग मामला / उदाहरण है।
उपयोगकर्ताओं का एक संग्रह
मैं एक के साथ शुरुआत की User
वस्तु जिसका गुण एक में शामिल हैं fullname
, username
, age
, gender
और एक विधि कहा जाता हैprint
जो अन्य संपत्तियों के एक मानव पठनीय सारांश प्रिंट करता है।
/**
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}`);
}
मैंने तब users
कई उपयोगकर्ताओं का एक संग्रह रखने के लिए एक मानचित्र जोड़ा , जिसके द्वारा कुंजीबद्ध हैंusername
।
/**
Collection of Users, keyed by username.
*/
var users = new Map();
संग्रह को जोड़ने के लिए भी सहायक कार्यों को जोड़ना, प्राप्त करना, एक उपयोगकर्ता को हटाना और यहां तक कि पूर्णता के लिए सभी उपयोगकर्ताओं को प्रिंट करने के लिए एक फ़ंक्शन भी आवश्यक था।
/**
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();
});
}
उपरोक्त सभी कोड के साथ, कहते हैं NodeJS , केवल users
मानचित्र में पूरी प्रक्रिया के भीतर उपयोगकर्ता ऑब्जेक्ट का संदर्भ है। व्यक्तिगत उपयोगकर्ता वस्तुओं का कोई अन्य संदर्भ नहीं है।
इस कोड को इंटरएक्टिव NodeJS शेल चला रहा है, उदाहरण के रूप में मैं चार उपयोगकर्ताओं को जोड़ता हूं और उन्हें प्रिंट करता हूं:
अतिरिक्त कोडिंग का उपयोग किए बिना उपयोगकर्ताओं के लिए अधिक जानकारी जोड़ें
अब कहते हैं कि एक नई सुविधा की आवश्यकता है जिसमें प्रत्येक उपयोगकर्ता सोशल मीडिया प्लेटफ़ॉर्म (एसएमपी) लिंक को उपयोगकर्ता वस्तुओं के साथ ट्रैक करने की आवश्यकता है।
यहां यह भी महत्वपूर्ण है कि यह सुविधा मौजूदा कोड में न्यूनतम हस्तक्षेप के साथ लागू की जानी चाहिए।
यह निम्नलिखित तरीके से WeakMaps के साथ संभव है।
मैं ट्विटर, फेसबुक, लिंक्डइन के लिए तीन अलग-अलग WeakMaps जोड़ता हूं।
/*
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
केवल दिए गए SMP नाम के साथ जुड़े WeakMap को वापस करने के लिए जोड़ा जाता है।
/**
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;
}
दिए गए SMP WeakMap में एक उपयोगकर्ता SMP लिंक जोड़ने का कार्य।
/**
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);
}
}
एक फ़ंक्शन केवल उन उपयोगकर्ताओं को प्रिंट करने के लिए है जो दिए गए एसएमपी पर मौजूद हैं।
/**
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)}`)
}
});
}
अब आप उपयोगकर्ताओं के लिए SMP लिंक जोड़ सकते हैं, साथ ही प्रत्येक उपयोगकर्ता के कई SMP पर लिंक होने की संभावना है।
... पहले के उदाहरण के साथ जारी रखते हुए, मैं उपयोगकर्ताओं के लिए एसएमपी लिंक जोड़ता हूं, उपयोगकर्ताओं के लिए कई लिंक बिल और सारा और फिर प्रत्येक एसएमपी के लिंक अलग-अलग प्रिंट करते हैं:
अब कहते हैं कि उपयोगकर्ता को users
कॉल करके मानचित्र से हटा दिया गया हैdeleteUser
। जो उपयोगकर्ता ऑब्जेक्ट के लिए एकमात्र संदर्भ निकालता है। यह बदले में SMP WeakMaps के किसी भी / सभी से SMP लिंक को हटा देगा (कचरा संग्रह द्वारा) उपयोगकर्ता ऑब्जेक्ट के बिना इसके SMP लिंक के किसी भी उपयोग करने का कोई तरीका नहीं है।
... उदाहरण के साथ जारी रखते हुए, मैं उपयोगकर्ता बिल को हटाता हूं और फिर उसके साथ जुड़े एसएमपी के लिंक का प्रिंट आउट लेता हूं:
व्यक्तिगत रूप से SMP लिंक को अलग से हटाने के लिए किसी भी अतिरिक्त कोड की आवश्यकता नहीं है और इस सुविधा से पहले मौजूदा कोड को वैसे भी संशोधित नहीं किया गया था।
यदि WeakMaps के साथ / बिना इस सुविधा को जोड़ने का कोई और तरीका है तो कृपया बेझिझक टिप्पणी कर सकते हैं।