برنامه نویسی

بسته شدن در مقابل کلاس ها در 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 مدرن زمینه های خصوصی بومی را به ما می دهد (#) ؛

مهم نیست که شما چه الگویی را انتخاب کنید ، تعطیلی یا کلاس ها ، مهمترین درک معاملات و چه زمانی هر ابزار متناسب است.

حل این مشکل چشم انداز جدیدی در مورد چگونگی کلاس ها و تعطیلی ها اغلب می تواند یکسان را به روش های مختلف حل کند.

بعداً شما را تسلی دهید!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا