توابع خالص و ناخالص

توابع خالص Pure Function به تابعی گفته میشود که هر بار با یک دسته ورودی خوانده بشه دقیقا همون خروجی رو بده بدون هیچ تغییر در محیط

در مثال function اول خالص و function ناخالص چون function اول برای یه نوع input یه خروجی داره و محیط هم عوض نمیکنه
(به دیتابیس یا فایل یا سیستم دیگه دست نمیزنه
در functional programming سعی براینه که اکثر تابع ها خالص باشند

5 پسندیده

اگر side effect بدون دريافت ورودى باشه چى؟ :wink::wink::wink:

1 پسندیده

هر نوع side effect تابع رو ناخالص میکنه به همین خاطر عرض کردم بدون تغییر محیط

3 پسندیده

@samdvr عزیز . اول تشکر بخاطر اینکه همیشه در حال کمک کردن هستید .

فقط من کامل نفهمیدم . این موضوع رو می شه کمی بیشتر توضیح بدید. یا با یک مثال کاربردی تو یک پروژه واقعی ؟
تشکر

1 پسندیده

درمثال اول قسمت های خالص و ناخالص همه از همدیگه نامشخص هستند در مثال بعدی من قسمت ها یی که میشه خالص باشند و در متد های جدا نوشتم اگر توجه کنید خواندن یا نوشتن از دیتابیس چون حالت محیط و عوض میکنه side effect به حساب میاد
ولی متد. های دیگه همه خالص هستند و برای ورودی همیشه همان خروجی و میدن
باید وقتی به خلوص فانکشن فکر میکنید فرض ریاضی از توابع داشته باشید یعنی اگر هرجا در برنامه به جای فراخوانی فانکشن اگر محتوای فانکشن و بذاریم برنامه بدون تغییر کاذ میکنه این خاصیت توابع خالص و referential transparency میگن

2 پسندیده

پس purity بيشتر به side effect مربوط ميشه :wink:

1 پسندیده

pure function به تعریف بدون side effect هست

1 پسندیده

works for me

1 پسندیده

عالی بود . این از اون دسته مطالب بود تو نت پیدا نکرده بودم واقعا ممنون

بله، جالبه، و خوبه بدونيد كه برنامه نويس ها سعى ميكنن تا اونجايى كه ميشه فانكشن ها رو pure طراحى كنن و كمترين اثار جانبى ممكن يا همون side effect رو در نرمافزار داشته باشند. اما اثرات جانبى در علم كامپيوتر معنى متفاوتى داره و يعنى ايجاد تغيير در يك آبجكت خارج از فضاى جريان يك پروسس يا فانكشن.
مثل ذخيره يا حذف داده ها در ديتابيس، و يا تغير در اتريبيوت هاى يك آبجكت، يا نوشتن در خروجى ترمينال با مثلا puts.
هرچى side effect كمتر باشه برنامه خواناتر و سريعتر و قابل نگهدارى تر هست.
اما برنامه بدون side effect عملا به هيچ دردى نميخوره چون كارى انجام نميده و مثل زنبور بى عسل ميمونه😀.
پس بحث از كم كردن side effect هست نه نداشتنش.

3 پسندیده

بله شما درست میفرمایید درfunctional programming هدف این نیست که اصلا side effect نداشت بلکه side effect اشکار و مشخص دربرنامه باشه .هدف اینه که منطق اصلی برنامه به صورت توابع خالص در مرکز کد باشه و side effect ها مثل تغییر دیتابیس در لایه بیرونی این روش functional core, imparative shell هم گفته میشه
اگر توجه کنید توابع خالص به خاطر اینکه با دنیای خارج کاری ندارند stateless هستند و به اسانی تست میشن

3 پسندیده

فكر كنم ما داريم حرف مشابهى ميزنيم

3 پسندیده

و نكته ديگه اى كه وجود داره اينه كه stateless بودن در concurrency از race conditions جلوگيرى ميكنه

1 پسندیده

پس هدف اصلی اینطور که متوجه شدم اینه که منطق خالص جدا باشه و بدون تغییر در محیط محاسباتو انجام بده و توابعی که قراره تو محیط تغییری ایجاد بدن جدا باشن؟مثلا صفحه بندی اگه دو تا تابع داشته باشیم تابع اول فقط فرمول صفحه بندی رو با ریاضیات حل کنه و تابع دوم بر اساس کار تابع اول داده ها رو صفحه بندی کنه آیا میشه گفت تابع اول pure function هست و تابع دوم ناخالص؟
در ضمن اگر از یک تابع خالص در داخل یک تابع خالص دیگه استفاده کنیم آیا بازم خالصه یا صدا زدن تابع داخلش هرچند pure هم باشه بازم side effect محسوب میشه؟

من اینو اصلا نمیدونستم خیلی برام جالب بود اما جالبترش این بود که بااینکه نمیدونستم در اکثریت کدهام همیشه محاسبات ریاضی رو کاملا جدا نگه میداشتم تا بعدا راحتتر تغییرات بدم.
این مبحث صرفا مربوط ب functional هست یا ربطی نداره؟
این مبحث در برنامه های سیستمی و دسکتاپ هم رعایت میشه؟مثلا برای یه سیستم عامل یا مثلا برنامه ریکاوری فایل

منظور شما رو از رعايت شدن متوجه نشدم اما متدهاى pure ربطى به نوع زبان ندارند

1 پسندیده

Pure بودن ربطى به اين نداره كه چه متدى كجا استفاده بشه، اگر متدى side effect داشته باشه ديگه خالص نيست

1 پسندیده

این مبحث صرفا مربوط به functional programming نیست و در هر زبانی با درک این مطلب کد بهتر میشه نوشت در functional programming به توابع خالص تاکیید بیشتری میشه

1 پسندیده

سلام . تو الکسیر with دقیقا چی هست؟

يك نوع عبارت شرطيه براى چك كردن يك زنجيره از احتمالات، يكى از جاهايى كه with خيلى به كار مياد در مديريت خطا يا همون error handling است. اگر اشتباه نكنم دوست خوبمون @shahryarjb در اين مورد توضيح داده بود.
لينك زير خيلى خوب اين مطلب رو عنوان كرده و اگر جايى نا مفهوم بود بپرسيد

2 پسندیده