تابع در برنامه نویسی چیست؟ معایب و مزایا و همه نکات
برنامه نویسی تابعی (Functional programming) که به طور اختصار به آن FP هم گفته می شود، روشی برای ساخت نرم افزار با ایجاد توابع خالص (pure functions) است. این فرایند در مقابل مفاهیمی مثل وضعیت های اشتراک گذاشته شده و داده های قابل تغییر در برنامه نویسی شی گرا (Object Oriented Programming) قرار دارد.
زبان های تابعی به جای اجرای گزاره ها، روی عبارات و اعلان ها تاکید دارند. بنابراین برخلاف سایر رویه ها که به یک حالت محلی یا سراسری بستگی دارند، مقدار خروجی در برنامه نویسی تابعی فقط به آرگومان های ارسال شده به تابع بستگی دارد.
ویژگی های برنامه نویسی تابعی
- روش برنامه نویسی تابعی روی نتایج تمرکز دارد نه فرایند.
- در این روش تاکید روی چیزیست که باید محاسبه شود.
- داده ها در برنامه نویسی تابعی تغییر ناپذیر هستند.
- برنامه نویسی تابعی مسئله را به توابع تجزیه می کند.
- این روش بر اساس مفهوم توابع ریاضی ساخته شده و برای انجام محاسبات از عبارات شرطی و بازگشتی استفاده می کند.
- برنامه نویسی تابعی از تکرار عبارات حلقه و عبارات شرطی مانند If-Else پشتیبانی نمی کند.
تاریخچه برنامه نویسی تابعی
- پایه و اساس برنامه نویسی تابعی حساب لامبدا (Lambda calculus) است. این نوع برنامه نویسی در دهه 1930 برای کاربرد، توصیف و بازگشت توابع ایجاد شد.
- اولین زبان برنامه نویسی تابعی لیسپ (LISP) نام داشت که مک کارتی (McCarthy) در سال 1960 آن را طراحی کرد.
- در اواخر دهه 70، محققان دانشگاه ادینبورگ (Edinburgh)، ML (ام ال یا زبان متا) را تعریف کردند.
- در اوایل دهه 80، زبان هوپ (Hope)، انواع مختلف داده های جبری را برای استدلال بازگشتی و معادله ای اضافه کرد.
- در سال 2004 زبان تابعی اسکالا (Scala) ابداع شد.
زبان های برنامه نویسی تابعی
هدف تمام زبانهای برنامه نویسی تابعی تقلید از توابع ریاضی می باشد، اما فرآیند اصلی محاسبات در برنامه نویسی تابعی متفاوت است.
در اینجا به برخی از مهمترین و برجسته ترین زبان های برنامه نویسی تابعی اشاره می کنیم:
- هسکل (Haskell)
- اس ام ال یا استاندارد ام ال (SML)
- کلوژر (Clojure)
- اسکالا (Scala)
- ارلنگ (Erlang)
- کلین (Clean)
- اف شارپ (F#)
- ام ال (ML)/ لیسپ (Lisp)/ اسکیم (Scheme)
- ایکس اس ال تی (XSLT)
- اس کیو ال (SQL)
- متمتیکا (Mathematica)
اصطلاحات و مفاهیم پایه در برنامه نویسی تابعی
داده های تغییر ناپذیر (Immutable Data) دادههای تغییرناپذیر به این معناست که شما باید به راحتی بتوانید به جای اصلاح ساختارهایی که از قبل وجود دارد، ساختارهای داده ای ایجاد کنید.
شفافیت ارجاعی (Referential transparency) برنامه های تابعی باید درست مثل اینکه برای اولین است انجام بدهند. به این ترتیب متوجه خواهید شد که چه اتفاقی در طول اجرای برنامه افتاده یا نیفتاده و اثرات جانبی (side-effects) آن را در نظر می گیرید. در اصطلاحات مربوط به برنامه نویسی تابعی به این مورد شفافیت ارجاعی می گویند.
حتما دانلود کنید: صفر تا صد برنامه نویسی جاوا اسکریپت (فیلم + pdf)
ماژولار بودن (Modularity) طراحی ماژولار باعث افزایش بهره وری می شود. به این ترتیب، ماژول های کوچک را می توان به سرعت کدگذاری کرد و شانسشان را برای استفاده مجدد بالا برد. این اتفاق قطعا منجر به توسعه سریعتر برنامه ها می شود. جدا از این مساله، در این حالت ماژول ها را می توان به طور جداگانه آزمایش کرد و همین به شما کمک می کند زمان صرف شده برای تست واحد و اشکال زدایی را کاهش بدهید.
نگهداشت پذیری (Maintainability) نگهداشت پذیری اصطلاح ساده ای است و به این معناست که برنامه نویسی تابعی راحتتر نگهداری می شود زیرا نیازی نیست نگران تغییر تصادفی چیزی خارج از تابع داده شده باشید.
تابع درجه یک (First-class function) “First-class function” تعریف موجودیت های زبان برنامه نویسی است که هیچ محدودیتی در استفاده از آنها وجود ندارد. بنابراین، توابع درجه اول می توانند در هر نقطه از برنامه ظاهر شوند.
کلوژر (Closure) بستار یا کلوژر یک تابع درونی است که می تواند حتی پس از اجرای تابع والد به آن دسترسی داشته باشد.
توابع مرتبه بالاتر (Higher-order functions) توابع مرتبه بالاتر یا توابع دیگر را به عنوان آرگومان دریافت می کنند و یا اینکه آنها را به عنوان نتیجه یا خروجی برمیگردانند. توابع مرتبه بالاتر امکان جزئی کردن توابع یا به اصطلاح کاری کردن (currying) را به وجود می آورند. این تکنیک در یک زمان یک تابع را به آرگومان های خود اعمال می کند، چون هر عملکرد یک تابع جدید که آرگومان بعدی را می پذیرد برمی گرداند.
تابع خالص (Pure function)
یک تابع خالص تابعی است که ورودی های آن به عنوان ورودی (inputs) اعلام می شوند و هیچ کدام از این ورودی ها نباید پنهان شوند. خروجی های (outputs) تابع نیز باید اعلام شوند. توابع خالص روی پارامترهای خودشان عمل می کنند. اگر تابع چیزی را برنگرداند کارآمد نیست. علاوه بر این، توابع خالص خروجی مشابهی را برای پارامترهای داده شده ارائه می دهند.
مثال:
Function Pure(a,b)
{
return a+b;
}
توابع ناخالص (Impure functions)
توابع ناخالص دقیقا برعکس توابع خالص عمل می کنند. این توابع ورودی یا خروجی مخفی دارند و برای همین به آنها ناخالص گفته می شود. توابع ناخالص را نمی توان به صورت مجزا مورد استفاده قرار داد یا آزمایش کرد چون این توابع وابسته هستند.
مثال:
int z;
function notPure(){
z = z+10;
}
ترکیب تابع (Function Composition) ترکیب تابع به معنی ترکیب کردن 2 یا چند تابع برای ساخت یک تابع جدید است.
وضعیت های مشترک (Shared States) حالات یا وضعیت های مشترک مفهوم مهمی در برنامه نویسی OOP (برنامه نویسی شئ گرا) است و در اصل ویژگی ها را به اشیا اضافه می کند. به عنوان مثال، اگر هارد دیسک یک شی باشد، ظرفیت ذخیره سازی و اندازه دیسک را می توان به عنوان ویژگی به آن اضافه کرد.
اثرات جانبی (Side Effects) اثرات جانبی به هر گونه تغییر حالتی گفته می شود که خارج از چیزی به نام تابع رخ می دهد. بزرگترین هدف تمام زبانهای برنامه نویسی به حداقل رساندن اثرات جانبی با جدا کردن آنها از بقیه کدهای نرم افزار است. در برنامه نویسی تابعی مهم است که اثرات جانبی را از بقیه منطق برنامه نویسی خودتان حذف کنید.
حتما بخوانید:آموزشهای برنامه نویسی رایگان ما در اینجا
مزایای برنامه نویسی تابعی
- برنامه نویسی تابعی به شما امکان می دهد از بروز مشکلات و خطاهای گیج کننده در کد جلوگیری کنید.
- تست و اجرای تست واحد (Unit testing) و اشکال زدایی کد در برنامه نویسی تابعی آسانتر است.
- امکان گسترش Hot code و fault tolerance (تحمل خطا) وجود دارد.
- برنامه نویسی تابعی ماژولاریتی (modularity) بهتری را با کد کوتاهتر ارائه می دهد.
- باعث افزایش بهره وری توسعه دهنده می شود.
- از توابع تو در تو (Nested Functions) پشتیبانی می کند.
- ساختارهای تابعی مثل Lazy Map، Lists و غیره ارائه می دهد.
- امکان استفاده موثر از حساب لامبدا (Lambda Calculus) را فراهم می کند.
محدودیت های برنامه نویسی تابعی
- پارادایم برنامه نویسی تابعی آسان نیست، بنابراین فهم آن برای مبتدی ها سخت است.
- از آنجایی که اشیاء زیادی در طول روند کدنویسی دخیل می شوند، نگهداری از آن سخت است.
- به mock کردن (نوعی تکنیک تست نویسی) و تنظیمات محیطی گسترده ای نیاز دارد.
- استفاده مجدد از آن بسیار پیچیده است و نیاز به بازسازی مداوم دارد.
- ممکن است اشیا مشکل را به درستی نشان ندهند.
دانلود کنید: دانلود رایگان آموزش صفر تا صد جی کوئری (فیلم+PDF)
مقایسه برنامه نویسی تابعی با برنامه نویسی شئ گرا
برنامه نویسی شئ گرا(Object-oriented programming) |
برنامه نویسی تابعی(Functional Programming) |
از داده های قابل تغییر استفاده می کند. |
از داده های غیرقابل تغییر استفاده می کند. |
از مدل برنامه نویسی دستوری (Imperative Programming) پیروی می کند. |
از مدل مبتنی بر برنامه نویسی اعلانی (Declarative Programming) پیروی می کند. |
روی اینکه “چطور برنامه نویسی خودتان را انجام می دهید” تمرکز می کند. |
روی “آنچه که در برنامه انجام می دهید” تمرکز می کند. |
از برنامه نویسی موازی (Parallel Programming) پشتیبانی نمی کند. |
از برنامه نویسی موازی (Parallel Programming) پشتیبانی می کند. |
این روش می تواند اثرات جانبی زیادی ایجاد کند. |
توابع آن اثرات جانبی ندارند. |
فرایند کنترل جریان (Flow Control) با استفاده از حلقه ها و دستورات شرطی انجام می شود. |
کنترل جریان (Flow Control) با استفاده از فراخوانی تابع و فراخوانی تابع با استفاده از بازگشت (recursion) انجام می شود. |
ترتیب اجرای بیانیه ها (statement) مهم است. |
ترتیب اجرای بیانیه ها (statement) خیلی مهم نیست. |
فقط از “انتزاع بر داده ها” (Abstraction over Dat) پشتیبانی می کند. |
از “انتزاع بر داده ها” (Abstraction over Dat) و “انتزاع بر رفتار” (Abstraction over Behavior) پشتیبانی می کند. |
آموزش آنلاین برنامه نویسی (تنها 11 سایت واقعا رایگان)
جمع بندی
- برنامه نویسی تابعی یا FP روشی برای ساخت نرم افزار بر اساس برخی از اصول اساسی و پایه است.
- مفاهیم برنامه نویسی تابعی بر نتایج تمرکز دارند نه فرآیند.
- هدف تمام زبان های برنامه نویسی تقلید از توابع ریاضی است.
- از جمله برجسته ترین زبان های برنامه نویسی تابعی می توان به هسکل (Haskell)، اس ام ال (SML)، کلوژر (Clojure)، اسکالا (Scala) و ارلنگ (Erlang) اشاره کرد.
- تابع خالص (Pure function) تابعی است که ورودی های آن به عنوان ورودی اعلان می شوند و هیچکدام نباید مخفی بشوند. خروجی ها نیز به عنوان خروجی اعلام می شوند.
- داده های تغییرناپذیر (Immutable Data) به این معنی است که شما به راحتی می توانید به جای اصلاح ساختارهایی که قبلاً وجود دارد، ساختارهای داده ای را ایجاد کنید.
- برنامه نویسی تابعی به شما امکان می دهد از بروز مشکلات و خطاهای گیج کننده در کد جلوگیری کنید.
- کدهای تابعی آسان نیستند، بنابراین درک آنها برای مبتدیان دشوار است.
- برنامه نویسی تابعی از داده های تغییر ناپذیر استفاده می کند اما برنامه نویسی شئ گرا داده های قابل تغییر را به کار می برد.
حتما بخوانید: یادگیری کدام زبان برنامه نویسی بهتر است؟ (آپدیت 2022)
چقد خوب و کوتاه بود
پاسخ