У меня есть этот простой основанный на функции вариант использования / Пример для 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, просто в качестве примера я добавляю четырех пользователей и печатаю их:
ДОБАВЬТЕ БОЛЬШЕ ИНФОРМАЦИИ ДЛЯ ПОЛЬЗОВАТЕЛЕЙ БЕЗ ИЗМЕНЕНИЯ СУЩЕСТВУЮЩЕГО КОДА
Теперь, скажем, требуется новая функция, в которой ссылки каждого пользователя на платформу Social Media Platform (SMP) должны отслеживаться вместе с объектами пользователя.
Ключевым моментом здесь также является то, что эта функция должна быть реализована с минимальным вмешательством в существующий код.
Это возможно с 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 для пользователей, несколько ссылок для пользователей Билла и Сары, а затем печатаю ссылки для каждого SMP отдельно:
Теперь скажите, что пользователь удален с users
карты по телефону deleteUser
. Это удаляет единственную ссылку на пользовательский объект. Это, в свою очередь, также очистит SMP-ссылку от любого / всех SMP WeakMaps (сборщиком мусора), так как без объекта User невозможно получить доступ к какой-либо из его SMP-ссылок.
... продолжая Пример, я удаляю пользователя Билла, а затем распечатываю ссылки SMP, с которыми он был связан:
Не требуется никакого дополнительного кода для отдельного удаления ссылки SMP отдельно и существующего кода до того, как эта функция не была изменена в любом случае.
Если есть какой-либо другой способ добавить эту функцию с / без WeakMaps, пожалуйста, не стесняйтесь комментировать.