بحث دیزاین پترن زبان های فانکشنال

design

#1

مقدمه:

  • برای شی گرایی یا OO منابع زیادی برای دیزاین پترن یا DP وجود داره که یکی از معروفترین هاش همون ۲۳ تا روشی هست که در کتاب GoF معرفی شدن.

  • در مطلبی در stack exchange کسی مطرح کرده بود در زبان های فانکشنال یا FP راه حل ها ای برای مشکلاتی که OO با DP به حل کردن اونها پرداخته به صورت ذاتی در معماری FP وجود داره.

سوال:

  • آیا در FP نیاز به DP داریم؟
  • اگر در FP نیاز به DP داریم منبعی رو در این مورد سراغ دارید؟
  • اگر در FP نیاز به DP نداریم دلیل این موضوع چیست؟
لینک های مفید:



#2

درود

بله در زبان های functional هم می تونید از concurrency patterns ها بهره ببرید منابع هم زیاده

مثل کتاب های

image

image

از نمونه پترن هاشم میشه اشاره کرد به

  • Active Object
  • Balking pattern
  • Barrier
  • Double-checked locking
  • Guarded suspension
  • Leaders/followers pattern
  • Monitor Object
  • Reactor pattern
  • Read write lock pattern
  • Scheduler pattern
  • Thread pool pattern
  • Thread-local storage

#3

من حدس میزنم که 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


#4

درود این کتاب قابل فهم برای افرادی که این دو زبان رو دنبال نمی کنند است ؟ یا به مشکل می خورم ؟ آشنایی من فقط در الکسیر است.


#5

بنظر من فرق زیادی بین زبان های FP وجود نداره.
الکسر هم نوعی زبان Lispy بحساب میاد


#6

تجربه کار با زبان فانکشنال دارید زیاد براتون سخت نخواهد بود ارتباط با یه زبان دیگه حالا بحث سینتکسشون خاص هر زبانه


#7

در این کتاب بیشتر جایگزین های design pattern های oop نوشته شده وبه عقیده من این اصلا طرز درست یادگیری fp نیست
“Design pattern” های زبان های fp کاملا فرق دارند
چون من سکالا فقط بلدم چند کتاب معرفی که کردم اینجا اشاره میکنم در ضمن در قسمت آموزش سکالا در این سایت بعضی پترن ها رو توضیح دادم
Essential Scala
Advanced Scala with cats
Functional Programming in Scala


#8

منم فکر می کنم بهتره مسائل در fp با نگاه fp حل بشه اما با این حال این کتاب فرصت مقایسه عملی رو هم بوجود آورده


#9

حرف از کتاب scala شد، این کتاب موضوع اصلیش DP نیست ولی چون پروژه محوره از DP هم طبعا استفاده کرده:

لینک کتاب


#10

ببخشید، من لینکو تغییر دادم به لینک رسمی


#11

اگر به فکر کار با FP هستید بهتره با زبان های ساده تر که فقط از یک پرادایم پشتیبانی می کنند شروع کنید مثل clojure, elixir یا Haskell


#12

میشه لطفا یک مثال singleton برای ثبت لاگ بزنید؟

مثال singleton پایتون در stack overflow


#13

به writer monad نگاه کنید
درک این یک کم زمینه میخواهد اگه شما مفهوم monad بدانید درک این بهتر میشه


#14

مطلب رو دیدم ولی چیز زیادی نفهمیدم مثل اینکه به کمی راهنمایی در این مورد نیاز دارم، لطفا چندتا سرنخ و کلمه کلیدی برای تحقیق بیشتر معرفی کنید.
سپاس


#15

اول این پست بخونید بعد من در پست جدا توضیح میدم


#16

خیلی پاسخ به این سوال سادست، در FP نه آبجکتی به اون معنی که در OOP هست وجود داره و نه instantiation و نه intance های مختلف از هیچ چیزی. پس این مشکل در بطن پرادایم حل شده.
اگر به پردازش زنجیره وار که سام اشاره کرد توجه کنید هم این نکته مشخص میشه


#17

کار برای من کمی سخت تر شد!

کمی در مورد اسکالا تحقیق کردم، نتیجه:

با خوندن این مطلب متوجه شدم که برنامه ای که با اسکالا نوشته شده بعد از پردازش تبدیل میشه به همون bytecode ی که برای JVM داریم.

کمی جلوتر رفتم و در مورد ساختار bytecode در JVM تحقیق کردم، نتیجه:

در این مقاله از دانشگاه ملی تایوان به قسمتی رسیدم که در مورد دستور العمل ها یا instruction ها نوشته بود و خب تا اینجا فقط به این نکته رسیدم که از اینجا به بعدش باید در مورد class fileها تحقیق کنم.

زیرِ نیم کاسه ( under the hood):

کمی جستجو کردم و رسیدم به وبلاگ شخصی به نام Vital Patel که در مورد اینکه زیر نیم کاسه ی class file در JVM چه خبره مطلب نوشته بود، قسمتی رو در مطلب پیدا کردم که در مورد ACCESS FLAG نوشته بود:

نقل قول به فارسی:

ACCESS FLAG یک متغییر دو بایتی هست که مشخص میکنه ثابت ها در CONSTANT POOL (همه ی اسامی متغییر ها، کلاس ها و موجودیت ها در فایل اصلی در ای قسمت هستن) چه نوع دسترسی دارند(public, abstract, …)

خب تا اینجا فقط اینو فهمیدم که از نظر فنی میشه برای موجودیت ها دسترسی تعیین کرد و از این قابلیت استفاده کرد برای کنترل تولید موجودیت های جدید( این همون هدفیه که از singleton در شی گرایی استفاده میکنیم).

اینم یک مطلب عالی دیگه که JVM چطور کار میکنه.

راه رو اشتباه رفتم؟ اعتراف میکنم که صد در صد، نمیشه ره صد ساله رو با خوندن ۲-۳ تا مطلب رفت!


#18

مسیر رو اشتباه نرفتید، بنظر من اینکه برنامه برای چه پلتفرمی کمپایل میشه خیلی مهم نیست و مورد دوم اینه که اصلا چرا باید به دنبال پترنی رفت که نه در fp وجود داره و نه بهش نیاز هست.
مگر اینکه سکالا رو به صورت multuli paradighm و یا oop اجرا کنید. من پیشنهاد می کنم روی یک زبان کاملا فانکشنال کار کنید اول که مجبور باشید همه مشکلات رو بدون وجود امکانات و ابزار oop حل کنید. بعد سکالا شیرین میشه.


#19

بذارید یک مثال ضایع اما با معنی بزنم تا منظورمو برسونم که الان من در چه شرایطی هستم:

فرض کنید شخصی به سن ۱۸ سالگی میرسه و خانوادش برای تولد ۱۸ سالگیش ماشین هدیه میدن، چون این شخص زمانی که ۶ ساله بود متوجه شد برای اینکه دوچرخه سواری یاد بگیری باید به دوچرخش کمکی ببنده، امروز هم در تولد ۱۸ سالگیش به همین نتیجه میرسه که باید به ماشینش کمکی ببینده تا رانندگی یاد بگیره!

این موضوع واقعا در مورد FP برای من صدق میکنه :sweat_smile:


#20

بگذارید من برای شما یک مثال بزنم، در FP شخصی که 6 سالش بوده همیشه 6 ساله باقی میمونه و شخص که ۱۸ سالش هست هرگز ۶ ساله نبوده :joy: