Pure Function چیست

توسعه دهنده های جاوا اسکریپت از Functional Programming خیلی استفاده می کنند و به شدت ازش استقبال شده و طرفدارش هستند.اما Pure Function چیه؟
چند وقت پیش من مفهوم Pure Functions v رو یاد گرفتم و درکمال تعجب من قبلا خیلی از توابع رو به صورت Pure می نوشتم بدون اینکه بدونم براش اصطلاحی وجود داره.
چه توابعی را میتوان Pure گفت؟
یک function زمانی Pure است که از قوانین زیر پیروی کند:
1. تابع همیشه یک خروجی یکسان رو برگردونه اگر یک arguments یکسان بهش پاس داده بشه.
2.تابع هیچ side-effects رو ایجاد نکنه
همه ما آگاهانه یا غیرآگاهانه Pure Function نوشتیم.به Pure Function زیر یک نگاه بندازید که جمع دو عدد رو با توجه به دو عدد پاس داده شده به عنوان arguments برمیگردونه
1 2 3 |
function sumOfNumbers(a, b) { return a + b; } |
در صورتی که arguments های مشابه به این تابع پاس داده شود، یک خروجی یکسان رو برمیگردونه.Pure functions یک سری بلوک هستند که همیشه رفتار قابل پیش بینی دارند.به همین دلیل همیشه یک خروجی قابل پیش بینی بدون هیچگونه تاثیر خارجی رو برمیگردونند.
به مثال ساده زیر یک نگاه بندازید و ببینید که یک impure function چه شکلی است
1 2 3 4 |
var value = 5; function impure(arg) { return value + 2 + 3; } |
به این تابع impure function گفته می شود.زیرا از argument که بهش پاس داده شده استفاده نمی کند و به جای اون از یک external value استفاده می کند که هر لحظه در معرض تغییر است.بنابراین یک تابع impure ایجاد می شود به دلیل side-effects
خب حالا که بحث side-effects شده بهتره که در مورش صحبت کنیم
Side-Effects چیست؟
هر زمانی که تابع با دنیای بیرون تعامل کند Side effects اتفاق می افتد.
برخی از نمونه های side-effects رایج عبارت اند از:
- Making an API call
- Mutating data
- console logs to the screen
- Manipulating the DOM
- Date.now() to get current date/time
- async await calls/waiting for promises to resolve
- math.random() to generate random numbers
ممکن است الان این سوال در ذهنتون به وجود اومده باشه که چجوری یک تابع بنویسیم که همیشه بدون side-effects باشه.اجتناب از side-effects خیلی چالش برانگیز است.تمامی چیزی که من برای Pure Function میگم اینکه تابع نباید تحت تاثیر هیچ گونه عامل خارجی باشه و فقط باید بر اساس ورودی ها به شما خروجی بده.
نوشتن توابع به صورت Pure چه مزایایی داره؟
خب تا اینجا ما فقط یک سری تعریف رو انجام دادیم حالا میرسیم به این سوال که Pure Function چه مزایایی داره؟
1.تست نویسی آسونه
تصور کنید که شما یک دسته از pure function ها دارید که فقط یک کار انجام می دهند و تحت تاثیر هیچ عامل خارجی نیستند و همیشه خروجی قابل پیش بینی دارند.این توابع خیلی راحت تر تست می شوند زیرا داری وابستگی نیستند که یک رفتار غیرقابل پیش بینی داشته باشند.نوشتن کد clean و قابل تست به کیفیت کار شما کمک میکنه
2.Debugging سخت نیست
با Pure Function اشکال زدایی در مقایسه با impure function میتونه حتی لذت بخش باشه.چون زمانی که برنامه شما دارای مشکل هست و دارید دنبال اون مشکل میگردید به طور حتم برای توابع Pure فقط لازمه که شما وردودی ها رو چک کنید چون خروجی تحت تاثیر هیچ عامل خارجی نیست.بنابراین به طرز چشمگیری تجربه debugging شما رو به عنوان یک برنامه نویس بهبود میبخشه
3.بهبود عملکرد
با pure functions تضمین می شود که یک خروجی یکسان برای ورودی های یکسان بازگردانده می شود.در واقع این امکان به وجود میاد که زمانی که یک ورودی یکسان به تابع پاس داده میشه، نتیجه رو از cache خواند و این کار باعث افزایش سرعت میشه.Caching باعث صرفه جویی در استفاده از منابع و بهتر شدن عملکرد میشه. caching pure functions می تواند بدون هیچ گونه نگرانی انجام شود زیرا بدون هیچ side-effects خروجی قابل پیش بینی است.
4.خوانایی بالا کد و آسانی refactor
این یک امر بدیهی است.زمانی که کد شما clean، آسان برای تست و اشکال زدایی است،اگر برنامه ای که نوشتید نیاز به تغییرات و اضافه کردن ویژگی داشته باشه به راحتی این کار امکان پذیره چون کد قابلیت خوانایی بالایی داره و به راحتی میشه اون رو تغییر یا یک سری ویژگی بهش اضافه کرد.فرض کنید که بعد از چند ماه برای تغییرات مجبور شدید که کدهای خودتون رو مرور کنید و این کدها شامل Pure Function است.شما می تونید برای این موضوع جشن بگیرید چون هیچ گونه side-effects نداره که شما نگرانش باشید.حتی برای کسانی که تا حالا کد شما رو ندیدند re factor میتونه خیلی راحت باشه.
یک مثال از دنیای واقعی که از Pure Function استفاده می کند
Redux به عنوان یک state manager بسیار محبوب است و بیشتر ما در پروژه های خودمون ازش استفاده کردیم و با ازش شنیدیم.Reducers توابعی هستند که نقش اساسی در Redux ایفا می کنند و بخشی از الگوی اون هستند.مهم ترین ویژگی Reducers اینکه Pure Functions هستند.
Reducers در واقع pure functions هایی هستند که state و action رو می گیرند و یک state جدید بر میگردونند.
1 |
function(state, action) => newState |
Reducers بخش عمده ای از Redux integration هستند که business logic زیادی رو در خودش جا داده.از آنجایی که redux مجبور میکنه Reducers ها pure functions بدون هیچ تاثیری از خارج باشند، ما دیگه به functions های ساده ای که این کارها رو انجام می دادند نیاز نداریم.
Redux یک نمونه کلاسیک از نوشتن pure functions ها است.این state manager از functional programming الهام گرفته است و در سال های اخیر محبوبیت زیادی کسب کرده است.
نتیجه گیری
ما بررسی کردیم که نوشتن Pure Function می تونه چه سودی به شما برسونه و باعث بشه کدهاتون ساده و زیبا باشه.به خاطر داشته باشید که Pure Function به جاوا اسکریپت محدود نمی شوند و در هر زبان برنامه نویسی قابل پیاده سازی و استفاده است.این مفهوم با جاوا اسکریپت و هر زبان functional programming به خوبی کار میکند.
اگر از این مقاله لذت بردید و به دردتون خورد اون رو با بقیه به اشتراک بزارید.
مطالب زیر را حتما مطالعه کنید
چگونه از ماژول های نیتیو Android و IOS در React Native استفاده کنیم؟
آموزش کار با timing event ها
تفاوت توسعه برنامه های android و ios
معرفی DOM به زبان ساده
constructor function در جاوااسکریپت
factory function در جاوا اسکریپت
2 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
واقعا مطلب کامل و مفیدی بود و این مطلب به کسانی که قصد یادگیری جاوااسکریپت رو دارند خیلی کمک می کنه
خیلی خوبه که براتون مفید بوده.مقاله رو با بقیه دوستانتون و همکاراتون به اشتراک بزارید تا استفاده کنند