Tôi có tính năng đơn giản dựa trên trường hợp sử dụng / Ví dụ cho WeakMaps.
QUẢN LÝ MỘT BỘ SƯU TẬP
Tôi bắt đầu với một User
đối tượng có tính chất bao gồm fullname
, username
, age
, gender
và một phương pháp gọi print
đó in một bản tóm tắt có thể đọc được con người của các tài sản khác.
/**
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}`);
}
Sau đó tôi đã thêm một Bản đồ được gọi users
để giữ một bộ sưu tập nhiều người dùng được khóa bởi username
.
/**
Collection of Users, keyed by username.
*/
var users = new Map();
Ngoài ra, Bộ sưu tập cũng yêu cầu các chức năng của trình trợ giúp để thêm, nhận, xóa Người dùng và thậm chí là một chức năng để in tất cả người dùng vì sự hoàn chỉnh.
/**
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();
});
}
Với tất cả các mã trên đang chạy, giả sử NodeJS , chỉ có users
Bản đồ có tham chiếu đến Đối tượng người dùng trong toàn bộ quá trình. Không có tài liệu tham khảo nào khác cho các Đối tượng Người dùng riêng lẻ.
Chạy mã này một trình bao NodeJS tương tác, giống như một ví dụ Tôi thêm bốn người dùng và in chúng:
THÊM THÊM THÔNG TIN CHO NGƯỜI SỬ DỤNG MÀ KHÔNG CẦN SỬA ĐỔI MÃ SỐ HIỆN TẠI
Bây giờ nói rằng một tính năng mới là bắt buộc trong đó mỗi liên kết Nền tảng truyền thông xã hội (SMP) của người dùng cần được theo dõi cùng với Đối tượng người dùng.
Chìa khóa ở đây cũng là tính năng này phải được thực hiện với sự can thiệp tối thiểu vào mã hiện có.
Điều này là có thể với WeakMaps theo cách sau.
Tôi thêm ba WeakMaps riêng cho 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();
Một hàm trợ giúp, getSMPWeakMap
được thêm vào đơn giản để trả về WeakMap được liên kết với tên SMP đã cho.
/**
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;
}
Một chức năng để thêm liên kết SMP của người dùng vào WeakMap SMP đã cho.
/**
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);
}
}
Một chức năng chỉ in những người dùng có mặt trên SMP đã cho.
/**
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)}`)
}
});
}
Bây giờ bạn có thể thêm các liên kết SMP cho người dùng, với khả năng mỗi người dùng có một liên kết trên nhiều SMP.
... Tiếp tục với ví dụ trước đó, tôi thêm các liên kết SMP cho người dùng, nhiều liên kết cho người dùng Bill và Sarah và sau đó in các liên kết cho từng SMP riêng biệt:
Bây giờ hãy nói một Người dùng bị xóa khỏi users
Bản đồ bằng cách gọi deleteUser
. Điều đó loại bỏ tham chiếu duy nhất đến Đối tượng người dùng. Đến lượt nó cũng sẽ xóa liên kết SMP khỏi bất kỳ / tất cả các WeakMaps SMP (của Bộ sưu tập rác) vì không có Đối tượng người dùng, không có cách nào để truy cập bất kỳ liên kết SMP nào của nó.
... Tiếp tục với Ví dụ, tôi xóa Bill người dùng và sau đó in ra các liên kết của SMP mà anh ta được liên kết với:
Không có yêu cầu về bất kỳ mã bổ sung nào để xóa riêng liên kết SMP và mã hiện có trước khi tính năng này không được sửa đổi.
Nếu có bất kỳ cách nào khác để thêm tính năng này có / không có WeakMaps, vui lòng bình luận.