برنامه نویسی تابعی (Functional Programming) و مفاهیم آن در صنعت نرمافزار و برنامههای داده محور اهمیت بیشتری پیدا میکنند. اما برای اینکه بتوانیم از برنامهنویسی تابعی بهرهمند شویم لازم نیست از یک زبان کاملا تابعی مثل Haskell استفاده کنیم. ما میتوانیم اصول و الگوهای برنامهنویسی تابعی را حتی در زبانهای شیءگرا مثل سیشارپ دنبال کنیم. نتیجه ممکن است به اندازه یک زبان تابعی راحت و مختصر نباشد، اما با این وجود سبک غیر تابعی ساخت کد ما را از بین میبرد.
در سیشارپ میتوانیم توابع را به عنوان پارامتر یا توابع بازگشتی بپذیریم. به عبارت دیگر، توابع در سی شارپ first class هستند. این یعنی ما میتوانیم برنامه را دقیقا مانند زبانهای تابعی به صورت تابعی در کنار هم قرار دهیم، اما باید اعتراف کنم نه خیلی راحت و مختصر.
برنامهنویسی تابعی چیست؟
برنامهنویسی تابعی در واقع قدیمیتر از کامپیوترها است. این زبان اساسا از منطق ریاضی میآید. در برنامهنویسی تابعی ما با توابع برنامه را تهیه میکنیم و آنها تغییر نمییابند یا چیزی را تغییر نمیدهند، آنها فقط ورودی را به خروجی مپ میکنند. در اینجا یک تعریف خوب وجود دارد که آن را از سوالات quora یافتهایم.
برنامهنویسی تابعی نمونهای است که به جای اجرای اقدامات بر روی نتایج محاسبات متمرکز است. یعنی وقتی شما یک تابع را فراخوانی میکنید، تنها تاثیر قابل توجهی که این تابع دارد معمولا محاسبه یک مقدار و برگرداندن آن است. البته در پشت صحنه، استفاده از زمان CPU، اختصاص دادن و نوشتن حافظه است، اما از نقطه نظر برنامهنویس، اثر اصلی مقدار بازگشتی است.
بیشتر تعاریف برنامهنویسی تابعی بر Pure بودن تابع متمرکز است. با این حال جنبههای دیگری از برنامهنویسی تابعی وجود دارد که بیشتر مربوط به سبک آن در نوشتن برنامه است.
مزایای برنامهنویسی تابعی
در اینجا لیستی از مزایای برنامهنویسی تابعی را ذکر میکنیم.
1. توابع Pure استدلال کد ما را آسان میسازند
یکی از مهمترین مواردی که به ما کمک میکند قطعه کد را بهتر درک کنیم این است که بدانیم منبع تغییر کجاست. این مساله مهم است چون اگر با اطمینان بدانیم قطعه کد چه کاری انجام میدهد و چه کاری انجام نمیدهد، پس میتوانیم با اطمینان بیشتری کد خود را تغییر دهیم. مزیت دیگری که این نوع شفافیت کد میتواند داشته باشد وقتی است که میخواهیم مشکلی را در سیستم پیدا کنیم یا دیباگ کنیم.
"نسبت زمان خواندن (کد) در برابر نوشتن بیش از 10 به 1 است، بنابراین سهولت در خواندن، نوشتن را آسان میسازد".
جمله بالا نقل قولی از کتاب Clean Code نوشته Robert Martin بود. یعنی اگر من به نوعی بتوانم مدت زمان مورد نیاز برای خواندن کد را کاهش دهم، در این صورت زمان بیشتری برای انجام کارهای دیگر با محرومیت کمتر دارم.
2. تست توابع pure آسانتر است
در pure functionها هیچ حالت پنهان یا وابستگی به دنیای خارج وجود ندارد. این واقعیت به تنهایی باعث میشود که تست بسیار آسان شود زیرا جهت آمادهسازی عملکرد برای تست، دیگر نگران وابستگی Mocking یا موارد دیگر نیستیم.
3. دیباگینگ در برنامهای که به سبک تابعی نوشته شده است آسانتر است
نوشتن توابع pure که برنامه را واضحتر میسازد میتواند به دیباگینگ هم کمک کند. اگر با اطمینان بدانید که یک تابع چه کاری انجام میدهد، پس تنها کاری که باید انجام دهید این است که چه پارامتری به آن ارسال شده و آن مقدار را دنبال کنید و ببینید چه اشتباهی رخ داده است.
4. رویکرد اعلانی درک کد را آسانتر میسازد
در سبک برنامهنویسی شیءگرا، عباراتی داریم که مقادیر را مستقیما تغییر داده و دستکاری میکنند، این سبک برنامهنویسی را برنامهنویسی دستوری (imperative programming) مینامند. اما سبک دیگری وجود دارد که برنامه نویسی اعلانی (declarative programming) نامیده میشود. در این سبک به جای تغییر مستقیم برنامه، قسمتهای کوچکی از عملکرد را مینویسیم که کار خاصی را انجام میدهند و این کار را به خوبی انجام میدهند. به روشی که میتواند با مقادیر مختلفی مورد استفاده قرار گیرد و ما این توابع را در کنار هم میسازیم. در نتیجه ما فقط آنچه را که باید انجام شود را اعلان میکنیم به جای اینکه مستقیما همه محاسبات مورد نظر را در یک مکان جمع کنیم. این امر منجر به کد خواناتری میشود و میتواند به ما کمک کند تا بر روی حل مشکل واقعی متمرکز شویم.
5. Method signature
این مفهوم یعنی امضای (signature) متد توابع pure معنادار است. غالبا در کدهای غیرتابعی متدهایی را میبینیم که مقدار برگشتی یا پارامتری ندارند که کاری انجام دهند. با بررسی signature، ما نمیدانیم که ورودی و خروجی این تابع چیست و چه کاری انجام میدهد. همچنین نام متدها منبع قابل اطمینانی در این باره نیست. بنابراین تنها انتخابی که داریم این است که کل تابع را بخوانیم.
در توابع pure ما بلافاصله اطلاعات زیادی در مورد کاری که تابع انجام میدهد را با استفاده از بررسی signature آن دریافت میکنیم. گاهی اوقات این تمام چیزی است که باید در مورد تابع بدانیم و این نسبت به توابع غیر pure واضحتر و سریعتر است.
6. نوشتن برنامههای همزمان در برنامههای تابعی سریعتر است
توابع Pure با تعاریف خود thread safe بوده و آمادهاند تا برای برنامههای همزمان استفاده شوند.
برنامه تابعی بدون تغییرات دیگری برای همزمانی آماده است. شما نباید هرگز نگران وقفه و شرایط رقابتی باشید زیرا نیاز به استفاده از lockها (قفل) ندارید! هیچ بخشی از دادهها در برنامه تابعی دو بار توسط همان thread تغییر داده نمیشوند، چه برسد به دو thread مختلف. این بدان معناست که شما میتوانید به راحتی threadها را اضافه کنید بدون اینکه مشکلات قراردادی که در برنامههای همزمان اذیتکننده است را دریافت کنید.
معایب برنامهنویسی تابعی
مانند هر زبان برنامهنویسی، فریمورک، الگو یا رویکرد دیگری، برنامهنویسی تابعی هم یک سری معایب دارد. در اینجا برخی از مشکلاتی که ممکن است هنگام استفاده از برنامهنویسی تابعی با آنها رو به رو شوید را ذکر میکنیم. برخی از این مشکلات مربوط به نحوه استفاده ما از سبک تابعی است. اما بیشتر این مشکلات مربوط به جو فعلی صنعت نرمفزار است و نه مشکلات ذاتی روش تابعی نوشتن برنامه.
1. منابع یادگیری زیادی برای برنامهنویسی تابعی وجود ندارد. اما این مشکل هر سال کمتر میشود زیرا محبوبیت برنامههای تابعی بیشتر و بیشتر میشود. به یاد داشته باشید که نیازی به ذکر اصطلاحات ترسناک ریاضی نیست.
2. اگرچه نوشتن توابع pure آسان است، اما ایجاد آنها برای دستیابی به یک برنامه کامل دشوار است. به خصوص وقتی برای اولین بار شروع به نوشتن برنامههای خود به این سبک میکنید.
3. از آنجا که قرار نیست حالت تغییر داشته باشیم و همیشه مقادیر را کپی کرده و یک مقدار/آبجکت جدید را برمیگردانیم، باید کد اضافی بنویسیم. اما پیروی از این عمل مزایای زیادی خواهد داشت و در طولانی مدت در وقت ما صرفهجویی میکند.
4. برنامهنویسی تابعی خیلی خوب با عملکرد I/O ترکیب نمیشود. هر تابعی که نیاز به این نوع مسائل داشته باشد impure است. اما ما میتوانیم در برنامههای خود لایهای داشته باشیم که با این نوع مسائل سر و کار داشته باشد.
5. استفاده از مقادیر تغییرناپذیر میتواند منجر به مصرف بیشتر حافظه شود.
6. نوشتن برنامه به سبک تابعی یا در زبان تابعی همیشه عملی نیست. اما این مشکلات ذاتی سبک تابعی برنامهنویسی نیست بلکه منابع موجود و غیره است که ممکن است با گذشت زمان تغییر کند.
جمعبندی
در این مقاله توضیح دادیم که برنامه نویسی تابعی چیست و چه مزایا و معایبی دارد. حتی اگر زبان مورد استفاده ما یک زبان تابعی نباشد، این امکان وجود دارد که از برنامهنویسی تابعی استفاده کنیم. در برنامهنویسی تابعی الگوهایی وجود دارند که مزایای برنامهنویسی تابعی را به ما میدهند و خواندن، درک و استدلال کدمان را آسانتر میسازند.
اگر به برنامه نویسی تابعی علاقه مند شدهاید میتوانید از آموزش برنامه سی شارپ پیشرفته - برنامه نویسی تابعی استفاده کنید.
نظرات کاربران در رابطه با این دوره