با اینکه سینتکس مدیریت و تفکیک منابع تضمینهای بسیار قوی و محکمی برای مدیریت خطا به ما میدهد تا مطمئن شویم منابع در هر شرایطی پاکسازی میشوند، اما هنوز هم تلههایی وجود دارند که ممکن است در مسیر برنامهنویسی با آنها برخورد کنید:
فراموش کردن استفاده از دستور using یا await using: سینتکس مدیریت منابع فقط زمانی به کمک شما میآید که خودتان آگاهانه از آن استفاده کنید؛ اما اگر استفاده از آن را فراموش کنید، هیچ ابزاری در محیط کدنویسی وجود ندارد که سر شما داد بزند و مِتُد تصفیه را یادآوری کند! متأسفانه راه خوبی برای جلوگیری از این اتفاق پیش از وقوع وجود ندارد؛ چون هیچ نشانه و علامت ظاهری در ساختار زبان وجود ندارد که نشان دهد یک شیء حتماً یک منبع Disposable است. حتی گاهی اوقات برای یک منبع Disposable، ممکن است عمداً بخواهید آن را بدون پاکسازی خودکار تعریف کنید. برای مچگیری این خطاهای فراموشی، احتمالاً به یک ابزار بررسی نوع (Type Checker) به همراه یک لینتر (Linter) مثل typescript-eslint نیاز خواهید داشت.
استفاده از منبعِ آزادشده (Use-after-free): به طور کلی، سینتکس using تضمین میکند که یک منبع به محض خروج از اسکوپ آزاد شود، اما راههای زیادی وجود دارد که باعث میشود یک مقدار، فراتر از طول عمرِ متغیرِ اصلیاش در حافظه زنده بماند! جاوااسکریپت بر خلاف زبانی مثل Rust، مکانیزم «مالکیت سختگیرانه حافظه» (Ownership Mechanism) ندارد؛ بنابراین شما میتوانید یک نام مستعار (Alias) برای آن متغیر بسازید که از using استفاده نمیکند، یا اینکه آن منبع را درون یک کلوژر (Closure) حفظ کنید و بعداً صدا بزنید. مستندات مرجع using حاوی مثالهای زیادی از این نوع تلههاست. در این مورد هم در جریانهای پیچیده کد، راه خوبی برای تشخیص خودکار این خطا وجود ندارد و خودتان باید به شدت مراقب باشید.
💡 خلاصه کلام: قابلیت مدیریت منابع یک «معجزه تام یا گلوله نقرهای» نیست. این قابلیت قطعاً یک پیشرفت و بهبود چشمگیر نسبت به صدا زدن دستیِ متدهای تصفیه محسوب میشود، اما آنقدر هوشمند نیست که جلوی تمام باگهای مدیریت منابع را بگیرد. شما کماکان باید مراقب باشید و رفتار و منطق منابعی را که از آنها استفاده میکنید، به خوبی درک کنید.
در یک نگاه کلی، ارکان و اجزای کلیدی سیستم مدیریت منابع در جاوااسکریپت مدرن شامل موارد زیر هستند:
دستورات اعلامی using و await using: برای پاکسازی و تصفیه خودکار منابع در پایان اسکوپ.
پروتکلهای Disposable و Async Disposable: که به ترتیب از سمبلهای Symbol.dispose و Symbol.asyncDispose استفاده میکنند تا منابع بتوانند متدهای پاکسازی خود را در آنها پیادهسازی کنند.
اشیای DisposableStack و AsyncDisposableStack: برای زمانهایی که مدیریت خودکار با using و await using به خاطر محدودیتهای اسکوپ یا شرایط شرطی مناسب نیست و نیاز به پشته مدیریت دستی داریم.
شما با استفاده درست و اصولی از این ابزارها و APIها، میتوانید سیستمهایی بسازید که با منابع خارجی (مثل فایلها، استریمها و اتصالات شبکه) تعامل دارند و در برابر تمام شرایط خطا و کرشهای برنامه، کاملاً مقاوم، پایدار و مستحکم باقی میمانند؛ آن هم بدون اینکه نیاز باشد حجم عظیمی از کدهای تکراری و تودرتو (Boilerplate code) بنویسید!
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://developer.mozilla.org/en-US/docs/Web/JavaScript