J'ai ce cas d'utilisation / exemple simple basé sur des fonctionnalités pour WeakMaps.
GÉRER UNE COLLECTION D'UTILISATEURS
J'ai commencé avec un User
objet dont les propriétés comprennent un fullname
, username
, age
, gender
et une méthode appelée print
qui imprime un résumé lisible par l' homme des autres propriétés.
/**
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}`);
}
J'ai ensuite ajouté une carte appelée users
pour conserver une collection de plusieurs utilisateurs qui sont saisis par username
.
/**
Collection of Users, keyed by username.
*/
var users = new Map();
L'ajout de la collection a également nécessité des fonctions d'aide pour ajouter, obtenir, supprimer un utilisateur et même une fonction pour imprimer tous les utilisateurs par souci d'exhaustivité.
/**
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();
});
}
Avec tout le code ci-dessus exécuté, par exemple NodeJS , seule la users
carte a la référence aux objets utilisateur dans l'ensemble du processus. Il n'y a aucune autre référence aux objets utilisateur individuels.
Exécuter ce code un shell NodeJS interactif, tout comme un exemple, j'ajoute quatre utilisateurs et les imprime:
AJOUTER PLUS D'INFO AUX UTILISATEURS SANS MODIFIER LE CODE EXISTANT
Supposons maintenant qu'une nouvelle fonctionnalité soit requise dans laquelle les liens de chaque utilisateur de la plateforme de médias sociaux (SMP) doivent être suivis avec les objets utilisateur.
La clé ici est également que cette fonctionnalité doit être implémentée avec une intervention minimale sur le code existant.
Ceci est possible avec WeakMaps de la manière suivante.
J'ajoute trois WeakMaps distincts pour 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();
Une fonction d'assistance getSMPWeakMap
est ajoutée simplement pour renvoyer le WeakMap associé au nom SMP donné.
/**
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;
}
Une fonction pour ajouter un lien SMP d'utilisateurs au SMP WeakMap donné.
/**
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);
}
}
Une fonction pour imprimer uniquement les utilisateurs présents sur le SMP donné.
/**
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)}`)
}
});
}
Vous pouvez maintenant ajouter des liens SMP pour les utilisateurs, également avec la possibilité pour chaque utilisateur d'avoir un lien sur plusieurs SMP.
... en continuant avec l'exemple précédent, j'ajoute des liens SMP aux utilisateurs, plusieurs liens pour les utilisateurs Bill et Sarah, puis j'imprime les liens pour chaque SMP séparément:
Supposons maintenant qu'un utilisateur soit supprimé de la users
carte en appelantdeleteUser
. Cela supprime la seule référence à l'objet utilisateur. À son tour, cela effacera également le lien SMP de tout ou partie des WeakMaps SMP (par Garbage Collection) car sans l'objet utilisateur, il n'y a aucun moyen d'accéder à l'un de ses liens SMP.
... en poursuivant l'exemple, je supprime l'utilisateur Bill , puis j'imprime les liens des SMP auxquels il était associé:
Aucun code supplémentaire n'est requis pour supprimer individuellement le lien SMP séparément et le code existant avant que cette fonctionnalité n'ait été modifiée de toute façon.
S'il existe un autre moyen d'ajouter cette fonctionnalité avec / sans WeakMaps, n'hésitez pas à commenter.