0Pricing
JavaScript Academy · درس

النمط الخالي من الوسائط

ركّبوا الدوال دون تسمية الوسائط.

النمط الخالي من الوسائط درس مجاني في JavaScript Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في JavaScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة JavaScript Academy 4 دروس في المجموع.

ما أسلوب Point-free

يعرّف أسلوب Point-free، أو الأسلوب الضمني، الدوال من خلال دمج دوال أخرى، دون ذكر وسيطاتها. وتكون الوسيطات هي النقاط الضمنية التي يجري تمريرها.

function double(n) { return n * 2; }
const nums = [1, 2, 3];
// pointed: argument named explicitly
console.log(nums.map((n) => double(n))); // [2, 4, 6]
// point-free: no named argument
console.log(nums.map(double));            // [2, 4, 6]

تمرير الدوال مباشرةً

عندما يمرر الاستدعاء اللاحق وسيطه ببساطة إلى دالة أخرى، يمكنك تمرير تلك الدالة باسمها بدلًا من تغليفها.

const len = (s) => s.length;
const words = ["a", "bb", "ccc"];
console.log(words.map((w) => w.length)); // pointed: [1, 2, 3]
console.log(words.map(len));             // point-free: [1, 2, 3]

تركيب الدوال

يعتمد أسلوب Point-free على التركيب، أي بناء دالة جديدة بتمرير ناتج إحدى الدوال إلى الدالة التالية.

const compose = (f, g) => (x) => f(g(x));
const inc = (n) => n + 1;
const double = (n) => n * 2;
const incThenDouble = compose(double, inc);
console.log(incThenDouble(3)); // (3+1)*2 = 8

دالة مساعدة باسم pipe

تُقرأ pipe من اليسار إلى اليمين، وهو ما يجده كثيرون أوضح من compose. وتطبّق الدوال بالترتيب.

const pipe = (...fns) => (x) => fns.reduce((acc, f) => f(acc), x);
const inc = (n) => n + 1;
const double = (n) => n * 2;
const f = pipe(inc, double);
console.log(f(3)); // 8

بناء خطوط المعالجة

باستخدام pipe، يمكنك التعبير عن تحويل متعدد الخطوات بوصفه دالة مسماة دون تسمية البيانات مطلقًا.

const pipe = (...fns) => (x) => fns.reduce((a, f) => f(a), x);
const trim = (s) => s.trim();
const lower = (s) => s.toLowerCase();
const clean = pipe(trim, lower);
console.log(clean("  HELLO  ")); // "hello"

يتيح Currying أسلوب Point-free

يحوّل Currying الدالة متعددة الوسيطات إلى سلسلة من الدوال أحادية الوسيط. وينتج عن ذلك دوال أحادية جاهزة للتركيب.

const multiply = (a) => (b) => a * b;
const triple = multiply(3);
console.log([1, 2, 3].map(triple)); // [3, 6, 9]

التطبيق الجزئي

يؤدي تثبيت بعض الوسيطات مسبقًا إلى إنتاج دالة متخصصة يمكنك تمريرها مباشرةً، وهو مسار آخر إلى شيفرة Point-free.

const add = (a, b) => a + b;
const add10 = add.bind(null, 10);
console.log([1, 2, 3].map(add10)); // [11, 12, 13]

تركيب الدوال الشرطية

يمكنك بناء دوال مساعدة منطقية من بعضها لإنشاء عوامل تصفية نظيفة بأسلوب Point-free، دون ضوضاء دوال السهم المضمّنة.

const isEven = (n) => n % 2 === 0;
const negate = (fn) => (x) => !fn(x);
const isOdd = negate(isEven);
console.log([1, 2, 3, 4].filter(isOdd)); // [1, 3]

مقايضات قابلية القراءة

قد يكون أسلوب Point-free أنيقًا، لكنه يصبح غامضًا إذا أفرطت في استخدامه. استخدمه عندما يوضح المقصود، مثل map(double)، واذكر الوسيط صراحةً عندما يساعد ذلك على الفهم.

const names = ["ada", "bob"];
console.log(names.map((n) => n.toUpperCase())); // ["ADA","BOB"]

مشكلة مرجع الأسلوب

قد يؤدي تمرير أسلوب باسمه إلى فقدان قيمة this. غلّفه أو اربطه عندما تعتمد الدالة على سياق كائن.

const calc = {
  factor: 2,
  scale(n) { return n * this.factor; }
};
console.log([1, 2].map(calc.scale.bind(calc))); // [2, 4]

تركيب تحويلات واقعية

عند جمع هذه الأفكار، تمنحك الدوال الصغيرة المسماة والمركبة في خط معالجة تدفقًا تصريحيًا للبيانات، قابلًا للاختبار، وبأسلوب Point-free.

const pipe = (...fns) => (x) => fns.reduce((a, f) => f(a), x);
const toNums = (arr) => arr.map(Number);
const onlyPos = (arr) => arr.filter((n) => n > 0);
const sum = (arr) => arr.reduce((a, n) => a + n, 0);
const process = pipe(toNums, onlyPos, sum);
console.log(process(["3", "-1", "4"])); // 7

تحقق سريع

أسلوب Point-free.

مراجعة

يبني أسلوب Point-free الدوال من خلال تركيب دوال أخرى دون تسمية الوسيطات. مرّر الدوال بالمرجع، مثل map(double)، وركّبها باستخدام compose/pipe، واستخدم Currying أو التطبيق الجزئي لإنشاء دوال أحادية الوسيط. انتبه إلى فقدان this عند تمرير مراجع الأساليب، واذكر الوسيط صراحةً عندما تكون القراءة أوضح.

الأسئلة الشائعة

هل درس «النمط الخالي من الوسائط» مجاني؟

نعم — نص درس «النمط الخالي من الوسائط» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة JavaScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة JavaScript Academy 4 دروس في المجموع.

ماذا ستتعلم في «النمط الخالي من الوسائط»؟

ركّبوا الدوال دون تسمية الوسائط. تتمرن على JavaScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ JavaScript Academy؟

لا تُشترط خبرة سابقة. JavaScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «النمط الخالي من الوسائط»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس JavaScript Academy هذا؟

نعم. كل درس في JavaScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الدوال النقية والآثار الجانبية
  2. تحويل البيانات بطريقة تصريحية
  3. تجنّب التعديل المباشر
  4. النمط الخالي من الوسائط
← العودة إلى JavaScript Academy