Saya memiliki case use berdasarkan fitur sederhana ini / Contoh untuk WeakMaps.
MENGELOLA KOLEKSI PENGGUNA
Aku mulai dengan User
Obyek yang sifat termasuk fullname
, username
, age
, gender
dan metode yang disebut print
yang mencetak ringkasan dibaca manusia dari sifat-sifat lainnya.
/**
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}`);
}
Saya kemudian menambahkan Peta yang dipanggil users
untuk menyimpan koleksi beberapa pengguna yang dikunci oleh username
.
/**
Collection of Users, keyed by username.
*/
var users = new Map();
Penambahan Koleksi juga membutuhkan fungsi pembantu untuk menambah, mendapatkan, menghapus Pengguna dan bahkan fungsi untuk mencetak semua pengguna demi kelengkapan.
/**
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();
});
}
Dengan semua kode di atas berjalan, katakanlah NodeJS , hanya users
Peta yang memiliki referensi ke Objek Pengguna dalam seluruh proses. Tidak ada referensi lain untuk masing-masing Objek Pengguna.
Menjalankan kode ini sebagai shell NodeJS interaktif, seperti Contoh saya menambahkan empat pengguna dan mencetaknya:
TAMBAHKAN INFO LEBIH LANJUT UNTUK PENGGUNA TANPA MEMODIFIKASI KODE YANG ADA
Sekarang katakanlah fitur baru diperlukan di mana setiap pengguna tautan Platform Media Sosial (SMP) perlu dilacak bersama dengan Objek Pengguna.
Kuncinya di sini adalah juga bahwa fitur ini harus diimplementasikan dengan intervensi minimal terhadap kode yang ada.
Ini dimungkinkan dengan WeakMaps dengan cara berikut.
Saya menambahkan tiga WeakMaps terpisah untuk 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();
Fungsi pembantu, getSMPWeakMap
ditambahkan hanya untuk mengembalikan WeakMap yang terkait dengan nama SMP yang diberikan.
/**
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;
}
Fungsi untuk menambahkan tautan SMP pengguna ke SMP WeakMap yang diberikan.
/**
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);
}
}
Fungsi untuk mencetak hanya pengguna yang hadir di SMP yang diberikan.
/**
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)}`)
}
});
}
Anda sekarang dapat menambahkan tautan SMP untuk para pengguna, juga dengan kemungkinan setiap pengguna memiliki tautan pada beberapa SMP.
... melanjutkan dengan Contoh sebelumnya, saya menambahkan tautan SMP ke pengguna, banyak tautan untuk pengguna, Bill dan Sarah, lalu mencetak tautan untuk setiap SMP secara terpisah:
Sekarang katakanlah seorang Pengguna dihapus dari users
Peta dengan menelepon deleteUser
. Itu menghapus satu-satunya referensi ke Objek Pengguna. Ini pada gilirannya juga akan menghapus tautan SMP dari semua / semua SMP WeakMaps (oleh Garbage Collection) karena tanpa Objek Pengguna tidak ada cara untuk mengakses tautan SMP mana pun.
... melanjutkan dengan Contoh, saya menghapus Bill pengguna dan kemudian mencetak tautan SMP yang dikaitkan dengannya:
Tidak ada persyaratan kode tambahan untuk menghapus tautan SMP secara terpisah dan kode yang ada sebelum fitur ini tidak dimodifikasi.
Jika ada cara lain untuk menambahkan fitur ini dengan / tanpa WeakMaps, jangan ragu untuk berkomentar.