ฉันมีกรณี / ตัวอย่างการใช้ 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
Map เท่านั้นที่มีการอ้างอิงถึง User Objects ภายในกระบวนการทั้งหมด ไม่มีการอ้างอิงอื่นไปยังวัตถุผู้ใช้แต่ละรายการ
ใช้รหัสนี้เปลือก NodeJS แบบโต้ตอบเช่นเดียวกับตัวอย่างฉันเพิ่มผู้ใช้สี่คนและพิมพ์พวกเขา:
เพิ่มข้อมูลเพิ่มเติมให้กับผู้ใช้โดยไม่ต้องแก้ไขรหัสที่มีอยู่
ตอนนี้ต้องมีคุณสมบัติใหม่ที่เชื่อมโยง Social Media Platform (SMP) ของผู้ใช้แต่ละคนต้องถูกติดตามพร้อมกับ User Objects
ที่สำคัญคือที่นี่ยังต้องใช้คุณสมบัตินี้ด้วยการแทรกแซงขั้นต่ำกับรหัสที่มีอยู่
สิ่งนี้เป็นไปได้ด้วย WeakMaps ในลักษณะดังต่อไปนี้
ฉันเพิ่ม WeakMaps สามรายการสำหรับ Twitter, Facebook, LinkedIn
/*
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
ถูกเพิ่มเข้ามาเพื่อส่งคืน WeakMap ที่เชื่อมโยงกับชื่อ SMP ที่กำหนด
/**
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 ไปยัง SMP WeakMap ที่กำหนด
/**
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);
}
}
ฟังก์ชันเพื่อพิมพ์เฉพาะผู้ใช้ที่มีอยู่ใน SMP ที่กำหนด
/**
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 หลายรายการ
... ดำเนินการตามตัวอย่างก่อนหน้านี้ฉันเพิ่มลิงก์ SMP ให้กับผู้ใช้ลิงก์หลายรายการสำหรับผู้ใช้ Bill และ Sarah จากนั้นพิมพ์ลิงก์สำหรับแต่ละ SMP แยกจากกัน:
ตอนนี้บอกว่าผู้ใช้จะถูกลบออกจากแผนที่โดยการเรียกusers
deleteUser
ที่ลบการอ้างอิงไปยังวัตถุผู้ใช้เท่านั้น สิ่งนี้ก็จะลบลิงก์ SMP ออกจาก SMP WeakMaps ใด ๆ / ทั้งหมด (โดยการรวบรวมขยะ) เช่นเดียวกับที่ไม่มีออบเจ็กต์ผู้ใช้ไม่มีวิธีเข้าถึงลิงก์ SMP ใด ๆ
... ดำเนินการตามตัวอย่างฉันลบบิลผู้ใช้แล้วพิมพ์ลิงก์ของ SMP ที่เขาเชื่อมโยงด้วย:
ไม่มีข้อกำหนดของรหัสเพิ่มเติมใด ๆ ในการลบลิงก์ SMP แยกต่างหากและรหัสที่มีอยู่ก่อนที่คุณสมบัตินี้จะไม่ได้รับการแก้ไข
หากมีวิธีอื่นในการเพิ่มคุณสมบัตินี้ด้วย / ไม่มี WeakMaps โปรดแสดงความคิดเห็น