У мене є цей простий варіант використання / приклад використання для слабких карт.
УПРАВЛІННЯ КОЛЕКЦІєю КОРИСТУВАЧІВ
Я почав з 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, як приклад я додаю чотирьох користувачів та роздруковую їх:
ДОДАТИ БІЛЬШЕ ІНФОРМАЦІЇ ДЛЯ КОРИСТУВАЧІВ БЕЗ МОДИФІКУВАННЯ Існуючого КОДУ
Тепер скажіть, що потрібна нова функція, в якій потрібно відстежувати посилання кожного платника соціальних медіа (SMP) разом із об'єктами користувача.
Ключовим тут є також те, що ця функція повинна бути реалізована з мінімальним втручанням у існуючий код.
Це можливо з 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-посилання для користувачів, кілька посилань для користувачів Білла і Сари, а потім друкую посилання для кожної SMP окремо:
Тепер скажіть, що Користувача видалено з users
Карти за телефоном deleteUser
. Це видаляє єдине посилання на об’єкт користувача. Це, в свою чергу, також очистить SMP-посилання з будь-якого / всіх слабких карт SMP (за допомогою збирання сміття), оскільки без User Object немає можливості отримати доступ до жодного його SMP-посилання.
... продовжуючи Приклад, я видаляю Білл користувача, а потім роздруковую посилання SMP, з якими він був пов'язаний:
Немає вимоги будь-якого додаткового коду окремо видаляти SMP-посилання окремо, а існуючий код до того, як ця функція жодним чином не була змінена.
Якщо є якийсь інший спосіб додати цю функцію за допомогою / без слабких карт, будь ласка, коментуйте.