برنامه نویسی Functional در تایپ اسکریپت

برنامه نویسی Functional (FP) یک الگوی برنامه نویسی است که محاسبات را به عنوان ارزیابی توابع ریاضی تلقی کرده و از تغییر state و داده‌های قابل تغییر اجتناب می‌کند. تایپ اسکریپت که یک superset از زبان برنامه نویسی جاوااسکریپت می‌باشد، از برنامه نویسی Functional پشتیبانی می‌کند.

در این مقاله قصد داریم تا مفاهیم اصلی برنامه نویسی Functional در تایپ اسکریپت را باهم بررسی کنیم.

بررسی توابع Pure

یک تابع Pure است اگر:

  • برای یک ورودی مشخص، همیشه یک خروجی را return کند.
  • هیچ side effectای نداشته باشد.

به عنوان مثال:

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 و Higher-Order

در تایپ اسکریپت، توابع first-class citizenها هستند. به این معنی که می‌توانند به عنوان آرگومان ارسال شوند، به عنوان مقادیر return گردند و همینطور به متغیرها اختصاص داده شوند.

یک تابع higher-order:

  • یک یا چند تابع را به عنوان آرگومان می‌گیرد.
  • یک تابع را به عنوان نتیجه آن return می‌کند.

به عنوان مثال:

// Map is a higher-order function
const arr = [1, 2, 3];
const doubled = arr.map(x => x * 2); // [2, 4, 6]

بررسی Currying

Currying تکنیکی است که در آن تابعی که چندین آرگومان می‌گیرد به دنباله‌ای از توابع تبدیل می‌شود که هر کدام، یک آرگومان واحد را دریافت می‌کند.

مثلا:

function multiply(a: number): (b: number) => number {
    return (b: number) => a * b;
}

const double = multiply(2);
console.log(double(4));  // Outputs: 8

بررسی ترکیب Functional

ترکیب تابع، فرآیند ترکیب دو یا چند تابع برای تولید یک تابع جدید است. این روش راهی برای ایجاد توابع پیچیده با 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

بررسی Functorها و Monadها

در حالی که این مفاهیم از نظریه category سرچشمه می‌گیرند، اما در حوزه برنامه نویسی Functional بسیار مهم هستند.

  • Functor: آبجکتی است که یک متد map دارد.
  • Monad: آبجکتی است که متدهای 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 فقط پیروی از مجموعه‌ای از قوانین نیست، بلکه اتخاذ یک طرز فکر برای حل مشکلات به روشی متفاوت می‌باشد.

دیدگاه‌ها:

افزودن دیدگاه جدید