کدنویسی هوشمندانه با توابع Pure در جاوااسکریپت
توابع Pure به ما کمک میکنن کدهای تمیزتر، قابل پیشبینیتر و قابل تستتری بنویسیم. توی این مقاله، به تعریف توابع pure، کاربردهاشون و نحوهی تعریف و استفاده از اونها در جاوااسکریپت میپردازیم. همچنین فلسفهی پشت این رویکرد رو هم بررسی میکنیم.
توابع pure چی هستن؟
توابع pure (خالص) توابعی هستن که دو ویژگی اصلی دارن:
عدم تأثیر جانبی (Side Effects) : این توابع هیچ تغییری در حالت (state) خارجی ایجاد نمیکنن. به عبارتی، هیچ تغییری در متغیرهای خارج از تابع ایجاد نمیکنن و هیچ تعامل مستقیمی با دنیای خارج از تابع (مثل ورودی/خروجی فایل، تغییر در DOM، یا درخواستهای شبکه) ندارن.
خروجی قابل پیشبینی: خروجی این توابع تنها به ورودیهاشون بستگی داره. هر بار که تابع رو با همون ورودیها فراخوانی کنیم، همون خروجی رو دریافت میکنیم.
چرا از توابع pure استفاده کنیم؟
استفاده از توابع pure مزایای زیادی داره:
- قابلیت تست راحتتر: چون این توابع وابسته به ورودیهاشون هستن و خروجی قابل پیشبینی دارن، تست کردنشون سادهتره.
- اشکالزدایی آسانتر: به دلیل عدم وجود تأثیرات جانبی، ردیابی مشکلات و باگها راحتتره.
- کد قابل خواندنتر و تمیزتر: توابع pure باعث میشن کدها قابل فهمتر و نگهداریشون راحتتر بشه.
- افزایش قابلیت اطمینان: چون توابع pure تغییرات پیشبینیناپذیری در حالت برنامه ایجاد نمیکنن، میتونیم به عملکردشون بیشتر اعتماد کنیم.
تعریف توابع pure در جاوااسکریپت
تعریف توابع pure در جاوااسکریپت کار سادهایه. بیایید چند مثال از توابع pure و impure رو بررسی کنیم تا تفاوتهاشون رو بهتر درک کنیم.
مثال ۱: تابع pure
function add(a, b) {
return a + b;
}
console.log(add(2, 3)); // 5
console.log(add(2, 3)); // 5 (همیشه خروجی یکسان برای ورودیهای یکسان)
مثال ۲: تابع impure
let counter = 0;
function increment() {
counter += 1;
return counter;
}
console.log(increment()); // 1
console.log(increment()); // 2 (خروجی وابسته به حالت خارجی)
در مثال اول، تابع add
یک تابع pure است، چون خروجی تابع تنها به ورودیهاش بستگی داره و هیچ تأثیر جانبی نداره. در مثال دوم، تابع increment
یک تابع impure است، چون خروجی تابع به متغیر خارجی counter
بستگی داره و تابع باعث تغییر در این متغیر میشه.
کاربردهای توابع pure
توابع pure در برنامهنویسی کاربردهای زیادی دارن:
برنامهنویسی تابعی (Functional Programming): توابع pure اساس برنامهنویسی تابعی رو تشکیل میدن. این سبک برنامهنویسی به ما کمک میکنه کدهای قابل پیشبینیتر و قابل تستتری بنویسیم.
تستنویسی واحد (Unit Testing): تست کردن توابع pure سادهتره چون خروجیهاشون قابل پیشبینیه و نیازی به تنظیم محیط تست نداریم.
ایجاد توابع کمکی (Helper Functions): توابعی که محاسبات خاصی انجام میدن و نیازی به تغییر حالت برنامه ندارن، میتونن به عنوان توابع pure نوشته بشن.
فلسفهی نوشتن توابع pure
فلسفهی پشت نوشتن توابع pure از برنامهنویسی تابعی نشأت میگیره. برنامهنویسی تابعی یکی از پارادایمهای برنامهنویسیه که بر استفاده از توابع خالص و بدون تأثیرات جانبی تأکید داره. این رویکرد باعث میشه کدها قابل پیشبینیتر، قابل تستتر و کمتر مس تعد خطا باشن. همچنین، برنامهنویسی تابعی به ما کمک میکنه تا از بازنویسی کدها و ایجاد تغییرات غیرضروری در حالت برنامه جلوگیری کنیم.
متدهایی که pure نیستند
در جاوااسکریپت، بسیاری از متدها و توابع به دلیل اثرات جانبیای که دارند، pure محسوب نمیشوند. این اثرات جانبی میتوانند تغییر در متغیرهای خارجی، تغییر در وضعیت (state) و تعامل با دنیای خارج از تابع باشند. در ادامه به چند مثال از متدهای impure در جاوااسکریپت میپردازیم:
-
Array.prototype.push
: این متد عنصری را به انتهای یک آرایه اضافه میکند و طول جدید آرایه را برمیگرداند. این متد pure نیست زیرا آرایه اصلی را تغییر میدهد.let arr = [1, 2, 3]; arr.push(4); console.log(arr); // [1, 2, 3, 4]
-
Math.random
: این متد عددی تصادفی بین ۰ و ۱ برمیگرداند. خروجی این متد به دلیل تصادفی بودن، هر بار متفاوت است و به ورودیهای تابع وابسته نیست.console.log(Math.random()); // ممکن است هر بار یک عدد متفاوت باشد
-
Date.now
: این متد زمان فعلی را به صورت میلیثانیه از تاریخ ۱ ژانویه ۱۹۷۰ برمیگرداند. این متد نیز pure نیست زیرا خروجی آن به زمان فعلی وابسته است.console.log(Date.now()); // زمان فعلی به میلیثانیه
این مثالها نشان میدهند که چگونه متدهای impure میتوانند بر وضعیت و رفتار برنامه تأثیر بگذارند. با توجه به این نکات، استفاده از توابع pure میتواند به بهبود کیفیت کدها و کاهش پیچیدگی آنها کمک کند.
نتیجهگیری
یه تابع، وقتی pure (خالص) حساب میشه که با ورودیهای یکسان، همیشه همون خروجی رو بده و هیچ اثر جانبیای نداشته باشه. توابع pure فهمیدن و تست کردنشون آسونه، و میتونیم اونا باهم رو ترکیب کنیم. هر وقت شرایط برقرار بود تا حد امکان، سعی کنید توابع pure بنویسید. توابع impure (ناخالص)، برعکس، اونایی هستن که به وضعیت خارجی دسترسی دارن یا اثرات جانبی دارن. توابع impure به برنامه شما امکان میدن با دنیای بیرون از خود تابع ارتباط برقرار کنه. شما چه مزایای دیگهای برای توابع pure میشناسید؟