قسمت دوم - مفاهیم و الگوهای برنامه نویسی تابعی (Functional) در جاوااسکریپت

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

https://virgool.io/@amini.hooman/%D9%85%D9%81%D8%A7%D9%87%DB%8C%D9%85-%D9%88-%D8%A7%D9%84%DA%AF%D9%88%DB%8C-%D9%87%D8%A7%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%AA%D8%A7%D8%A8%D8%B9%DB%8C-functional-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-hkn5rmvuwnl5


تغییر ناپذیری (Immutability)

مطلب بعدی که جهت جلوگیری از پیچیدگی کد دربرنامه نویسی تابعی در جاوااسکریپت رعایت می کنیم تغییر ناپذیری است به این معنی که داده‌‌ها و یا وضعیت ها بعد از ایجاد آن ها، به دلیل امکان ایجاد پیچیدگی در کد و امکان تاثیر پذیری بر جای دیگر برنامه و مختل کردن جریان وضعیت داده ها، آن ها را تغییر نمی دهیم و اگر نیاز به تغییر وضعیت داشتیم یک رونوشت از وضعیت یا داده قبلی می گیرم (یا به عبارتی Save As می نماییم) و آن را تغییر می دهیم و از این به بعد با رونوشت دیتای قبلی کار می کنیم و از آنجایی که به هیچ عنوان داده ای را تغییر نداده ایم می توانیم در نرم افزاریمان قابلیت Undo/Redo را داشته باشیم.

برای روشن شدن مطلب، همانطور که می دانید در جاوااسکریپت آرایه ها و آبجکت ها با Reference تغییر پیدا می کنند به مثال ذیل توجه کنید.

const a = [1,7,3,2];
console.log(a);  //[1, 7, 3, 2]
const b =a.sort();
console.log(b);  //[1, 2, 3, 7]
console.log(a);  //[1, 2, 3, 7]

همانطور که می بینید با وجود اینکه ما متغییر b را تغییر داده ایم متغییر a نیز تغیییر پیدا کرده است و دلیل آن این است که در جاوااسکریپت a , b در حافظه به یکجا اشاره می کنند و یا Reference آنها یکی است و تغیر یکی بر دیگری نیز اثر می گذارد.

برای رفع این مشکل ما می توانیم به راحتی با استفاده از spreed operator در ES6 همانطور که در بالا گفتیم کپی از داده اولیه بگیرم و مرتب سازی را روی کپی آن به صورت زیر انجام بدهیم.

const a = [1,7,3,2];
console.log(a);//[1, 7, 3, 2]
const b =[...a].sort();
console.log(b); //[1, 2, 3, 7]
console.log(a);//[1, 7, 3, 2]

البته لازم بذکر است این کار ممکن است که روی کارایی سیستم ما تاثیر بگذارد اما کتابخانه ها و ابزاری وجود دارند از جمله ریداکس و یا Immutable.js که کارایی را برای تضمین می کنند که البته از حوصله این گفتار خارج است و وقتی داده ها کم است این روش مناسب است.




قابلیت دیگری که می توانیم در برنامه نویسی تابعی از آن استفاده کنیم این است که می توانیم یک فانکشن را در داخل یک فانکشن دیگر بدون محدودیت قرار دهید.

function executeFunctions(x, y) {   
const add = (x, y) => x + y;  
 const subtract = (x, y) => x — y;  
 console.log(`sum: ${add(x,y)}`);   
console.log(`difference: ${subtract(x,y)}`);
}

این قسمت را اینجا تمام می نماییم و در قسمت بعدی به الگوهای بسیار کاربردی برنامه نویسی تابعی از جمله Higer Order Function، مپ و سایر موارد می پردازیم.