توابع خالص و ناخالص در برنامهنویسی تابعگرا
در برنامهنویسی تابعگرا (Functional Programming)، یکی از مفاهیم کلیدی توابع خالص (Pure Functions) و توابع ناخالص (Impure Functions) هستند. درک تفاوت این دو نوع تابع، به شما کمک میکند تا برنامههایی قابل پیشبینیتر، قابل تستتر و گاهی سریعتر بنویسید.
تعریف تابع خالص
تابع خالص، تابعی است که همیشه برای ورودیهای یکسان، خروجی یکسانی تولید میکند و هیچ عوارض جانبی (side effect) ندارد. منظور از عوارض جانبی، تغییر وضعیت سیستم خارج از تابع مانند تغییر متغیرهای سراسری، چاپ روی صفحه، نوشتن روی فایل و ... است.
def pure_function(x, y):
result = x + 2*y
return result / (2*x + y)
این تابع خالص است، زیرا فقط به ورودیهای خود وابسته است و هیچ چیز خارج از خودش را تغییر نمیدهد.
تعریف تابع ناخالص
تابع ناخالص، تابعی است که ممکن است رفتار آن وابسته به عواملی خارج از پارامترهای ورودیاش باشد یا حالتی از برنامه را تغییر دهد (عوارض جانبی ایجاد کند).
some_list = []
def impure_function(arg):
some_list.append(arg)
در این مثال، تابع باعث تغییر لیستی خارج از خودش میشود، بنابراین ناخالص است.
مقایسه توابع خالص و ناخالص
ویژگی | توابع خالص | توابع ناخالص |
---|---|---|
خروجی یکنواخت برای ورودی یکسان | بله | خیر |
عوارض جانبی | ندارد | دارد |
قابل تست بودن | بسیار آسان | سختتر |
قابل استفاده در محاسبات موازی | بله | معمولاً خیر |
نمونهای از کاربرد | محاسبه فاکتوریل، فیلتر دادهها، توابع ریاضی | خواندن/نوشتن فایل، ارتباط با پایگاه داده، چاپ روی صفحه |
کاربرد توابع خالص
توابع خالص معمولاً در الگوریتمهای ریاضی، تحلیل دادهها، فیلتر و نگاشت (map/filter) استفاده میشوند. آنها را میتوان cache کرد (memoization)، چون خروجیشان همیشه ثابت است.
کاربرد توابع ناخالص
توابع ناخالص در عملیاتهایی ضروری هستند که نیاز به تعامل با محیط دارند، مثل کار با فایلها، شبکه، پایگاهداده، یا حتی تعامل با کاربر (مانند input و print).