برنامه نویسی 157 بازدید

یکی از قابلیت‌های کلیدی که جاوا اسکریپت فاقد آن است، توانایی حفاظت آسان از داده‌های مربوط به یک شیء است. به این منظور چند تکنیک در طول عمر این زبان برنامه‌نویسی ظهور یافته‌اند، اما یا عملاً حفاظتی از داده‌های شیء انجام نداده‌اند و یا نیازمند دانش پیشرفته‌ای مانند دانستن طرز کار کلوژرها (+) بوده‌اند. در این مطلب و در ادامه قصد داریم به همین موضوع بپردازیم و نحوه حفاظت از اشیا با تایپ اسکریپت را مورد بررسی قرار دهیم.

راه‌اندازی

در این بخش می‌بینیم که حفاظت از داده‌های اشیا تا چه حد می‌تواند آسان باشد. ابتدا یک پروژه npm کوچک به نام ts-protected راه‌اندازی می‌کنیم. به این منظور یک پنجره ترمینال جدید باز کنید تا دستورهای زیر را اجرا نمایید:

mkdir ts-protected
cd ts-protected
npm init -y
npm i -D typescript ts-node-dev
touch protected.ts

این دستورها یک دایرکتوری جدید ایجاد می‌کنند، یک پروژه npm درون آن راه‌اندازی می‌شود و چند پکیج که مورد نیاز خواهند بود نیز نصب می‌شوند. در ادامه فایلی ایجاد می‌شود که کد خود را درون آن خواهیم نوشت. پروژه را در ویژوال استودیو کد باز کنید:

code .

فایل package.json را باز کرده و بخش اسکریپت‌ها را ویرایش کنید:

ما همه کدها را در فایل protected.ts قرار می‌دهیم که لحظاتی پیش‌ساخته شده است. در ویژوال استودیو کد به نوار منو رفته و در منوی Terminal گزینه New Terminal را انتخاب کنید. کد را با دستور زیر اجرا کنید:

npm start

کلاس BankAccount

یک کلاس جدید به نام BankAccount با دو مشخصه داده به نام‌های checking و savings تعریف می‌کنیم. همچنین یک متد سازنده برای مقداردهی این مشخصه‌ها اضافه می‌کنیم. به این منظور فایل protected.ts را باز کرده و کد زیر را در آن قرار دهید:

یک متد برای پرینت کردن جزییات حساب در ترمینال اضافه می‌کنیم و سپس یک وهله از یک BankAccount می‌سازیم:

در ادامه اتفاقاتی که رخ می‌دهد را بررسی می‌کنیم.

حفاظت از اشیا با تایپ اسکریپت

این آن نوع از رفتار است که دوست نداریم رخ بدهد. در یک اپلیکیشن بزرگ که از کتابخانه‌های شخص ثالث زیادی استفاده می‌کند، قرار دادن یک شیء در حالت غیرمجاز به سهولت رخ می‌دهد و این مسئله به طور بالقوه موجب بروز اشکالی در داده‌ها یا از کار افتادن اپلیکیشن می‌شود.

دو مشکل عمده در اینجا وجود دارند:

  1. انواع داده‌ها برای checking و savings را می‌توان به هر چیزی عوض کرد. در این کد ما نوع savings را از عدد به رشته تغییر داده‌ایم.
  2. ما به داده‌های خود اجازه می‌دهیم که به روشی کنترل نشده تغییر یابند.

تایپ اسکریپت می‌تواند هر دو این مشکلات را به سهولت حل کند. در بخش بعدی طرز حل این مشکلات را می‌بینیم.

محدودسازی نوع داده‌های یک مشخصه

تنها کاری که باید انجام دهیم این است که انواع مجاز برای مشخصه‌ها را به تایپ اسکریپت اعلام کنیم. هر دو مشخصه ما تنها باید به صورت عددی باشند. در ادامه با افزودن نوع هر مشخصه این موضوع را به تایپ اسکریپت اعلام می‌کنیم. این کار را برای آرگومان‌های سازنده نیز انجام می‌دهیم:

در تصویر زیر به بروز خطا توجه کنید. به این ترتیب کد در ترمینال از کار می‌افتد:

حفاظت از اشیا با تایپ اسکریپت

محدودسازی دسترسی خارجی به یک مشخصه

