برنامهنویسان معمولا آدمهای باهوش و خلاقی هستند اما در همین حال باید برای انتخاب زبان برنامهنویسی مورد نظرشان چند تکنیک و رویکرد را دنبال کنند. برای مثال PHP را به عنوان یک زبان ‘Lazy’ میشناسند و همچنین جاوااسکریپت به عنوان یک زبان ‘difficult predictable magic’ شناخته میشود. امروزه برنامهنویسی تابعی موضوعی است که توجههای بیشتری را به خود جلب کرده و شرکتهای بیشتری در حال استفاده کردن از این پارادایم برنامهنویسی هستند. براساس ارزیابیها و نتایج وبسایتهای Github و Stack Overflow زبانهای برنامهنویسی تابعی مانند Elm و Elixir در حال پیشرفت و محبوب شدن هستند. همچنین پیشرفت عظیم جاوااسکریپت توسعهدهندگان بیشتری را به سوی یادگیری برنامهنویسی تابعی سوق میدهد. توسعهدهندگانی که با حالت تابعی کار کردهاند و آشنایی دارند تمایل بالایی به کار کردن روی فریمورکهای SPA خواهند داشت که در نتیجه Redux، React، MobX و مواردی دیگر امروزه بسیار محبوب شدهاند.
خب برنامهنویسی تابعی چیست و چرا در حال تبدیل شدن به یک مورد محبوب است؟ بیایید نگاهی نزدیکتر به این موضوع بیاندازیم.
مبانی
جهان جاوااسکریپت امروزه بسیار فعال است. چند سال پیش تنها افراد کمی وجود داشتند که ایده برنامهنویسی تابعی را در سر میپروراندند. اما در طی سه سال اخیر تقریبا بسیاری از اپلیکیشنهای بزرگ جاوااسکریپتی در حال استفاده از ایده برنامهنویسی تابعی بودند. دلایل هدفمندی نیز پشت چنین قضیهای وجود داشت:
- برنامهنویسی تابعی به شما اجازه میدهد تا کدهای فشردهتر و پیشبینی شدهتری بنویسید.
- تست کردن چنین اپلیکیشنهایی بسیار آسانتر است (البته یادگیری آن اصلا ساده نیست).
تفاوتهای اصلی که برنامه توسعه داده شده با استفاده از برنامهنویسی تابعی با دیگر اپلیکیشنها دارد شامل موارد زیر میشود:
- در برنامهنویسی تابعی شما به صورت کامل از توابع و ترکیب آنها استفاده میکنید.
- در برنامهنویسی تابعی خبری از وضعیتهای به اشتراکگذاری شده، دادههای تغییرپذیر و تاثیرات جانبی نیست.
- در برنامهنویسی تابعی بیشتر روی رویکرد اضهاری یا بیانی تاکید میشود تا برنامهنویسی امری.
برنامهنویسی تابعی به صورت کلی براساس مواردی است که در بالا به آنها اشاره شده است. وقتی که قصد دارید از حالت تابعی استفاده کنید شما باید آشنایی کامل با برنامهنویسی تابعی و تمام اصطلاحات آن در حوضه برنامهنویسی را داشته باشید: توابع خالص، ترکیب توابع، جلوگیری از وضعیتهای به اشتراکگذاری شده و... . بغیر از این موارد باید بگویم که شما باید کاملا دید متفاوتی نسبت به برنامهنویسی و مفهوم آن داشته باشید. در اینجا میتوانید چند موضوع را در این رابطه دنبال کنید:
Pure functions یا توابع خالص منظور توابع قطعی هستند که اثرات جانبی ندارد و از قسمتی دیگر تاثیر نمیگیرد. منظور از توابع قطعی این است که خروجی تابع همواره برای یک مجموعه از مقادیر ورودی، ثابت خواهد بود. برای برنامهنویسی تابعی خصوصیات چنین توابعی بسیار مهم است.
منظور از ترکیب توابع، پروسهای است که شما در آن دو یا چند تابع را در جهت ایجاد یک تابع جدید ترکیب میکنید.
وضعیت به اشتراک گذاری شده چیست؟ مشکل اصلی وضعیتهای به اشتراک گذاری شده درک تاثیرات یک تابع است. شما باید تاریخچه تمام متغیرهایی که یک تابع استفاده میکند را بدانید. بنابراین برنامهنویسی تابعی از وضعیتهای به اشتراک گذاری شده خودداری میکند و بجای آن روی ساختارهای دادهای تغییر ناپذیر و ترکیبات خالص در جهت ایجاد دادهای جدید تمرکز دارد. یکی دیگر از مشکلات وضعیتهای به اشتراک گذاری شده در برنامهنویسی تابعی این است که روی روند و اجرای ترتیبی توابع تاثیر میگذارد و در نهایت موجب به وجود آمدن خطا میشود. به همین دلیل برای دور شدن از خطاها بهتر است که از وضعیتهای به اشتراک گذاری شده نیز دور شوید.
قابلیت تغییر ناپذیری یکی از هستههای برنامهنویسی تابعی به شمار میرود. (این موضوع را با ثابتها یا Const اشتباه نگیرید). Const به شما کمک میکند تا متغیری بسازید که بعد از ایجاد نمیتوان مقادیر جدیدی را به آن اضافه کرد. اما Const قابلیت ایجاد شئهای تغییر ناپذیر یا immutable را ندارد. در این حالت شما قابلیت تغییر خود شئ را ندارید اما میتوانید خصوصیات آن را تغییر دهید.
منظوره از تاثیرات جانبی یا Side-effects در واقع به مقدار خروجی مربوط میشود. توابع میتوانند با متغیرهای خارجی ارتباط داشته باشند اما خب برنامهنویسی تابعی از چنین موضوعی خودداری میکند. به این دلیل بهتر است که خودداری شود چون قابلیت درکپذیری و تست نرم افزار بسیار بالاتر خواهد رفت. برای مثال در Haskell برای جلوگیری از تاثیرات جانبی از monadها در جهت ایزوله کردن تاثیرات جانبی استفاده میشود.
چرا در برنامهنویسی تابعی از رویکرد Declarative استفاده میشود؟
رویکرد Imperative روی جریان کنترل تمرکز دارد و جواب سوال «چگونه انجام دهم» را میدهد. اما رویکرد Declarative روی جریان دادهای تمرکز دارد و جواب سوال «چکاری را انجام دهم» را میدهد. رویکرد Imperative بیشتر از عملگرها استفاده میکند اما رویکرد Declarative روی عبارات تمرکز دارد.
قبل از اینکه وارد بخش مزایا و معایب برنامهنویسی تابعی شویم بیایید نظر کلی افراد در رابطه با برنامهنویسی تابعی را بخوانیم:
برخی از برنامهنویسان هنوز وجود دارند که فکر میکنند برنامهنویسی تابعی عجیب و غریب است. به نظر میرسد که در برخی مواقع اینگونه است. یک جمله معروف در رابطه با برنامهنویسی تابعی وجود دارد که میتوانید در زیر آن را مطالعه کنید:
کدنویسی در حالت تابعی بیشتر شبیه وارونه کد نوشتن است. همچنین برنامهنویسی تابعی بیشتر شبیه به حل کردن یک پازل است تا تشریح و پیادهسازی یک روند برای کامپیوتر.
به نظر من این طرز تفکر بیشتر یک چیز ذهنی و درونی برای افرادی است که نمی خواهند وقت کافی برای یادگیری این شیوه از برنامهنویسی را یاد بگیرند.
مزایا و معایب برنامهنویسی تابعی
معایب
- تا به حال اصطلاحات مناسبی برای زبانهای تابعی درست نشده است. اصطلاحات توابع خالص معمولا کندتر از hash tableها کار میکنند و این موضوع ممکن است که برای برخی از اپلیکیشنها بسیار مهم باشد.
- براساس اینکه برنامهنویسی تابعی کمی روند کاری را کند میکند استفاده از این حالت برای پیادهسازی الگوریتمهای داخل یک گراف مناسب نیست. برای حل چنین موضوعاتی معمولا از حالت برنامهنویسی Imperative استفاده میشود.
مزایا
- برنامهنویسی تابعی از آنجایی که قابلیت انتزاعی سازی بسیار بالایی دارد میتواند در کدنویسی کمتری نوشته شود. به همین دلیل مطمئنا در این حالت با خطاهای کمتری مواجه خواهیم بود.
- در برنامهنویسی تابعی تعداد بسیار کمتری از ابتکارات انسانی را مشاهده خواهیم کرد. بیشتر چیزها در این شیوه برنامهنویسی براساس قواعد ریاضی هستند و خبری از کلاس، شئ، نمونه و... نیست.
- برای حل محاسبات و مشکلات داخل یک برنامه، حالت تابعی به شما ساختاری منعطفتر میدهد. همچنین برنامهنویسی تابعی به نسبت برنامهنویسی شئگرا به توسعهدهندگان ابزارهای بیشتری در حل مشکلات پیچیده میدهد.
- کدنویسی در حالت تابعی بسیار سریعتر اتفاق میافتد و همچنین تستینگ و دیباگ کردن به سرعت جلو میرود. وقتی که با یک زبان برنامهنویسی سطح بالا کار میکنید داشتن درک بالا از کلمات و... بسیار مهم است، کلمات استفاده شده در سینتکس برنامهنویسی تابعی قابلیت درکپذیری بالاتری دارد.
استفادههای برنامهنویسی تابعی
امروزه توسعهدهندگان سعی دارد تا مشکلات را براساس پردازشهای موازی و کار با Big Data حل کنند. با پیروی کردن از چنین حالتی شما نتایج را به صورتی بسیار سریعتر از حالتهای گذشته دریافت میکنید. همچنین به محاسبات غیر متمرکز مانند بلاکچین نیز فکر کنید. برای آشنایی با این شیوه از برنامهنویسی میتوانید منابع موجود در لینکهای زیر را دنبال کنید:
The book Learn You a Haskell
— The book ‘Real-World Functional Programming: With Examples in F # and C #’
— Course Programming Languages, Part A (for studying the concepts of FP using SML, Racket, Ruby)
— Course Introduction to Functional Programming
— GitHub (for JS) + Awesome FP JS
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید