خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

توابع خالص در جاوا اسکریپت و نحوه ایجاد آنها

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

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

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

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

ویژگی های یک تابع خالص

برای اینکه یک تابع “خالص” باشد، باید چند الزام را برآورده کند.

ارزش بازده ثابت

یک تابع خالص، صرف نظر از تعداد دفعاتی که فراخوانی شده است، همیشه باید همان مقدار را با توجه به ورودی یکسان برگرداند.

برای مثال تابع زیر را در نظر بگیرید:

function multiply(a, b) {
  return a * b;
}

تابع ضرب در مثال بالا همیشه حاصل ضرب دو آرگومان خود را برمی گرداند. با توجه به همان مجموعه آرگومان ها، مقدار بازگشتی ثابتی دارد.

با چندین بار فراخوانی این تابع با آرگومان های یکسان، هر بار خروجی یکسانی به دست می آید. مثلا:

multiply(2, 3); // returns 6
multiply(2, 3); // returns 6
multiply(2, 3); // returns 6

از طرف دیگر، مثال زیر را در نظر بگیرید:

function multiplyRandomNumber(num) {
  return num * Math.floor(Math.random() * 10);
}

multiplyRandomNumber(5); // Unpredictable results
multiplyRandomNumber(5); // Unpredictable results
multiplyRandomNumber(5); // Unpredictable results

تابع multiplyRandomNumber در بالا هر بار که آن را فراخوانی می کنید نتایج متفاوتی را نشان می دهد و باعث ناخالصی آن می شود. نتایج این تابع غیرقابل پیش بینی است، بنابراین آزمایش اجزای متکی بر آن دشوار است.

مطلب مرتبط:   نحوه راه اندازی کلاستر MongoDB در فضای ابری به صورت رایگان

بدون عوارض جانبی

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

وقتی یک تابع خالص دارای یک عارضه جانبی است، دیگر خالص نیست زیرا بر حالت خارجی تأثیر می گذارد و اصل عدم وجود عوارض جانبی قابل مشاهده را نقض می کند. بنابراین، توابع خالص از عوارض جانبی جلوگیری می کنند تا اطمینان حاصل شود که وضعیت برنامه را تغییر نمی دهند.

برای مثال به مثال زیر توجه کنید:

let count = 0;

function increment() {
  count++;
  console.log(count);
}

increment(); // Logs 1
increment(); // Logs 2
increment(); // Logs 3

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

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

اینطوری:

function increment(count) {
  return count + 1;
}

increment(1); // returns 2
increment(1); // returns 2
increment(1); // returns 2

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

سایر خصوصیات

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

  • تابع شما نباید هیچ یک از آرگومان های خود را تغییر دهد. در عوض، اگر هر عملیاتی نیاز به جهش دارد، یک کپی از آرگومان ایجاد کنید و کپی را تغییر دهید.
  • تابع شما باید همیشه یک مقدار بازگشتی داشته باشد. اگر تابع شما مقدار بازگشتی یا عوارض جانبی نداشته باشد، نمی تواند کاری انجام دهد!
  • عملکرد شما نباید به هیچ حالت خارجی بستگی داشته باشد.
مطلب مرتبط:   نحوه استفاده از فضاهای نام در TypeScript

مزایای توابع خالص

توابع خالص مزایای خاصی نسبت به توابع ناخالص دارند که برخی از آنها شامل موارد زیر است.

آزمایش پذیری

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

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

حفظ کردن

از آنجایی که توابع خالص همیشه خروجی یکسانی را برای ورودی یکسان تولید می کنند و هیچ عارضه جانبی ایجاد نمی کنند، می توانید به راحتی آنها را به خاطر بسپارید.

با تکیه بر این ویژگی‌ها و استفاده از حافظه‌گذاری، می‌توانید نتیجه فراخوانی تابع خالص برای یک ورودی خاص را کش کنید. سپس تابع شما می تواند نتیجه کش شده را دفعه بعد که با همان ورودی فراخوانی می شود، برگرداند.

به خاطر سپردن توابع خالص می تواند عملکرد یک برنامه را بهبود بخشد، به خصوص برای محاسبات گران قیمت که به طور مکرر با ورودی یکسان سروکار دارند، بدون نگرانی در مورد تداخل با وضعیت برنامه.

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

مطلب مرتبط:   چگونه یک گالری عکس ساده با استفاده از HTML، CSS و جاوا اسکریپت ایجاد کنیم

همزمانی

از آنجایی که توابع خالص هیچ حالت خارجی را تغییر نمی دهند یا هیچ گونه عارضه جانبی ایجاد نمی کنند، از نظر نخ ایمن هستند. شما می توانید آنها را به طور همزمان اجرا کنید بدون اینکه نگران شرایط مسابقه یا مشکلات همگام سازی باشید.

در مقابل، اجرای همزمان توابع ناخالص می تواند چالش برانگیز باشد زیرا ممکن است با یکدیگر تداخل داشته باشند یا هنگام اجرای موازی رفتار غیرمنتظره ای ایجاد کنند. برای مثال، اگر دو رشته به یک متغیر سراسری دسترسی داشته باشند و آن را تغییر دهند، ممکن است تغییرات یکدیگر را بازنویسی کنند یا نتایج متناقضی ایجاد کنند.

توابع خالص در مقابل توابع ناخالص

شما می توانید برنامه ها را با استفاده از ترکیبی از توابع خالص و ناخالص بنویسید، زیرا هر نوع کاربرد خود را دارد.

توابع خالص به راحتی قابل بهینه سازی، آزمایش و موازی سازی هستند، و آنها را برای موارد استفاده مانند برنامه نویسی عملکردی، حافظه پنهان، آزمایش، برنامه نویسی موازی و وظایف پردازش داده مناسب می کند.

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