می‌توان از دسترسی خارجی به یک مشخصه شیء و تغییر نادرست آن جلوگیری کرد. ابتدا باید مشخصه‌های خود را به صورت private اعلان کنیم، یعنی دیگر قابل دسترسی از خارج از کلاس نخواهند بود:

بدین ترتیب دو خط کد زیر دیگر کار نمی‌کنند. آن‌ها را به همراه گزاره ()myAccount.accountDetails که پس از آن‌ها آمده است، حذف کنید:

اینک سؤال این است که چگونه می‌توانیم داده‌های شیء را تغییر دهیم؟ این کار از طریق یک Setter میسر می‌شود. Setter-ها متدهای خاصی هستند که درون یک کلاس تعریف نمی‌کنیم و می‌توانند مشخصه‌های شیء را به روشی کنترل‌شده تغییر دهند.

محدودیت‌ها

در این بخش محدودیت‌هایی برای داده‌های شیء به صورت زیر تعریف می‌کنیم:

  1. Checking می‌تواند در بازه‌ای بین 10000- تا 10000 قرار گیرد.
  2. Savings می‌تواند در بازه‌ای بین 0 تا 1000000 قرار گیرد.

اکنون متدهای setter خود را نوشته و برخی تست‌ها را اجرا می‌کنیم:

توجه کنید که اگر checking یا savings را روی مقدار نامجازی تنظیم کنیم، کد یک استثنا تولید می‌کند که در صورتی که آن را catch نکنیم، منجر به از کار افتادن برنامه خواهد شد. به همین دلیل است که دو تست درون یک بلوک try-catch قرار گرفته‌اند. خروجی کدهای فوق در ترمینال به صورت زیر است:

حفاظت از اشیا با تایپ اسکریپت

این دقیقاً همان چیزی است که ما می‌خواهیم. نه تنها دیگر نمی‌توانیم انواع داده‌های خود را به چیز غیرمجازی تغییر دهیم، بلکه کد یک استثنا صادر می‌کند که می‌توان آن را به سهولت ردگیری کرد تا به منبع خطا پی برد و مقادیر غیرمجاز را شناسایی کرد.

متدهای Getter و منافذ فرار

پیش از آن که این راهنما را جمع‌بندی کنیم، بهتر است کمی در مورد یک دام که ممکن است به آن بیافتید صحبت کنیم تا هنگام کار با داده‌های private به خاطر داشته باشید. ابتدا یک متد getter برای savings اضافه می‌کنیم. سپس یک ارجاع به آن خارج از کلاس به دست می‌آوریم و تلاش می‌کنیم آن را تغییر دهیم:

حفاظت از اشیا با تایپ اسکریپت

چنان که می‌بینید هیچ چیزی تغییر نیافته است و این دقیقاً همان چیزی که ما می‌خواهیم. دلیل آن این است که savings مانند checking یک نوع «داده مقدماتی» (Primitive Type) است. انواع داده مقدماتی، زمانی که به صورت آرگومان ارسال می‌شوند در واقع درون تابع‌ها کپی می‌شوند و زمانی که از سوی تابع بازگشت می‌یابند، کپی‌هایی از مقادیر آن‌ها گرفته می‌شود. با این حال انواع غیر مقدماتی مانند شیءها طرز کار متفاوتی دارند. استفاده از یک متد gettre برای بازیابی یک مشخصه که یک شیء است موجب بازگشت یک ارجاع به آن شیء و نه یک کپی از آن می‌شود.

این بدان معنی است که اگر مراقب نباشیم و یک ارجاع به یک شیء بازگشت دهیم، امکان تغییر دادن شیء در خارج از کد نیز پدید می‌آید. یک روش برای حل این مشکل این است که یک کپی از شیء تهیه کرده و ارجاع به آن کپی را به جای شیء اصلی بازگشت دهیم. بدین ترتیب به پایان این راهنما می‌رسیم.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

میثم لطفی (+)

«میثم لطفی» دانش‌آموخته ریاضیات و شیفته فناوری به خصوص در حوزه رایانه است. وی در حال حاضر علاوه بر پیگیری علاقه‌مندی‌هایش در رشته‌های برنامه‌نویسی، کپی‌رایتینگ و محتوای چندرسانه‌ای، در زمینه نگارش مقالاتی با محوریت نرم‌افزار نیز با مجله فرادرس همکاری دارد.

آیا این مطلب برای شما مفید بود؟

نظر شما چیست؟

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