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();
또한 Collection을 추가하려면 사용자를 추가, 가져 오기, 삭제하기위한 도우미 기능과 완전성을 위해 모든 사용자를 인쇄하는 기능도 필요했습니다.
/**
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 3 개를 추가합니다.
/*
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);
}
}
지정된 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 링크를 지 웁니다.
... 예제를 계속 진행하면서 사용자 Bill을 삭제 하고 연관된 SMP 링크를 인쇄합니다.
SMP 링크를 개별적으로 삭제하기위한 추가 코드와이 기능이 수정되지 않은 기존 코드는 별도로 필요하지 않습니다.
WeakMaps를 사용하거나 사용하지 않고이 기능을 추가하는 다른 방법이 있으면 언제든지 의견을 말하십시오.