توابع خالص Pure Function به تابعی گفته میشود که هر بار با یک دسته ورودی خوانده بشه دقیقا همون خروجی رو بده بدون هیچ تغییر در محیط
در مثال function اول خالص و function ناخالص چون function اول برای یه نوع input یه خروجی داره و محیط هم عوض نمیکنه
(به دیتابیس یا فایل یا سیستم دیگه دست نمیزنه
در functional programming سعی براینه که اکثر تابع ها خالص باشند
درمثال اول قسمت های خالص و ناخالص همه از همدیگه نامشخص هستند در مثال بعدی من قسمت ها یی که میشه خالص باشند و در متد های جدا نوشتم اگر توجه کنید خواندن یا نوشتن از دیتابیس چون حالت محیط و عوض میکنه side effect به حساب میاد
ولی متد. های دیگه همه خالص هستند و برای ورودی همیشه همان خروجی و میدن
باید وقتی به خلوص فانکشن فکر میکنید فرض ریاضی از توابع داشته باشید یعنی اگر هرجا در برنامه به جای فراخوانی فانکشن اگر محتوای فانکشن و بذاریم برنامه بدون تغییر کاذ میکنه این خاصیت توابع خالص و referential transparency میگن
بله، جالبه، و خوبه بدونيد كه برنامه نويس ها سعى ميكنن تا اونجايى كه ميشه فانكشن ها رو pure طراحى كنن و كمترين اثار جانبى ممكن يا همون side effect رو در نرمافزار داشته باشند. اما اثرات جانبى در علم كامپيوتر معنى متفاوتى داره و يعنى ايجاد تغيير در يك آبجكت خارج از فضاى جريان يك پروسس يا فانكشن.
مثل ذخيره يا حذف داده ها در ديتابيس، و يا تغير در اتريبيوت هاى يك آبجكت، يا نوشتن در خروجى ترمينال با مثلا puts.
هرچى side effect كمتر باشه برنامه خواناتر و سريعتر و قابل نگهدارى تر هست.
اما برنامه بدون side effect عملا به هيچ دردى نميخوره چون كارى انجام نميده و مثل زنبور بى عسل ميمونه😀.
پس بحث از كم كردن side effect هست نه نداشتنش.
بله شما درست میفرمایید درfunctional programming هدف این نیست که اصلا side effect نداشت بلکه side effect اشکار و مشخص دربرنامه باشه .هدف اینه که منطق اصلی برنامه به صورت توابع خالص در مرکز کد باشه و side effect ها مثل تغییر دیتابیس در لایه بیرونی این روش functional core, imparative shell هم گفته میشه
اگر توجه کنید توابع خالص به خاطر اینکه با دنیای خارج کاری ندارند stateless هستند و به اسانی تست میشن
پس هدف اصلی اینطور که متوجه شدم اینه که منطق خالص جدا باشه و بدون تغییر در محیط محاسباتو انجام بده و توابعی که قراره تو محیط تغییری ایجاد بدن جدا باشن؟مثلا صفحه بندی اگه دو تا تابع داشته باشیم تابع اول فقط فرمول صفحه بندی رو با ریاضیات حل کنه و تابع دوم بر اساس کار تابع اول داده ها رو صفحه بندی کنه آیا میشه گفت تابع اول pure function هست و تابع دوم ناخالص؟
در ضمن اگر از یک تابع خالص در داخل یک تابع خالص دیگه استفاده کنیم آیا بازم خالصه یا صدا زدن تابع داخلش هرچند pure هم باشه بازم side effect محسوب میشه؟
من اینو اصلا نمیدونستم خیلی برام جالب بود اما جالبترش این بود که بااینکه نمیدونستم در اکثریت کدهام همیشه محاسبات ریاضی رو کاملا جدا نگه میداشتم تا بعدا راحتتر تغییرات بدم.
این مبحث صرفا مربوط ب functional هست یا ربطی نداره؟
این مبحث در برنامه های سیستمی و دسکتاپ هم رعایت میشه؟مثلا برای یه سیستم عامل یا مثلا برنامه ریکاوری فایل
این مبحث صرفا مربوط به functional programming نیست و در هر زبانی با درک این مطلب کد بهتر میشه نوشت در functional programming به توابع خالص تاکیید بیشتری میشه
يك نوع عبارت شرطيه براى چك كردن يك زنجيره از احتمالات، يكى از جاهايى كه with خيلى به كار مياد در مديريت خطا يا همون error handling است. اگر اشتباه نكنم دوست خوبمون @shahryarjb در اين مورد توضيح داده بود.
لينك زير خيلى خوب اين مطلب رو عنوان كرده و اگر جايى نا مفهوم بود بپرسيد