برای شی گرایی یا OO منابع زیادی برای دیزاین پترن یا DP وجود داره که یکی از معروفترین هاش همون ۲۳ تا روشی هست که در کتاب GoF معرفی شدن.
در مطلبی در stack exchange کسی مطرح کرده بود در زبان های فانکشنال یا FP راه حل ها ای برای مشکلاتی که OO با DP به حل کردن اونها پرداخته به صورت ذاتی در معماری FP وجود داره.
سوال:
آیا در FP نیاز به DP داریم؟
اگر در FP نیاز به DP داریم منبعی رو در این مورد سراغ دارید؟
من حدس میزنم که concurrency patterns مربوط به مبحث concurrent programming میشه که خیلی ربطی به پرادایم FP نداره.
اما در مورد پترن های موجود در FP باید گفت که FP و OOP دو دیدگاه کاملا متفاوت به حل مسائل هستند و design pattern های موجود در OOP در FP وجود نداره چون نیاز ها جور دیگری هستند و راه حل ها هم همینطور. خیلی از مشکلاتی که در oop با design pattern حل میشه در بطن پرادایم فانکشنال حل شده که باعث پایین آمدن ضریب خطا و بالا رفتن data integrity میشه.
کتاب Functional Programming Patterns که @Maboud هم اشاره کرد بصورت خیلی عملی پترن های کاربردی در FP رو گفته.
مقاله زیر چند مثال جالب داره که اگر روشن نبود با کمال میل توضیح میدم
من شخصا ترجیح میدم از واژه design pattern در FP استفاده نکنم و بجاش بگم Pattern
در این کتاب بیشتر جایگزین های design pattern های oop نوشته شده وبه عقیده من این اصلا طرز درست یادگیری fp نیست
“Design pattern” های زبان های fp کاملا فرق دارند
چون من سکالا فقط بلدم چند کتاب معرفی که کردم اینجا اشاره میکنم در ضمن در قسمت آموزش سکالا در این سایت بعضی پترن ها رو توضیح دادم
Essential Scala
Advanced Scala with cats
Functional Programming in Scala
خیلی پاسخ به این سوال سادست، در FP نه آبجکتی به اون معنی که در OOP هست وجود داره و نه instantiation و نه intance های مختلف از هیچ چیزی. پس این مشکل در بطن پرادایم حل شده.
اگر به پردازش زنجیره وار که سام اشاره کرد توجه کنید هم این نکته مشخص میشه
کمی جستجو کردم و رسیدم به وبلاگ شخصی به نام Vital Patel که در مورد اینکه زیر نیم کاسه ی class file در JVM چه خبره مطلب نوشته بود، قسمتی رو در مطلب پیدا کردم که در مورد ACCESS FLAG نوشته بود:
نقل قول به فارسی:
ACCESS FLAG یک متغییر دو بایتی هست که مشخص میکنه ثابت ها در CONSTANT POOL (همه ی اسامی متغییر ها، کلاس ها و موجودیت ها در فایل اصلی در ای قسمت هستن) چه نوع دسترسی دارند(public, abstract, …)
خب تا اینجا فقط اینو فهمیدم که از نظر فنی میشه برای موجودیت ها دسترسی تعیین کرد و از این قابلیت استفاده کرد برای کنترل تولید موجودیت های جدید( این همون هدفیه که از singleton در شی گرایی استفاده میکنیم).
مسیر رو اشتباه نرفتید، بنظر من اینکه برنامه برای چه پلتفرمی کمپایل میشه خیلی مهم نیست و مورد دوم اینه که اصلا چرا باید به دنبال پترنی رفت که نه در fp وجود داره و نه بهش نیاز هست.
مگر اینکه سکالا رو به صورت multuli paradighm و یا oop اجرا کنید. من پیشنهاد می کنم روی یک زبان کاملا فانکشنال کار کنید اول که مجبور باشید همه مشکلات رو بدون وجود امکانات و ابزار oop حل کنید. بعد سکالا شیرین میشه.
بذارید یک مثال ضایع اما با معنی بزنم تا منظورمو برسونم که الان من در چه شرایطی هستم:
فرض کنید شخصی به سن ۱۸ سالگی میرسه و خانوادش برای تولد ۱۸ سالگیش ماشین هدیه میدن، چون این شخص زمانی که ۶ ساله بود متوجه شد برای اینکه دوچرخه سواری یاد بگیری باید به دوچرخش کمکی ببنده، امروز هم در تولد ۱۸ سالگیش به همین نتیجه میرسه که باید به ماشینش کمکی ببینده تا رانندگی یاد بگیره!