- Pure Functions
- Function Composition
- Shared State
- Race condition
- Immutability
- Side Effects
- Higher Order Functions
- Functors - Containers - Streams
- Declarative vs Imperative
Pure Functions
توابعی هستند که شرایط زیر را داشته باشند:- به ازای ورودی یکسان همیشه خروجی یکسان تولید کنند.
- اثرات جانبی یا Side effects نداشته باشند.
Function Composition
به فرایند ترکیب دو تابع برای تولید یک تابع جدید گفته میشود. f.g
(نقطه به معنای "ترکیب میشود با:") برابر با
در جاوا اسکریپت است. مثال:
Shared State
به هر متغیر، شیئ یا فضای حافظه که در یک محدودهای به اشتراک گذاشته شده ویا پراپرتی یک شیئای که بین محدودههای مختلف (scopes) ارسال میشود. یک محدودهی مشترک میتواند شامل global scope یا closure scopes باشد.Race condition
فرض کنید یک برنامه نوشتید که زمان تایپ در وردی نتایج جستوجو را با یک API call دریافت کرده نمایش میدهد حال فرض کنید جواب درخواستهایی که زمان تایپ یک کلمه ارسال شده است دیرتر از جواب درخواستی که پس از تکمیل نوشتن کلمه مورد نظر برسد، در این شرایط نتیجهای مورد نظر صحیح نمیباشد و کاملا وابسته به توالی و سرعت رسیدن جواب درخواستهای API هست، به این شرایطی که جواب قطعی وجود ندارد و نتیجه به سرعت پاسخگویی چند عامل مختلف وابسته است race condition میگویند.Immutability
یک شیئ immutable یا غیر قابل تغییری شیئای است که بعد از اینکه ساخته شد غیر قابل تغییر است. immutability یک مفهووم اصلی در برنامهنویسی فانکشنال است زیرا بدون آن جریان داده در برنامه از دست میرود و با تغییرات در state تاریخچهی آن از دست میرود. نکته: const در جاوااسکریپت نباید با immutability اشتباه گرفته شود. const شیئهای immutable تولید نمیکند بلکه صرفا بعد از مقدار دهی یک شیئ به یک متغیر دیگر نمیتوان مجددا شیئ جدیدی به آن متغیر متصل کرد ولی همچنان پراپرتیهای آن شیئ قابل تغییر میماند. شیئهای immutable بصورت کلی غیر قابل تغییر هستند. یک مقدار immutable زمانی ساخته میشود که یک شیئ بصورت عمیق freeze شدهاست (به عبارتی همهی پراپرتیهای یک آبجکت در هر سطحی که باشند غیر قابل تغییر باشند.). جاوااسکریپت یک متد وجود دارد که یک شیئ را در یک-سطح freeze میکند. این شیئ بصورت سطحی immutable است. به مثال زیر توجه کنید که این شیئ در واقع قابل تغییر یا mutable است. کتابخانههای جاوااسکریپتی مختلفی مثال Immutable.js و Mori وجود دارد که از مزیت درختها استفاده میکنند.Side Effects
به هرگونه تاثیر خارجی یک تابع بجز آن مقداری که به عنوان خروجی بر میگرداند میگویند، این تاثیر میتواند نوشتن یک لاگ در کنسول باشد یا یک درخواست API Get ساده. انواع Side Effects- ایجاد تغییر در هر متغیر یا object عمومی یا global
- لاگ کردن در کنسول با استفاده از console.log
- نوشتن یا نمایش چیزی در صفحهی نمایش
- نوشتن اطلاعات در یک فایل
- ارسال اطلاعات از طریق شبکه
- اجرا کردن هر فرایند خارجی یا عملیات I/O
- فراخوانی هر تابع خارجی دارای Side Effects
قابلیت استفادهی مجدد با Higher Order Functions
higher order functions توابعی هستند که عملیاتی را روی دیگر توابع انجام میدهند بصورتی که یا آنها را به عنوان ورودی میگیرند یا آن توابع را بر میگردانند و یا هر دو حالت. higher order functions اغلب برای موارد زیر استفاده میشوند:- برای انتزاع و مجزا کردن اکشنها، effects و کنترل جریانهای هم زمان با استفاده از callback functions، promises و monads و غیره
- ساخت ابزارهای کلی یا generic که روی انواع مختلفی از دادهها عملیاتی را انجام میدهند.
- برای اعمال کردن تابع روی بخشی از ورودیها یا تولید یک curried function برای استفادهی مجدد از آن ویا ترکیب دو تابع
- دریافت یک لیستی از توابع به عنوان ورودی و برگرداندن یک نوع ترکیب خاص از آنها
Functors - Containers - Streams
ساختار دادهای functor یک نوع ساختار دادهای میباشد که میتوان یک نوع نگاشت از روی آن تولید کرد. مانند:[1,2,3].map(x => x*2)) به عبارت دیگر یک container ای است که شامل interface میباشد که از آن طریق میتوان یک تابع را روی مقادیری که نگه میدارد اعمال کرد. بصورت کلی کلمه functor یادآور کلمهی mappable یا قابل نگاشت بودن است. برای مثال در مورد Array.prototype.map() ، Array یک container بحساب میآید و علاوه بر Array هر نوع دیگر از ساختار دادهها که API نگاشت کردن یا mapping را پیادهسازی کرده باشند یک functor به حساب میآیند. استفاده از انتزاعاتی مانند functors و higher order function به منظور ساخت توابع کمکی کلی یا generic که میتوانند تغییراتی در هر تعدادی از انواع مختلف دادهها ایجاد کنند، در برنامهنویسی فانکشنال مهم هستند. آرایهها و functors تنها مفاهیمی نیستند که شامل یک container و مقادیری که در آن نگه داشته میشود میباشد. برای مثال آرایه یک لیستی از آیتم هاست و stream یک لیستی است که در طول یک بازه زمانی شکل گرفتهاست. بنابراین میتوان از ابزارهای کمکی مشابهی که برای آرایهها و functors تولید کردیم برای پردازش stream های رسیده از رویدادها نیز استفاده نماییم.Declarative vs Imperative
برنامه نویسی فانکشنال یک پارادایم یا الگوی Declarative است ، به این معنی که منطق برنامه بدون توصیف صریح کنترل جریان بیان میشود.-
Imperative بیانگر How to do things یا چگونه انجام دادن.
برنامههایی که با استفاده از خطوط کد به شرح کنترل جریان یا همان مراحل خاصی که برای رسیدن به نتایج مطلوب مورد استفاده قرار میگیرد imperative هستند.
-
Declarative بیانگر What to do یا چه کاری انجام دادن.
برنامههایی که فرایند کنترل جریان را خلاصه میکند و در ازای آن با استفاده از خطوط کد به شرح جریان داده میپردازد.