آموزش CallBack Functions در جاوا اسکریپت
اگر در حوزه فرانت اند و برنامه نویسی جاوا اسکریپت فعالیت داشته باشید احتمالا “جهنم کال بک“ را شنیده اید. می خواهیم کمی در مورد کال بک ها و جهنمی که ممکن است برایتان درست کند توضیح دهیم.
اصطلاح “جهنم callback” به زبان انگلیسی “Callback hell” یا “Pyramid of Doom” است و به مشکلاتی که در برنامهنویسی ناهمگام با استفاده از توابع بازگشتی (Callback Functions) پیش میآید، اشاره دارد.
این مشکل اغلب به دلیل تودرتویی بیش از حد بین توابع بازگشتی (Callback Functions) و تعداد زیادی از nested callback ها به وجود میآید. وقتی در یک برنامه، تعداد زیادی از nested callback ها وجود داشته باشد، کد قابل خواندن نخواهد بود و به سختی قابل پشتیبانی و توسعه خواهد بود.
برای رفع این مشکل، میتوان از روش های دیگری مانند Promise ها، async/await، RxJS یا event-driven programming استفاده کرد. این روشها به برنامهنویسان کمک میکنند که با کمترین استفاده از توابع بازگشتی (Callback Functions)، کدی را به شکل همروند و خوانا ایجاد کنند.
تعریف Callback چیست
تابع callback در برنامهنویسی، یک تابع است که به عنوان ورودی به یک تابع دیگر ارسال می شود و هنگامی که تابع اصلی کار خود را به پایان میرساند، تابع callback فراخوانی می شود. این فراخوانی با هدف پردازش نتیجهٔ بازگشتی تابع اصلی انجام میشود.
توابع callback در برنامهنویسی ناهمگام (asynchronous programming) بسیار کاربردی هستند و به برنامهنویسان اجازه میدهند که کدهای خود را به صورت همروند و ناهمگام اجرا کنند. به عبارت دیگر، توابع callback به برنامهنویسان این امکان را میدهند که کد خود را به شکلی غیر قطعی و بسیار منعطف به صورت ناهمگام اجرا کنند و در حین اجرای کد، به رویدادهای مختلف و ورودیهای کاربر پاسخ دهند.
توابع callback به صورت گستردهای در زبان های برنامهنویسی مانند جاوااسکریپت و پایتون استفاده میشوند و یکی از الگوهای شیءگرا (Object-Oriented) در برنامهنویسی ناهمگام را تشکیل میدهند.
سبک برنامه نویسی همگام و ناهمگام که با کلمات کلیدی async و sync که سر واژه های کلمات “هم زمان یا Synchronous” و همچنین “غیر هم زمان یا Asynchronous” می باشند. مواقعی که میخواهیم کد ها و توابع بصورت همزمان و بصورت کاملا مستقل از هم اجرا شوند و با هم تداخلی نداشته باشند و یکی منتظر نتیجه تابع دیگری نماند از این امکان استفاده خواهیم کرد.
تابع Callback به تابعی گفته می شود که از طریق یک تابع دیگر صدا زده می شود و در صورتی این اتفاق می افتد که تابع اول کارش را انجام داده و تمام شده باشد.
حال این را در نظر بگیرید که توابع زیادی روی هم تعریف شوند که هر کدام وابسته به تابع دیگری باشند که خود آن نیز به تابع دیگری نیاز دارد و باید منتظر اتمام کار آن تابع باشد، به همین صورت که حتی در یک جمله هم خواننده را گیج می کند چه برسد. به این اتفاقی که ممکن است در آن گیر کنیم و درگیر آن شویم جهنم کال بک می کویند.
در جاوا اسکریپت هیچ چیز خاصی به نام Callback Hell وجود ندارد. این چیزی نیست جز یک نام و اصطلاحی که معروف شاده است. چیزی که ممکن است توسعه دهنده در آن بیفتد و گیر کند، جهنم کال بک نوع کد نویسی ای است که موقع نوشتن کدی است که شامل چندین توابع ناهمزمان است که به یکدیگر متصل هستند، به عنوان مثال:
getData1(function(x){
getData2(x, function(y){
getData3(y, function(z){
…
});
});
});
دلیل این امر این است که ” نتایج ” هر تابع بستگی به موارد قبلی دارد. کلمه ناهمزمان به معنای چیزی است که بعدا اتفاق می افتد.
توابع بازگشتی (Callback Function) مفاهیم پایه
توابع بازگشتی (Callback Function) در برنامهنویسی به عنوان یک الگوی شیگرا برای پاسخگویی به رویدادها و فعالیتهای ناهمگام استفاده میشوند. در این الگو، تابع callback به عنوان یک پارامتر به یک تابع دیگر ارسال میشود که مجموعهٔ دستورالعملهایی هستند که در صورت رخدادن رویداد، اجرا خواهند شد.
برای مثال، در جاوااسکریپت، توابع بازگشتی (Callback Functions) به طور گستردهای در برنامهنویسی ناهمگام و رویدادگرا به کار میروند. در این حالت، یک تابع callback به عنوان ورودی به تابع دیگری، مانند setTimeout ()، addEventListener () یا XMLHTTPRequest، ارسال میشود. وقتی رویداد مورد نظر رخ میدهد، تابع callback فراخوانی میشود و دستورالعملهای آن اجرا میشوند.
توابع بازگشتی (Callback Functions) به عنوان یک الگوی کلیدی در برنامهنویسی ناهمگام و رویدادگرا تلقی میشوند. این توابع به برنامهنویسان اجازه میدهند تا کد خود را به شکل همروند و ناهمگام اجرا کنند، بدون اینکه نیاز به استفاده از روشهای سنتی همچون threading یا multiprocessing داشته باشند.
چطور از توابع بازگشتی (Callback Functions) در کد خود استفاده کنیم
توابع بازگشتی در برنامه نویسی به عنوان توابعی استفاده میشوند که به عنوان آرگومان ورودی یک تابع دیگر به آن پاس داده میشوند. این توابع به صورت خودکار در زمان مشخصی فراخوانی میشوند و نتایج حاصل از آنها به تابع اصلی منتقل میشود.
برای استفاده از توابع بازگشتی، ابتدا تابع مورد نظر را تعریف کرده و سپس آن را به عنوان آرگومان ورودی به تابع دیگری که میخواهید از آن استفاده کنید، پاس دهید. در ادامه، با یک مثال ساده توضیح می دهم:
در این مثال، تابع print_numbers یک عدد صحیح و یک تابع بازگشتی به عنوان ورودی دریافت میکند. سپس با استفاده از یک حلقه for، تابع بازگشتی را برای اعداد صفر تا n-1 صدا میکند و به عنوان آرگومان به آن عدد را پاس میدهد. در نهایت، تابع print_numbers با اجرای تابع بازگشتی به هر عدد، با استفاده از تابع print_double، آن عدد را دو برابر میکند و خروجی مورد انتظار به شکل زیر خواهد بود:
۰
۲
۴
۶
۸
با استفاده از توابع بازگشتی میتوانید کد خود را قابل توسعهتر و قابل استفاده مجدد تر کنید، زیرا میتوانید توابع بازگشتی مختلفی را به عنوان آرگومان ورودی به یک تابع دیگر پاس داده و از آنها در زمان اجرا استفاده کنید.
توابع بازگشتی (Callback Functions) در جاوااسکریپت
توابع بازگشتی، توابعی هستند که در داخل خود فراخوانی میشوند و از طریق این بازگشت، به خود بازمیگردند. در جاوااسکریپت، میتوانید از توابع بازگشتی استفاده کنید برای حل مسائلی که برای حل آنها نیاز به فراخوانی تکراری توابع دارید.
برای ایجاد یک تابع بازگشتی در جاوااسکریپت، شما میتوانید از دو رویکرد استفاده کنید:
۱. روش بازگشتی مستقیم
در این روش، تابع بازگشتی در داخل خود فراخوانی میشود و تا زمانی که شرط مشخص شده برقرار باشد، به خود بازمیگردد. به عنوان مثال، تابع زیر را در نظر بگیرید که عدد n را به عنوان ورودی دریافت میکند و مجموع اعداد از ۱ تا n را محاسبه میکند:
این تابع به طور بازگشتی فراخوانی میشود و اعداد را از n تا ۱ جمع میکند.
۲. روش بازگشتی غیرمستقیم
در این روش، تابع بازگشتی در داخل یک تابع دیگر فراخوانی میشود. به عنوان مثال، تابع زیر را در نظر بگیرید که یک آرایه از اعداد صحیح را به عنوان ورودی دریافت میکند و بزرگترین عدد را در آرایه پیدا میکند:
تابع `compare` در داخل `findMax` فراخوانی میشود و به طور بازگشتی اعداد آرایه را بررسی میکند تا بزرگترین عدد را پیدا کند.
به طور کلی، تابع بازگشتی برای حل مسائلی که نیاز به فراخوانی تکراری دارند، بسیار قابل استفاده هستند. با این حال، شما باید مطمئن شوید که تابع شما در دستگاه های کوچک و با محدودیت منابع مانند گوشیهای هوشمند اجرا می شود و منابع سیستم را به خوبی مدیریریت می کند.
مهارت توابع بازگشتی (Callback Functions) در پایتون
توابع بازگشتی در پایتون، به توابعی گفته میشود که به عنوان آرگومان ورودی به توابع دیگر فرستاده میشوند و در داخل توابع دیگر اجرا میشوند. این توابع، یکی از مفاهیم مهم برنامه نویسی شیءگرا هستند و در زبان پایتون نیز به راحتی قابل استفاده هستند.
برای استفاده از توابع بازگشتی در پایتون، ابتدا باید تابعی را تعریف کنید که میخواهید به عنوان تابع بازگشتی به آن ارسال شود. سپس، در داخل تابعی دیگر، میتوانید از تابع بازگشتی استفاده کنید.
یک مثال از تابع بازگشتی در پایتون به شکل زیر است:
این تابع، عدد n را به عنوان ورودی دریافت میکند و با استفاده از تابع بازگشتی، مقدار فاکتوریل آن را محاسبه میکند. در هر مرحله، تابع به صورت بازگشتی فراخوانی میشود و به مراحل قبل برمیگردد تا نتیجه نهایی را بدست آورد.
همچنین، توابع بازگشتی میتوانند به عنوان یک کالبک نیز استفاده شوند. به عنوان مثال، تابع زیر را در نظر بگیرید:
این تابع، یک لیست از اعداد و یک تابع را به عنوان ورودی دریافت میکند و تابع ورودی را روی هر عدد از لیست اعمال میکند. در اینجا، تابع ورودی به عنوان یک کالبک در نظر گرفته میشود، زیرا برای اعمال تابع روی هر عدد، تابع ورودی باید به عنوان یک آرگومان به تابع apply_function ارسال شود.
با استفاده از توابع بازگشتی، میتوانید کدهای پایتون خود را به صورت سادهتر و قابل فهمتری نوشته و از زمان و تلاش بیشتری در برنامهنویسی جلوگیری کنید.
توابع بازگشتی (Callback functions) در مقایسه با Promises
توابع بازگشتی و Promises هر دو برای مدیریت فرآیندهای ناهمگام در جاوااسکریپت استفاده میشوند. اما بهترین روش، به وابستگی های پروژه و نیازهای شما بستگی دارد.
توابع بازگشتی
زمانی که تعداد کمی فرآیند ناهمگام در پروژه دارید، استفاده از توابع بازگشتی به صورت ساده و قابل فهم است.
توابع بازگشتی خوانایی بالاتری دارند و برای تدوین کد ساده مناسب هستند.
اگر برای فرآیندهای ناهمگام بسیار عمیق شوید، کد تابع بازگشتی شما ممکن است پیچیده شود و این باعث کاهش خوانایی کد و دشواری برای ادامه کار میشود.
Promises
زمانی که بیشتر یا تمام فرآیندهای پروژه شما ناهمگام است، Promises بهترین گزینه هستند.
Promises به طور کلی از توابع بازگشتی خطاهای بیشتری برای پیاده سازی دارند، به ویژه در مواردی که چندین فرآیند ناهمگام در پروژه وجود دارد.
Promises ، کمک میکنند که خطاها را بهتر مدیریت کنید چرا که شما میتوانید کدهای خطا را به صورت جداگانه از کد اصلی نوشته و آنها را در صورت لزوم مدیریت کنید.
Promises به وسیله .then() و .catch() قابل مدیریت هستند و خروجی آن ها به صورت خطی و منظم است که برای کدنویسان و نگهداری ساده است.
در کل، استفاده از Promises یا توابع بازگشتی به وابستگیهای پروژه و نیازهای شما بستگی دارد. اگر پروژه شما دارای تعدادی فرآیند ناهمگام ساده است، استفاده از توابع بازگشتی بهترین گزینه است. اما اگر پروژه شما دارای فرآیندهای ناهمگام پیچیده و بسیاری است، Promises ممکن است بهترین گزینه باشد.
بهترین روش ها برای استفاده از توابع بازگشتی (Callback Functions) در توسعه وب مدرن
استفاده از توابع بازگشتی (Callback Functions) در توسعه وب مدرن، به دلیل تغییرات پویا در وب و تکنولوژی های مرتبط با آن، بسیار رایج شده است.
در ادامه بهترین روش های استفاده از توابع بازگشتی در توسعه وب مدرن را بررسی می کنیم:
استفاده از تابع بازگشتی به عنوان کالبک در توابع ناهمگام:
توابع بازگشتی می توانند به عنوان کالبک ها در توابع ناهمگام مورد استفاده قرار گیرند. این کار، برای مدیریت فرآیندهای ناهمگام و جلوگیری از بروز خطاهای پویا بسیار حائز اهمیت است.
استفاده از توابع بازگشتی برای طراحی صفحات بارگذاری دینامیک:
توابع بازگشتی می توانند به راحتی برای طراحی صفحات بارگذاری دینامیک مورد استفاده قرار گیرند. مثلا برای ساخت درخت منو، که با کلیک روی هر آیتم به صورت بازگشتی لیست فرزندان آن را نمایش میدهد.
استفاده از توابع بازگشتی برای پیاده سازی الگوریتم های محاسباتی:
توابع بازگشتی برای پیاده سازی الگوریتم های محاسباتی مانند جستجوی عمق اول، جستجوی عمق دوم و … بسیار مناسب هستند.
استفاده از توابع بازگشتی برای مدیریت داده های با ساختار درختی:
توابع بازگشتی برای مدیریت داده های با ساختار درختی مورد استفاده قرار می گیرند. این شامل داده هایی مانند JSON، XML و HTML میشود.
استفاده از توابع بازگشتی در پیاده سازی الگوریتم های بازگشتی:
توابع بازگشتی برای پیاده سازی الگوریتم های بازگشتی مانند ترکیبات، جایگشت و … بسیار مناسب هستند.
استفاده از توابع بازگشتی برای پیاده سازی الگوریتم های نویددهنده:
توابع بازگشتی می توانند برای پیاده سازی الگوریتم هایی که به صورت نویددهنده عمل می کنند، مانند شبکه های عصبی، مورد استفاده قرار گیرند.
در کل، توابع بازگشتی در توسعه وب مدرن بسیار رایج هستند و میتوانند برای مدیریت فرآیندهای ناهمگام و پیاده سازی الگوریتم های بازگشتی، محاسباتی و نویددهنده، استفاده از توابع بازگشتی بسیار مناسب است. همچنین در طراحی صفحات بارگذاری دینامیک و مدیریت دادههای با ساختار درختی، توابع بازگشتی به خوبی عمل میکنند.
راهنمایی ها و ترفندهای توابع بازگشتی (Callback Functions) در Node.js
توابع بازگشتی (Callback Functions) در Node.js بسیار مهم هستند و به طور گسترده در بسیاری از کدنویسیها استفاده می شوند .
استفاده از Promise
برای جلوگیری از callback hell و پیچیدگی کدها می توان از Promise ها به جای توابع بازگشتی استفاده کرد.
Async/Await
یکی دیگر از راه حل هایی که برای جلوگیری از callback hell در Node.js وجود دارد، استفاده از Async/Await است. این روش، امکان استفاده از کدهای نوشته شده به صورت سنکرونیزه را فراهم می کند.
استفاده از تابع forEach
در صورتی که شما می خواهید یک آرایه را برای تک تک عناصر آن پیمایش کنید، می توانید از تابع forEach استفاده کنید. این تابع، برای اجرای عملیات روی هر عنصر آرایه به صورت تک تک و بدون نیاز به تعریف یک عدد پارامتر به کار میرود.
تابع map
برای تبدیل و یا جمعآوری دادهها در یک آرایه، میتوان از تابع map استفاده کرد. این تابع برای تبدیل هر عنصر آرایه به یک داده دیگر و ذخیره آن در یک آرایه جدید، به صورت بازگشتی بکار میرود.
تابع filter
تابع filter برای فیلتر کردن عناصر یک آرایه براساس یک شرط خاص استفاده میشود.
تابع reduce
تابع reduce برای اعمال یک تابع به هر عنصری از یک آرایه و انجام یک محاسبه بازگشتی بر روی این عناصر به کار میرود.
در کل، توابع بازگشتی در Node.js بسیار مهم هستند و به طور گسترده در توسعه نرم افزارهای جاوا اسکریپت استفاده می شوند. استفاده از Promise ها، Async/Await و توابع forEach، map، filter و reduce میتوانند به شما در پیاده سازی بهتر کد با کمترین پیچیدگی کمک کنند.
مزایا و محدودیت های توابع بازگشتی (Callback Functions) در طراحی نرم افزار
البته توابع بازگشتی (Recursion) و توابع Callback دو نوع متفاوت از توابع در برنامهنویسی هستند. در ادامه به بیان مزایا و محدودیتهای هر کدام اشاره میکنم:
مزایای توابع بازگشتی
-امکان پیاده سازی الگوریتم های پیچیده: با استفاده از توابع بازگشتی، میتوان عملیاتهای پیچیده را با سطوح گوناگونی از پیچیدگی پیادهسازی کرد.
-کد قابل فهم: استفاده از توابع بازگشتی باعث شده کد خوانا و فهمیدنی باشد.
-امکان ردگیری اجرای کد: با استفاده از توابع بازگشتی، میتوان به طور مستقیم به نقطهای در اجرای برنامه دسترسی پیدا کرد.
محدودیت های توابع بازگشتی
-مشکلات حافظه: توابع بازگشتی ممکن است در برخی موارد در حافظه چرخههای بیپایانی ایجاد کنند که باعث افزایش استفاده از حافظه و یا کرش شدن برنامه شوند.
-رفتار غیرقابل پیش بینی: در صورتی که توابع بازگشتی به درستی پیاده سازی نشود، ممکن است با یک نوع رفتار غیر قابل پیشبینی مواجه شوید.
-کارآیی: در برخی موارد، توابع بازگشتی ممکن است باعث کاهش کارایی برنامه شوند.
مزایای توابع Callback
-جداسازی کد و فراخوانی: با استفاده از توابع Callback، میتوانید کد را از فراخوانی جدا کنید. این کار باعث حفظ یکپارچگی و قابلیت خوانایی کد میشود.
-امکان پیادهسازی الگوی Observer: توابع Callback امکان پیادهسازی الگوی Observer را فراهم میکنند که در بسیاری از برنامههای ردهبندی شده به عنوان الگوی طراحی استفاده میشود.
-قابلیت استفاده از توابع ناشناس: با استفاده از توابع Callback، میتوانید توابع ناشناس و مخفی را پیادهسازی کنید.
محدودیت های توابع Callback
-پیچیدگی کد: استفاده از توابع Callback ممکن است در برخی موارد باعث افزایش پیچیدگی کد شود.
-خطرات امنیتی: استفاده از توابع Callback در صورتی که متغیرهای آن به جایگاه دیگری از کد منتقل شوند، ممکن است باعث به وجود آمدن خطرات امنیتی شود، اما میتوان با اتخاذ تدابیر امنیتی مناسب، این خطرات را کاهش داد.
لازم به ذکر است که هر دو نوع توابع (Recursion و Callback) در برنامهنویسی کاربرد دارند و مزایا و محدودیتهای خود را دارند که بسته به نیاز و شرایط مورد استفاده، باید از آنها استفاده شود.
جمع بندی
این تابع یک تابع فراخواننده است که به عنوان پارامتر ورودی به یک تابع دیگر ارسال میشود. با استفاده از callback function، میتوانید برنامه خود را قابلیت گسترش و توسعه بیشتری بدهید، به طوری که هنگامی که یک عملیات ناهمزمان انجام میشود، برنامه تنها زمانی که عملیات به پایان رسیده، به عملیات بعدی بپردازد. callback function در زبانهای برنامهنویسی مختلف، از جمله جاوااسکریپت، پایتون و C++، استفاده میشود.
در نتیجه، با استفاده از callback function در طراحی وب سایت، میتوانید کارایی و عملکرد سایت خود را بهبود بخشید. شرکت طراحی سایت شاپینگ سرور با داشتن تیمی مجرب و حرفهای در زمینه طراحی و توسعه وب سایت، میتواند با طراحی و پیادهسازی callback function مناسب، به شما کمک کند تا سایتی با کارایی بالا طراحی کنید و هدف خود را در جذب مشتریان جدید و افزایش فروش دستیابی کنید.