Ghasem Shirdel
Ghasem Shirdel
خواندن ۲ دقیقه·۲ سال پیش

برنامه نویسی تابع گرا (Either Monad)

Written by Ghasem Shirdel
Written by Ghasem Shirdel

Monad چیه ؟

میشه گفت که موناد الگو طراحی برای تابع هاست که یه سری مشکلات حل میکنن مثلا مشکل Null بودن ، مدیریت State یا Error Handling که توی این مقاله می خوام در مورد Either صحبت کنم.

Either Monad

ساختار Either برای مدیریت خطا ها استفاده میشه و حتی توی زبان برنامه نویسی مثل Golang جزیی از syntax اون محسوب میشه و دو مقدار value , err رو بر میگردونه.

  • کلاس Either یک ظرف هست که دو مقدار Right , Left داخل خودش نگهداری میکنه.
  • از Left برای نگهداری مقدار Failure و از Right برای نگهداری مقدار Success استفاده میشه.

خوب حالا برای پیاده سازی اون ما چرخ از اول اختراع نمی کنیم و از کتابخونه Arrow توی کاتلین یا پکیج dartz در زبان دارت استفاده می کنیم. اما قبل اون بهتر هست یه مثال از زمانی ببینیم که باید با استفاده از بلوک try-catch بیایم و ارور هامون رو کنترل کنیم توی این مثال هدف ما parse کردن یه رشته و به دست آوردن معکوس اون هست.



Kotlin
Kotlin


Dart
Dart


خوب همینطور که توی کد های بالا دیدیم برای مدیریت بهتر برنامه میایم و یه سری Exception به بیرون تابع پرتاب میکنیم و باید در ادامه این خطا ها رو مدیریت کنیم وگرنه برنامه کرش میکنه. در نهایت خروجی برنامه برای مقدار 2 عدد 0.5 و برای مقادیر غیر عددی یا 0 نمایش نوع خطا هست.

حالا با استفاده از Either کد هامون Refactor میکنیم تا ببینیم نتیجه چه خواهد بود?.


Kotlin
Kotlin


Dart
Dart


خوب در ابتدا اومدیم و یه سری کلاس برای تایپ ارور هایی که داشتیم اضافه کردیم تا داخل تابع هامون به عنوان مقادیر چپ برگردونیم. توی مرحله بعدی تابع های parse و reciprocal دیگه خطایی رو پرتاب نمیکنن و بلکه یه Either بر میگردونن که حاوی مقدار اصلی و مقدار ارور ماست. فرق دیگه ای که وجود داره به جای استفاده تو در توی توابع داخل magic اومدیم و از توابع map , flatmap استفاده کردیم. در آخر درون تابع main اومدیم و با استفاده از when یا تابع fold مقدایر Left , Right رو هندل کردیم.

نتیجه گیری

استفاده از Either مزیت هایی به همراه داره که میشه به مدیریت ساده تر ارور ها اشاره کرد (حد اقلش اینکه ما به برنامه تا حد ممکن ارور اضافه نکردیم ?) برای یادگیری بیشتر هم میتونین به داکیومنت هایی وجود داره مراجعه کنین ?.


https://medium.com/@albert.llousas/monads-explained-in-kotlin-4126ac0cb7f2
برنامه نویسیkotlindartfunctional programmingeither
شاید از این پست‌ها خوشتان بیاید