مرا اسکن کن!

برنامه‌نویسی تابعی functional programming چیست

برنامه‌نویسی تابعی functional programming چیست



برنامه‌نویسی تابعی (به انگلیسی: Functional programming) نوعی پارادایم برنامه‌نویسی است که در آن «محاسبات» به صورت ارزش‌یابی توابع ریاضی در نظر گرفته می‌شوند.

functional programming در سطح آکادمیک و دانشگاهی بیشترین تاکید رو داره و در نرم افزار های اقتصادی و در سطح صنعت به اون شکل مطرح نیست.

functional programming درباره پاس دادن دیتا از یک تابع به نابع دیگه و به تابع دیگه و... تا به نتیجه برسیم.در functional programming خود توابع به عنوان دیتا عمل می کنند .معنی این جمله اینه که میشه از تابع به عنوان پارامتر..و یا مقدار بازگشتی استفاده کرد ویا توابعی با توابع دیگه ساخت.تابع در functional programming نباید از اشتراک وضعیت استفاده کنه و نباید تاثیر جانبی داشته باشه(یعنی چیزی رو توی بیرون از تابع ننویسه و چیزی رو از بیرون تابع نخونه) و دیتا باید تغییر ناپذیر باشه 

در این شیوه محاسبات و تحلیلات به مانند ارزیابی توابع ریاضیاتی رفتار می‌کنند و از داده‌های توضیحی (state) و بی‌ثبات (mutable) دوری می‌کنند؛ و بر خلاف برنامه‌نویسی دستوری که به تغییرات وضعیت درون برنامه‌ها تأکید دارد به کاربرد توابع تآکید می‌کند.یعنی به جای شرط در function با عملگر در function سر کار دارد و عملکرد فانکشن شبیه به تعریف ریاضی آن است.

 در این زبانها function دارای side effect نیست بلکه فقط و فقط دارای ورودی و خروجی است و در بدنه آن فقط محاسبات صورت میگیرد و نه عملیات. محاسبات هم به صورت اجرای توابع و عملگرهای مختلف بر روی ورودی و تولید مقادیر موقت داخلی و انجام مکرر توابع عملگرها و توابع بر روی مقادیر موقت داخلی و در نهایت تولید مقدار خروجی پیش میرود.

 

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

برنامه نویسی کاربردی یک سبک برنامه نویسی است که بر ارزیابی عبارات و نه اجرای فرمان ها تأکید دارد. زبان برنامه نویسی Erlang به عنوان یک زبان برنامه نویسی تابعی توصیف شده است. Erlang از استفاده از متغیرهای جهانی است که می تواند توسط توابع چندگانه مورد استفاده مشترک باشد اجتناب کند چرا که تغییر چنین متغیری در بخشی از یک برنامه ممکن است اثرات غیر منتظره ای را در بخش دیگری داشته باشد.

 

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

برنامه ریزی تابعی مستلزم آن است که توابع first-class باشند، به این معنی که آنها مانند هر مقدار دیگری رفتار می شوند و می توانند به عنوان argument به توابع دیگر منتقل شوند یا به عنوان یک نتیجه از یک تابع بازگردانده شوند. first-class نیز بدین معنی است که امکان تعریف و دستکاری توابع از داخل توابع دیگر وجود دارد. توجه ویژه باید به توابع که متغیرهای محلی را از محدوده خود ارجاع می دهند، داده شود.

ویژگی های برنامه نویسی تابعی

  • دارای توابع Higher-order
  • دارای قابلیت Purity
  • داده های غیر قابل تغییر
  • ارزیابی lazy و اجتناب از محاسبات غیر ضروری
  • Recursion یا بازگشت
  • دارای توابع first-class

ویژگی های توابع بی نام Anonymous function و closure  و

(ورود خود تابع به عنوان متغیر در خودش) recursion  در زبان های برنامه نویسی در مدل  برنامه نویسی تابعی بیشتر مورد استفاده قرار می گیرد.

مانند Object Oriented Programming که به اختصار OOP خوانده می شود.  Functional Programming به اختصار FP نامیده می شود

 

برنامه نویسی OOP در مقابل FP

برای نشان دادن چگونگی تفاوت عملکرد در OOP و FP از مثال زیر استفاده میکنم:

شما یک شرکت را اداره میکنید و قصد دارید حقوق هر کارمند را ۱ میلیون تومان افزایش دهید. از دیدگاه برنامه نویسی، چطور با این مسئله برخورد میکنید؟

در OOP

  1. یک کلاس برای کارمند ایجاد میکنیم که شامل نام و حقوق میشود. و همچنین تابعی برای اصلاح حقوق دارد.
  2. نمونه های کارمندان را از کلاس ایجاد میکنیم.
  3. به وسیله تابع each یکی یکی حقوق هر کارمند را افزایش میدهیم.

در FP

  1. آرایه کارمندان را ایجاد میکنیم که از آرایه هایی با نام و حقوق هر کارمند تشکیل شده است.
  2. یک تابع با نام change_salary ایجاد میکنیم که کپی شده یک کارمند را با تغییر دادن حقوق باز میگرداند.
  3. تابع change_salaries را ایجاد میکنیم که با پیمایش آرایه کارمندان، هر کارمند را به change_salary ارسال میکند.
  4. از این دو تابع برای ایجاد یک مجموعه داده جدید استفاده میکنیم و نام آن را “کارمندان خوشحالتر” میگذاریم.

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

بنابرین بحث در مورد چیست؟

به طور واضح، آنهایی که در تیم های OOP فعالیت دارند، میگویند که رویکرد بهتری برای ایجاد برنامه هاست، در حالی که افراد در تیم های FP میگویند که FP بهتر است. خب؟  تیم OOP بحث میکند که مفاهیم وراثت و کپسوله کردن مدیریت و دستکاری داده ها را راحت تر میکند. و تیم FP میگوید که جداسازی داده ها از method ها، سبب میشود که بالا بودن سطح انتزاعات، خطاهای کمتری ایجاد کند.

به نظر میرسد توافق عمومی اینست که بهتر بودن OOP و FP بستگی به شرایط دارد، بنابرین ما قرار نیست مطلبی راجع به پایان این بحث بشنویم.


نوشته شده توسط :

وحید صمدیان وحید صمدیان



شنبه, 30 تیر 1397

تعداد بازديد : 2105

برچسب ها : PHP

3.0 ستاره