
آموزش برنامه نویسی تابعی Functional Programming در سی شارپ
آموزش برنامه نویسی تابعی Functional Programming در سی شارپ یکی دیگر از آموزش های گروه آموزشی پرووید می باشد که در این قسمت آن را به شما معرفی می کنیم. این بسته ی آموزشی نیز یکی از دوره های آموزشی دیگر که در حوزه ی فارسی سازی آموزش های انگلیسی تنظیم شده است می باشد. عنوان این بسته ی آموزشی اعمال اصول برنامه نویسی تابعی در سی شارپ است که با نام اصلی Applying Functional Principles in Csharp از شرکت Pluralsight منتشر شده است.
برنامه نویسی تابعی چیست؟
برنامه نویسی تابعی از میان سه مدل برنامه نویسی عمده قدیمیترین آنهاست. اولین زبان برنامه نویسی تابعی APL بود که در سال 1955 تقریبا یک سال قبل از فورترن ابداع شد. امروزه وجود برنامه نویسی تابعی برای حل مشکلاتی پیچیده تر اثبات شده و میتوان با آن برنامه های سده تر را نیز به وجود آورد.

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

قابلیت های دیگر سی شارپ که البته به صورت Native در سی شارپ وجود ندارند امکان استفاده از مفاهیم برنامه نویسی تابعی را در سی شارپ فراهم می کنند. در این بسته ی آموزشی با مفهوم برنامه نویسی تابعی و مفاهیم مرتبط با آنها و البته پیاده سازی عملی آنها در سی شارپ آشنا خواهید شد.
اصول Immutability و مدیریت وضعیت در سی شارپ
در توسعه نرمافزار، تغییر وضعیت اشیا در بخشهای مختلف برنامه میتواند ردیابی رفتار کد و شناسایی خطاها را دشوار کند. Immutability یا تغییرناپذیری رویکردی است که در آن دادهها پس از ایجاد، بهصورت مستقیم تغییر نمیکنند و برای نمایش وضعیت جدید معمولاً مقدار یا شیء جدیدی ساخته میشود. استفاده از این اصل در C# میتواند وابستگی میان بخشهای مختلف برنامه را کاهش دهد و درک جریان داده را سادهتر کند، بهویژه در پروژههایی که منطق پیچیدهتری دارند.
طراحی مبتنی بر دادههای تغییرناپذیر به برنامهنویس کمک میکند اثر هر عملیات را روشنتر مشخص کند و از تغییرات ناخواسته در وضعیت مشترک جلوگیری کند. این رویکرد در کنار اصول برنامهنویسی تابعی، امکان نوشتن توابعی با رفتار قابل پیشبینیتر را فراهم میکند. در پروژههای بزرگ، کاهش وابستگی به تغییر وضعیت میتواند فرایند تست و نگهداری را نیز سادهتر کند و به توسعهدهندگان کمک کند منطق برنامه را با ساختاری منسجمتر سازماندهی کنند.
مدیریت خطاها بدون وابستگی بیش از حد به Exception
مدیریت خطا یکی از جنبههای مهم طراحی نرمافزارهای قابل نگهداری است. در C#، Exceptionها برای نمایش شرایط استثنایی کاربرد دارند، اما استفاده از آنها برای تمام خطاهای قابل پیشبینی ممکن است جریان عادی اجرای برنامه را پیچیده کند. برنامهنویسی تابعی رویکردهای دیگری برای نمایش نتیجه عملیات و انتقال اطلاعات مربوط به شکست ارائه میدهد. با استفاده از این الگوها، میتوان موفقیت یا ناموفق بودن یک عملیات را بهصورت بخشی از نتیجه آن در نظر گرفت و مدیریت خطا را روشنتر ساخت.
در این رویکرد، بهجای تکیه کامل بر پرتاب و دریافت Exception، میتوان نتایج را با انواع دادهای مشخص نمایش داد تا فراخواننده تابع بتواند حالتهای مختلف را بررسی کند. چنین ساختاری بهویژه در اعتبارسنجی ورودیها و عملیاتهایی که احتمال شکست قابل انتظار دارند، مفید است. تفکیک خطاهای پیشبینیپذیر از شرایط واقعاً استثنایی، به خوانایی کد کمک میکند و باعث میشود مسیرهای موفقیت و شکست در طراحی برنامه به شکل واضحتری مشخص شوند.
استفاده از Maybe برای مدیریت مقادیر Null در C#
مقادیر Null یکی از منابع رایج خطا در برنامههای شیگرا هستند. زمانی که برنامهنویس فرض میکند یک مقدار همیشه وجود دارد، ممکن است دسترسی به مقدار ناموجود به خطا منجر شود. الگوی Maybe در برنامهنویسی تابعی راهی برای نمایش صریح امکان وجود داشتن یا نداشتن یک مقدار است. بهجای انتقال مستقیم مقداری که ممکن است Null باشد، میتوان این وضعیت را با یک ساختار مشخص نمایش داد تا مصرفکننده داده ناچار باشد حالتهای مختلف را در نظر بگیرد.
استفاده از چنین الگویی به طراحی توابعی کمک میکند که قرارداد روشنتری درباره خروجی خود دارند. وقتی احتمال نبودن داده در ساختار نوع داده منعکس میشود، تشخیص نقاطی که نیازمند بررسی هستند آسانتر خواهد بود. این روش میتواند در بخشهایی از برنامه که با جستوجوی اطلاعات، دادههای اختیاری یا ورودیهای ناقص سروکار دارند، مفید باشد. آشنایی با Maybe به توسعهدهندگان C# کمک میکند مدیریت مقادیر Null را بهصورت ساختاریافتهتری انجام دهند و از فرضهای ضمنی در کد بکاهند.
کاهش Primitive Obsession با طراحی بهتر مدل داده
Primitive Obsession به استفاده بیش از حد از انواع داده ساده مانند string، int و decimal برای نمایش مفاهیمی اشاره دارد که از نظر دامنه برنامه معنای مشخصی دارند. برای مثال، شناسه یک کاربر، آدرس ایمیل و مبلغ مالی ممکن است همگی با انواع داده ساده نمایش داده شوند، اما قواعد و محدودیتهای متفاوتی داشته باشند. هنگامی که این مفاهیم بدون ساختار مشخص در سراسر برنامه پخش میشوند، اعتبارسنجی و حفظ سازگاری دادهها دشوارتر میشود.
ایجاد انواع داده اختصاصی برای مفاهیم مهم دامنه میتواند قواعد مربوط به آنها را در یک محل متمرکز کند و از اشتباه در استفاده از مقادیر جلوگیری کند. در C#، این رویکرد را میتوان با استفاده از کلاسها، ساختارها و انواع داده مناسب پیادهسازی کرد. ترکیب این روش با اصول برنامهنویسی تابعی به ایجاد مدلهایی روشنتر کمک میکند که رفتار و محدودیتهای داده را بهتر نشان میدهند. نتیجه، کدی است که فهم آن برای توسعهدهندگان سادهتر است و تغییرات آینده را بهتر مدیریت میکند.
سرفصل مطالب آموزش ویدئویی برنامه نویسی تابعی در سی شارپ
فصل اول: معرفی دوره ی آموزشی- مقدمه ی بسته ی آموزشی
- شروع به کار
- سرفصل بسته ی آموزشی و پیش نیاز ها
- Functional Programming چیست؟
- چرا باید از Functional Programming استفاده کنیم؟
- جمع بندی
- مقدمه
- تعریف واژگان مورد استفاده
- چرا Immutability اهمیت دارد؟
- مفهوم Mutability و Temporal Coupling
- محدودیت های Immutability
- نحوه ی صحیح برخورد با Side Effect ها
- معرفی مثال مورد نظر
- پیاده سازی Mutable
- ریفکتور کردن اولین متد
- ریفکتور کردن دومین متد
- پیاده سازی یک Mutable Shell
- ریفکتور کردن به یک معماری Immutable
- جمع بندی
- مقدمه
- ارتباط Exception ها و Readability
- Use Case های Exception ها
- اصل Fail Fast
- مکان صحیح Catch کردن Exception ها
- کلاس Result
- ارتباط کلاس Result و CQS
- ریفکتور کردن Exception ها
- جمع بندی
- مقدمه
- تعریف Primitive Obsession
- نحوه ی صحیح رفع کردن Primitive Obsession
- ارتباط Primitive Obsession و برنامه نویسی تدافعی
- محدودیت های Primitive Obsession
- زمان صحیح تبدیل کردن Primitive Type ها به Value Object ها
- ریفکتور کردن Primitive Obsession
- جمع بندی
- مقدمه
- معرفی یک اشتباه بسیار بزرگ
- خاصیت Non-nullability در سطح زبان
- بهبود دادن شرایط یک اشتباه بزرگ
- معرفی و استفاده از نوع داده ای Maybe
- محدودیت ها
- جمع بندی
- مقدمه
- روش سنتی مدیریت کردن Failure ها و Input Error ها
- ریفکتور کردن و استفاده از نوع داده ای Result و Maybe
- معرفی روش برنامه نویسی Railway-Oriented
- جمع بندی
- مقدمه
- معرفی Domain Model
- معرفی Application Code
- ریفکتور کردن Exception ها
- ریفکتور کردن Primitive Obsession
- ریفکتور کردن و رفتن به سمت کدهای Explicit
- Explicit کردن Null ها
- پیاده سازی Reference Data در قالب Code
- استفاده از Railway-Oriented Programming
- جمع بندی
- لیست منابع
- جمع بندی بسته ی آموزشی







