تغییر یکی از مقدارهای یک هش-مپ در atom

clojure
clojurescript

#21

بله منم همینو عرض کردم اما موضوع سر این بود که خود اتم mutate میشه نه اون مقداری که بایند میکنیم. انگار اینجا اصلا موضوع ریبایند کردن نیست و تغییر مستقیم روی java object انجام میشه.


#22

اگر تغییر دیتا ساده باشه که دیگه tread safe نیست،
بازم در مورد خوب بودن اون روش باید بگم که چون از anonymous function استفاده کردین و mutate کردن اتم به صورت explicit و فقط در یک جا اونم به صورت کاملا شفاف صورت گرفته، بنظر من روش خوبیه، حالا مگر اینکه سمیر نظر دیگه ای داشته باشه یا روش مناسبتری بدونه،‌به هر حال سمیر خیلی بیشتر من کلوژر اونم در prod کار کرده.


#23

state قبلی به صورت ارگومنت به تابع بعدی وارد کن و state جدید درست کن


#24

Think functional :slight_smile:


#25

مطمئن نیستم کار درستی باشه.
صدتا تابع باید همیشه یه آرگومان اضافی با خودشون حمل کنن چون یکیشون میخواد یه تغییر توش بده! که اونم تغییر توی دیتا نیست و کپی گرفتن از دیتا و بایند کردن به همون اسم قبلیه!

من مثلا دارم امتیازی که کاربر توی این بازی کسب کرده رو نگه میدارم و یه وقتی وسط یکی از اون ۱۰۰تا تابع میخوام +5 کنم.
اگه میخواستم (مثلا) وضعیت زمین شطرنج توی هر حرکت رو نگه دارم و بعدا بتونم برگردم به اون مرحله و از اونجا ادامه بدم، اونوقت استفاده از دیتاتایپ های immutable کمک خیلی بزرگی بهم میکرد.
ولی توی این سناریویی که توش هستم فقط کار رو سخت میکنه.

تقریبا همیشه با این جمله موافقم.
ولی هیچ‌چیز مطلق نیست. نمیشه گفت توی ۱۰۰٪ سناریوها pure function بهترین گزینست.
واقعا نمیشه همه چیز رو با immutability حل کرد. یه وقتایی (مثل همین موردی که گفتم) فقط خودآزاریه.


#26

اینکه صد تا function بهم با یک state مرتبط هستند خودش مشکل اصلی شماست سیستم های خیلی پیچیده با این روشی که صحبت میکنم طراحی شدند
حفظ عدد که ساده هست با این حال شما کاری انجام بده که خودت باهاش راحتی


#27

فقط یه فانکشن با اون stateها کار داره ولی اگه بخوام immutable کار کنم اونوقت همشون باید اون دیتا رو رد و بدل کنن تا برسه به اون تابع. منظور من این بود.

مساله اینه که نمیخوام کاری که باهاش راحتم رو انجام بدم. میخوام کار صحیح رو انجام بدم.
بارها توی جاهای مختلف جملاتی شبیه اینو خوندم «برای نگهداری state از اتم استفاده میشه» برای همینه که فکر میکنم درست باشه.

من الآن دارم یه پروژه‌ای که توی react ساخته شده رو با cljs/figwheel/re-agent پیاده سازی میکنم. چیزهایی که توی اون پروژه‌ی react به صورت mutable هستن یکیش اینه. (تقریبیا همه‌چی تو اون پروژه immutable هست)


#28

من منظورم اینکه اگه این همه باید داده رد و بدل بشه نشان دهنده یک مشکل در طراحی برنامه هست
به صورت ایده عال بیش از دو یا سه فانکشن نباید با این state کاری داشته باشن و این درصورت immutable کردن state که عرض کردم


#29

خوب الآن که فقط یه تابع داره با state کار میکنه.
اگه بخوام از atom استفاده نکنم باید همشون اون دیتا رو پاس‌کاری کنن.


#30

این که باید ردوبدل کنید مشکل طراحی نشون میده


#31

یکیمون منظور نفر مقابلو متوجه نمیشه.


#32

شما فرمودید که اگر از اتم استفاده کنید باید تمام توابع داده پاس بدن به هم، من عرضم اینکه این نشون میده طراحی مشکل داره چون تمام توابع coupling به state دارن درصورت استفاده از اتم و immutability کامل نباید بیش از دو سه فانکشن state رو پاس بدن یا اصلا کاری کنن


#33

خوب clojure-script داره توی بروزر اجرا میشه.
با onclick کار میکنه. وقتی کاربر روی یه چیزی کلیک کنه، یه تابع صدا زده میشه مثلا امتیاز کاربر توی بازی +5 میشه.
اون تابع از کجا باید بدونه قبلا امتیاز کاربر چند بوده؟
هیچ راهی بجز استفاده از atom به ذهنم نمیرسه.


#34

هر کلیک میتونه یک event ارسال کنه با مقدار امتیاز برای اون کلیک
بعد امتیاز کاربر مجموع امتیاز event ها باشه
Observer ها در rxjs و … این گونه کار میکنند


#35

منظور سام دقیقا این بود که تغییری در دیتا ایجاد نکنیم و بنظر من کار بسیار درستیه،
پیشنهاد میکنم کمی از واژه تغییر دور بشین که موضوع بهتر جای خودشو در طراحی شما پیدا کنه


#36

نمیدونم چطور باید به این روش کار کرد.


#37

کجاش بیشتر نامفهومه؟


#38

در ضمن روش swap! هم مشکلی ایجاد نمیکنه


#39

من پاسخ آخر آقای سام رو متوجه نشدم و حس میکنم به خاطر تجربه‌ی کمم توی کار با immutableهاست. به خاطر همین دیگه بیشتر سوال نکردم.
و این اولین تجربم توی استفاده از atom در کلوژره. تا قبل از این همیشه immutable کار میکردم و توی این مورد خاصی که توش هستم نفهمیدم چطوری میشه از اتم استفاده نکرد.

بله. خیلی هم عالی داره کار میکنه. با تشکر از re-agent که خودش وظیفه‌ی آپدیت کردن کامپوننت‌هایی که atom توش استفاده شده رو به عهده گرفته و کار اضافه‌ای نباید انجام بدم (تنها فرق atomهای re-agent با atomهای خود cljs توی همین مورده. بر اساس داکیومنت آفیشال (پاراگراف Managing state in Reagent))
ولی هدفم یاد گرفتن و تصحیح روش فکریمه.


#40

اگر خیلی خیلی خیلی به برنامه نویسی فانکشنال علاقه داری سعی کن مدتی با هسکل یا الیکسر هم کار کنی و حتما باعث میشه که کلوژر رو هم بهتر درک کنی.
کلا به بنظر من خیلی خوبه که هر برنامه نویسی هسکل یاد بگیره چون خیلی به درست فکر کردن کمک میکنه.