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