برنامه نویسی Functional (FP) یک الگوی برنامه نویسی است که محاسبات را به عنوان ارزیابی توابع ریاضی تلقی کرده و از تغییر state و دادههای قابل تغییر اجتناب میکند. تایپ اسکریپت که یک superset از زبان برنامه نویسی جاوااسکریپت میباشد، از برنامه نویسی Functional پشتیبانی میکند.
در این مقاله قصد داریم تا مفاهیم اصلی برنامه نویسی Functional در تایپ اسکریپت را باهم بررسی کنیم.
یک تابع Pure است اگر:
به عنوان مثال:
function add(a: number, b: number): number { return a + b; }
در برنامه نویسی Functional، پس از ایجاد دادهها نمیتوانیم آنها را تغییر دهیم. اما برای این که تغییراتی را روی دادهها اعمال کنیم، به جای اصلاح آنها، یک کپی جدید از دادهها میسازیم و تغییرات مورد نظر خود را بر روی آن اعمال میکنیم. به عنوان مثال میتوانیم از تایپ اسکریپت در آرایهها به صورت زیر استفاده کنیم:
const arr1 = [1, 2, 3]; const arr2 = [...arr1, 4]; // [1, 2, 3, 4]
در تایپ اسکریپت، توابع first-class citizenها هستند. به این معنی که میتوانند به عنوان آرگومان ارسال شوند، به عنوان مقادیر return گردند و همینطور به متغیرها اختصاص داده شوند.
به عنوان مثال:
// Map is a higher-order function const arr = [1, 2, 3]; const doubled = arr.map(x => x * 2); // [2, 4, 6]
Currying تکنیکی است که در آن تابعی که چندین آرگومان میگیرد به دنبالهای از توابع تبدیل میشود که هر کدام، یک آرگومان واحد را دریافت میکند.
مثلا:
function multiply(a: number): (b: number) => number { return (b: number) => a * b; } const double = multiply(2); console.log(double(4)); // Outputs: 8
ترکیب تابع، فرآیند ترکیب دو یا چند تابع برای تولید یک تابع جدید است. این روش راهی برای ایجاد توابع پیچیده با chain کردن توابع سادهتر به هم به حساب میآید.
به عنوان مثال:
function square(n: number): number { return n * n; } function increment(n: number): number { return n + 1; } // Compose function compose<A, B, C>(f: (b: B) => C, g: (a: A) => B): (a: A) => C { return a => f(g(a)); } const squareThenIncrement = compose(increment, square); console.log(squareThenIncrement(4)); // Outputs: 17
در حالی که این مفاهیم از نظریه category سرچشمه میگیرند، اما در حوزه برنامه نویسی Functional بسیار مهم هستند.
map
دارد.map
و flatMap
(یا bind
) را دارد.در تایپ اسکریپت، آرایهها را میتوانیم به عنوان تابع در نظر بگیریم:
const arr = [1, 2, 3]; const result = arr.map(x => x + 1); // Functor in action: [2, 3, 4]
میتوانیم Promiseهای موجود در تایپ اسکریپت را به صورت Monad مشاهده کنیم:
const promise = Promise.resolve(3); const newPromise = promise.then(x => x + 1).then(x => x * 2); // Monad in action
در این مقاله سعی کردیم اصول اولیه برنامه نویسی Functional در تایپ اسکریپت را بررسی کنیم. با در نظر گرفتن این اصول میتوانیم کدهای تمیزتر، قابل نگهداریتر و قابل پیشبینیتری بنویسیم. همچنین باید این نکته را به یاد داشته باشیم که برنامه نویسی Functional فقط پیروی از مجموعهای از قوانین نیست، بلکه اتخاذ یک طرز فکر برای حل مشکلات به روشی متفاوت میباشد.
دیدگاهها: