کتابخونه Railway Oriented در سی‌شارپ

بسم الله الرحمن الرحیممخاطب این متن کسانی هستند که حداقل آشنایی با موارد زیر داشته باشند:- زبان برنامه‌نویس #C- برنامه‌نویسی تابعی (Functional Programming)- Railway Orientedچه مشکلی وجود داره؟می‌دونیم روش Railway Oriented جزو روش‌های خوب برای مدیریت جریان برنامه و خطاها هستش. حالا چیزی که احتیاج داریم یک کتابخونه سی‌شارپ برای اینکار هستش. کتابخونه‌ای میخوایم که:به راحتی بتونیم متدهای مختلف رو در کنار هم قرار بدیمپشتیبانی کامل از متدهای Async داشته باشهبه صورت پیشفرض تمامی متدها رو با Try-Catch پوشش بده تا در صورت بروز خطای ناخواسته بتونیم مدیریت کنیممتن‌باز باشه و ترجیحا تحت لایسنس آسون و راحتی باشهداکیومنت خوبی داشته باشهکنترل خوبی روی انتقال داده‌ها، خطاها و جزئیات مربوط به اون داشته باشیمتا حد قابل قبولی امکان شخصی سازی داشته باشهامکانات مناسبی برای باگ‌یابی داشته باشه مثل ذخیره Exceptionها و پشتیبانی از Stack Traceبیش از حد به مباحث Functional Programming وابسته نباشه جوری که بقیه برنامه‌نویس‌ها که با این مباحث آشنایی ندارن نتونن استفاده کنن.استفاده ازش آسون باشهدر Nuget موجود باشه تا به راحتی قابل نصب باشهتست داشته باشه و پوشش تست‌ها بالا باشه تا خیالمون از درستی کتابخونه راحت باشهمیزان نصب و امتیاز بالایی داشته باشه (مثلا اگر در گیت‌هاب هست Star بالایی داشته باشه)ترجیحا راهکاری برای fail fast داشته باشه تا در مواقع خاص بتونیم زنجیره متدها رو بشکنیمراه‌حل‌های موجود و موارد مشابهبا جستجویی که در اینترنت و به خصوص مخازن آنلاین داشتیم متاسفانه کتابخونه مناسبی در این مورد پیدا نکردیم. در حوزه ابزارهای Functional وضعیت بهتر بود اما تمرکز زیادی برای روی Railway Oriented نداشتن. نزدیک‌ترین کتابخونه‌ای که پیدا کردیم این کتابخونه بود که در کنار مزایای زیاد، دچار نواقص و مشکلاتی هستش. به عنوان مثال:داکیومنت ندارهپشتیبانی خوبی از متدهای Async داره و به لطف overloadهای زیاد، استفاده ازشون آسونه ولی می‌تونست آسون‌تر هم باشه. به عنوان مثال:هم متد OnSuccess داریم و هم OnSuccessAsync. این روش نامگذاری در برنامه‌نویس‌های سی‌شارپ کار بسیار متداول و استاندارد هستش اما گاهی اوقات در زنجیره متدها، تشخیص اینکه از کدوم متد باید استفاده کنیم ممکنه کمی سخت بشه و سرعت کدنویسی ما رو کم کنه. از طرفی به نظر نیازی به داشتن دو نوع متد متفاوت نیست.کلاسی به نام TryExtenstions داره که دور متدِ ورودی یک Try-Catch قرار میده. این عالیه اما کاشکی این ویژگی روی تمامی متدها اعمال میشد. به عنوان مثال، ما هم OnSuccess داریم و هم TryOnSuccess. بهتر بود این دوتا متد با هم یکی میشدن.با توجه به حجم نسبتا بالای متدهای overload شده، به نظر نوشتن تست برای این پروژه کار چندان آسونی نیست اما مطمئنا وجود تست میتونه خیال استفاده کنندگان رو راحت کنه.پیاده‌سازی کتابخونه جدیدتصمیم گرفتیم کتابخونه جدیدی در این حوزه ایجاد کنیم چون:برای ما مهمه و اولیت داره: Railway Oriented روش اصلی ما برای پیاده‌سازی کدهای آینده خواهد بود. این کتابخونه جزو کتابخونه‌های زیربنایی هستش و معتقدیم استفاده از این روش مزایای زیادی داره.کتابخونه مناسبی پیدا نکردیم: طبیعتا دوست داشتیم کتابخونه‌ای پیدا کنیم که متناسب نیازهای ما باشه اما متاسفانه مورد مناسبی پیدا نکردیم و راه‌حل‌های موجود برطرف کننده نیازهای ما نیستن.با توجه به اینکه کتابخونه FunctionalUtility (که قبلا ذکر کردیم) نزدیک‌ترین پروژه به نیازهای ما هستش و با توجه به لایسنس MIT که به ما اجازه استفاده آزاد از کدها رو میده تصمیم داریم از این پروژه استفاده کنیم (Fork بگیریم).لینک‌های پروژه جدیدمخزن کدها: سورس برنامه و داکیومنت‌ها رو می‌تونید در گیت‌هاب ما پیدا کنید.سیستم مدیریت پروژه: مدیریت کارهای این پروژه در ترلو انجام میشه.دوست داری به بقیه کمک کنی؟+ یه نگاهی به کتابخونه جدید بنداز و اگر دوست داشتی استفاده کن، ستاره بده و به بقیه معرفی کن+ اگر نظر و پیشنهادی داری همینجا مطرح کن تا این مطلب کامل‌تر بشه+ این مطلب رو برای کسایی که نیاز دارن بفرست+ این مطلب رو لایک کن