سلام به همه.
بی مقدمه این اولین پست من در ویرگوله!
میخوام راجع به یکی از پارادایم های فراموش شده دنیای برنامه نویسی حرف بزنم. میگم فراموش شده، چون همون طور که اگه یکم دستتون تو کار باشه میدونید که از ترم 2 دانشگاه که برنامه نویسی پیشرفته پاس می کنیم با این بنده خدا کات می کنیم و دل در گرو OOP که میشه گفت شناخته شده ترین پارادیم حال حاضر هست می بندیم:)
اینجا می خواهیم ببینیم Functional Programming (FP) که بود و چه کرد؟
اول از همه چه پارادایم هایی داریم؟ به طور کلی میشه اینجوری تقسیم کرد:
خب اگه انتظار دارید الان بخوام بشینم دونه دونه همه رو توضیح بدم سخت در اشتباهید. من فقط fp رو خوندم:))
برای اینکه وقتتون رو نگیرم اول ببینید این مقاله به دردتون می خوره؟! پس آنچه در این مقاله خواهید خواند:
اگه بخوایم به اولین نشانه های ظهور FP برسیم باید خیلی فلش بک بزنیم در تاریخ. از استیو جابز و بیل گیتس و حتی آلن تورینگ عبور کنیم برسیم به سال ۱۹۳۰ و به استاد دکترای آلن تورینگ Alonzo Church یعنی این چهره:
ایشون اومد سیستم محاسباتی lambda calculus توسعه داد. این lambda calculus پایه و اساس همه زبان های برنامه نویسی functional هستش (حالا متوجه شدید اون عکس لاندای nonsense ای که اول مقاله گذاشتم به خاطر چیه!) بعد در سال 1950، اولین زبان FP به نام Lisp توسط آقای John McCarthy و کمپانی IBM ساخته میشه. بعدها هم زبان های FP دیگه ای مثل Sheme، Ocaml، Haskell، Scala و Clojure میان.
فانکشنال پروگرمینگ استایلی از برنامه نویسیه که building block ش فانکشنه. ولی آیا منظور از فانکشن رو واقعا می دونیم؟ موجوداتی که تا الان بهشون method، procedure، subroutin یا حتی function می گفتیم همین فانکشنی هست که در FP منظورمونه؟ جواب: نه الزاما
در واقع ایده اصلی FP از همینجا میاد که ما به چی می گیم فانکشن. در FP مفهوم فانکشن کاملا منطبق بر فانکشن توی ریاضیه. یه ورودی ثابت، همیشه یه خروجی ثابت داره. شما با یه نگاه به پارامترای فانکشنت می تونی بگی خروجی چیه. این یعنی خاصیت refrential transparency. می تونی یه expretion رو با مقدارش جایگزین کنی به طوری که همیشه نتیجه یکی بشه. مثلا به جای 4+5 بزاری 9.
یه ویژگی دیگه که function توی دنیای FP داره اینه که هیچ side effect ای وجود نداره. مثل آپدیت کردن دیتابیس، تغییر یه متغیر global (البته ناگفته نماند در FP بخوای هم نمی تونی این مورد رو تغییر بدی چون همه data structure ها immutable هستند)، نوشتن توی خروجی یا فایل و ...
به یه همچین فانکشن هایی که این دو ویژگی رو داشته باشند pure function گفته میشه.
خب شما فکر کن همه data structure هات immutable باشند اون وقت دیگه لازم نیست نگران باشی که همکارت بیاد یه فانکشن بنویسه و دیتای تو رو ببره اون تو تغییر بده. و بعد تو روز ها پس از روز ها دیباگ کنی تا بفهمی در خط n ام این دیتا تغییر کرده. نه! همچین اتفاقی نمیفته.
x = [1, 2, 3]
y=func(x)
x?
در مثال بالا مقدار x بعد از پاس دادن به فانکشن چی میشه؟ جواب: [1,2,3]. چون هر اتفاقی هم که توی func بیفته مطمئنیم x غیرقابل تغییره.
پس اینجوری تست و دیباگ و فهم کد راحت تر شده.
دوم اینکه همون طور که تو با همکارهات کمتر به مشکل میخوری، thread ها هم کمتر با هم به مشکل میخورن! چون هیچ کس نمی تونه دیتای اون یکی رو دست کاری کنه این یعنی thread safty داریم و اونم یعنی خیلی شیک و تمیز میشه parallelism داشت.
حلا شما فکر کن یه دیتا استراکچر که ساختی دیگه تا ابد نمی تونی تغییرش بدی. پس اگه لازم شد تغییر بدیم چی کار کنیم؟ میریم یه کپی ازش میسازیم و سپس اون تغییر مورد نظر رو اعمال می کنیم. خب اینطوری رم رو نمی خوره؟ متاسفانه چرا. و همچنین کپی کردن کل data structure به جای تغییر روی همون object قبلی preformance رو پایین میاره که اینها از نیمه های تاریک FP هست. اما FPL ها معمولا به جای کپی کردن از تکنیک هایی مثل tail call optimisation, lazy evaluation, and smart linking استفاده می کنند تا preformance بهتر بشه.
با خودم فکر کردم چه جمع بندی بهتر از اینکه FP رو با OOP مقایسه کنم و قضاوت رو به شما بسپارم!
https://medium.com/twodigits/advantages-and-disadvantages-of-functional-programming-52a81c8bf446
https://en.wikipedia.org/wiki/Functional_programming
https://speakerdeck.com/geekingfrog/functional-programming-in-javascript-intro
https://youtu.be/0if71HOyVjY?si=AFlFKzy8ULVriMAb