کتابخونه 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 بگیریم).

لینک‌های پروژه جدید

  • مخزن کدها: سورس برنامه و داکیومنت‌ها رو می‌تونید در گیت‌هاب ما پیدا کنید.
  • سیستم مدیریت پروژه: مدیریت کارهای این پروژه در ترلو انجام میشه.

دوست داری به بقیه کمک کنی؟
+ یه نگاهی به کتابخونه جدید بنداز و اگر دوست داشتی استفاده کن، ستاره بده و به بقیه معرفی کن
+ اگر نظر و پیشنهادی داری همینجا مطرح کن تا این مطلب کامل‌تر بشه
+ این مطلب رو برای کسایی که نیاز دارن بفرست
+ این مطلب رو لایک کن