بسته شدن در مقابل کلاس ها در JavaScript: آنچه من یاد گرفتم حل LeetCode #2622

من در حال حل LEETCODE #2622 بودم-حافظه نهان با محدودیت زمانی و هدف ایجاد تابعی بود که یک سیستم ذخیره سازی را با TTL (زمان به زندگی) برگرداند.
اولین غریزه من؟ استفاده از a بسته شدنبشر این یک الگوی مشترک است – فقط یک متغیر را در خارج از عملکرد تعریف کنید و عملکرد داخلی می تواند آن را ارجاع دهد.
🔁 حافظه پنهان به سبک:
function createCache() {
const store = new Map();
return {
set(key, value, ttl) {
store.set(key, { value, expiry: Date.now() + ttl });
},
get(key) {
const cached = store.get(key);
if (!cached || cached.expiry < Date.now()) return -1;
return cached.value;
}
};
}
آسان این کار می کند ، آن را پیچیده است و هیچ کس نمی تواند آن را لمس کند store
از خارج – محاصره بسته شدن کلاسیک. اما مشکل LeetCode از ما انتظار داشت که عملکردی را از طریق نمونه اولیه آن گسترش دهیم – و این مرا از بین برد. من دوست داشتم: “چگونه هک می توانم متغیر خصوصی را در روش های نمونه اولیه ایجاد کنم؟”
این زمانی است که لامپ لامپ ادامه یافت.
با استفاده از this
+ کلاس = کپسوله سازی
فهمیدم که باید آن را مانند یک کلاس درمان کنم و این زمانی است که یادم می آید: هنگام استفاده از نمونه های اولیه (یا کلاس) ، می توانید داده های مشترک را در این زمینه ذخیره کنید.
بنابراین من این کار را کردم:
var TimeLimitedCache = function () {
this.cache = new Map();
};
TimeLimitedCache.prototype.set = function (key, value, duration) {
const expiredAt = Date.now() + duration;
const existed = this.cache.has(key);
this.cache.set(key, { value, expiredAt });
return existed;
};
TimeLimitedCache.prototype.get = function (key) {
const entry = this.cache.get(key);
if (!entry || entry.expiredAt < Date.now()) return -1;
return entry.value;
};
اکنون همه چیز در داخل زندگی می کند this.cache
بشر نیازی به بسته شدن خارجی نیست و در تمام روشها بسیار عالی است.
زمینه های خصوصی در کلاس ها
در آن مرحله فکر کردم: “صبر کنید ، بنابراین این همه چیز اساساً مانند یک کلاس رفتار می کند!”. و اگر این یک کلاس باشد ، آیا می توانیم یک قدم جلوتر برویم؟ در مورد زمینه های خصوصی چطور؟
در گذشته ، ما از یک کنوانسیون نامگذاری مانند استفاده می کردیم _cache
، اما این فقط یک سیگنال بود ، نه محافظت واقعی.
اما اکنون با جاوا اسکریپت مدرن (از ES2022) ، می توانیم از زمینه های خصوصی بومی استفاده کنیم #
نماد:
class TimeLimitedCache {
#cache = new Map();
set(key, value, duration) {
const expiredAt = Date.now() + duration;
const existed = this.#cache.has(key);
this.#cache.set(key, { value, expiredAt });
return existed;
}
get(key) {
const entry = this.#cache.get(key);
if (!entry || entry.expiredAt < Date.now()) return -1;
return entry.value;
}
}
این محاصره واقعی است!
آنچه یاد گرفتم
- بسته شدن یک روش عالی برای محاصره حالت ، به ویژه برای عملکردهای کارخانه است.
- کلاس با
this
هنگامی که می خواهید با نمونه های اولیه کار کنید یا چیزی را بسازید که بیشتر شبیه یک شی باشد ، یک جایگزین قدرتمند هستند. - JavaScript مدرن زمینه های خصوصی بومی را به ما می دهد (
#
) ؛
مهم نیست که شما چه الگویی را انتخاب کنید ، تعطیلی یا کلاس ها ، مهمترین درک معاملات و چه زمانی هر ابزار متناسب است.
حل این مشکل چشم انداز جدیدی در مورد چگونگی کلاس ها و تعطیلی ها اغلب می تواند یکسان را به روش های مختلف حل کند.
بعداً شما را تسلی دهید!